Thông báo

Collapse
No announcement yet.

I2C, chúng ta cùng thảo luận!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • I2C, chúng ta cùng thảo luận!

    I2C là một chuẩn truyền thông k/c gần giữa các device, bản mạch.. được dùng càng ngày càng rộng rãi. Nó có 2 dây kết nối: SDA(serial data) và SCL(serial clock). Chân SDA là chân 2 hướng và được định nghĩa bởi thiết bị Master. Các thiết bị ngày nay như: NVRAM, LCD,KEYPAD, LED MATRIX,ADC,DAC... gần như tất cả đều hướng tới dùng chuẩn này. Tốc độ I2C ngày càng cao và có thể lên đến vào Mbit/s. Nhờ chuẩn này mà việc thiết kế trở nên gọn nhẹ hơn, giảm thiểu khối lượng công việc cho MCU master... khó mà nói hết được tác dụng của nó đưa lại.
    Đối với các device ko support I2C như AT89C51 thì việc lập trình chuẩn I2C lấy phần mềm thay phần cứng tốn rất nhiều tài nguyên của MCU. Người ta thường lập trình kiểu từng bit nối tiếp để làm 1 thời lượng công việc này.
    Hầu hết PIC có support I2C, em cũng có lần lập trình bằng CCS cho PIC, nhưng làm xong nó chạy nhưng ko hiêu được về chuẩn này bởi lẽ dùng thư viện có sẵn của CCS nên cứ thế mà làm. Vậy qua đây, mong các cao thủ đi trước chỉ giáo?
    -------------------

  • #2
    Đây là một ví dụ mãu về giao tiếp I2C MASTER với module SRF0

    Đây là một ví dụ mãu về giao tiếp I2C MASTER với module SRF08
    //http://www.robot-electronics.co.uk/htm/using_the_i2c_bus.htm
    Chương trình này chỉ nên sử dụng với PIC ko tích hợp sẵn phần I2C. Có thể sửa đổi tương tự cho AT89C51...
    #include<pic.h>
    //__CONFIG(UNPROTECT & WDTEN & HS & PWRTEN & BOREN & LVPDIS & DUNPROT & DEBUGDIS);
    #define SCL TRISB4 // I2C bus
    #define SDA TRISB1 //
    #define SCL_IN RB4 //
    #define SDA_IN RB1 //
    //--------------------------------------------------------
    void i2c_start(void);// send start sequence
    void init(void);
    void i2c_stop(void);// send stop sequence
    unsigned char i2c_rx(char ack);
    bit i2c_tx(unsigned char d);
    void i2c_dly(void);
    //-------------------------------Ham main
    void main()
    {
    unsigned char lightsensor,rangelow,rangehigh;
    while(1)
    {
    i2c_start(); // send start sequence
    i2c_tx(0xE0); // SRF08 I2C address with R/W bit clear
    i2c_tx(0x01); // SRF08 light sensor register address
    i2c_start(); // send a restart sequence
    i2c_tx(0xE1); // SRF08 I2C address with R/W bit set
    lightsensor = i2c_rx(1); // get light sensor and send acknowledge. Internal register address will increment automatically.
    rangehigh = i2c_rx(1); // get the high byte of the range and send acknowledge.
    rangelow = i2c_rx(0); // get low byte of the range - note we don't acknowledge the last byte.
    i2c_stop(); // send stop sequence
    }
    }
    //--------------------------------------------------------
    void i2c_start(void)
    {
    SDA = 1; // i2c start bit sequence
    i2c_dly();
    SCL = 1;
    i2c_dly();
    SDA = 0;
    i2c_dly();
    SCL = 0;
    i2c_dly();
    }
    //--------------------------------------------------------
    void i2c_stop(void)
    {
    SDA = 0; // i2c stop bit sequence
    i2c_dly();
    SCL = 1;
    i2c_dly();
    SDA = 1;
    i2c_dly();
    }
    //--------------------------------------------------------
    unsigned char i2c_rx(char ack)
    {
    char x, d=0;
    SDA = 1;
    for(x=0; x<8; x++) {
    d <<= 1;
    do {
    SCL = 1;
    }
    while(SCL_IN==0); // wait for any SCL clock stretching
    i2c_dly();
    if(SDA_IN) d |= 1;
    SCL = 0;
    }
    if(ack) SDA = 0;
    else SDA = 1;
    SCL = 1;
    i2c_dly(); // send (N)ACK bit
    SCL = 0;
    SDA = 1;
    return d;
    }
    //--------------------------------------------------------
    bit i2c_tx(unsigned char d)
    {
    char x;
    static bit b;
    for(x=8; x; x--) {
    if(d&0x80) SDA = 1;
    else SDA = 0;
    SCL = 1;
    d <<= 1;
    SCL = 0;
    }
    SDA = 1;
    SCL = 1;
    i2c_dly();
    b = SDA_IN; // possible ACK bit
    SCL = 0;
    return b;
    }
    //--------------------------------------------------------
    void i2c_dly(void)
    {
    //Only delay
    }

    Dưới đây là hình minh họa
    Attached Files

    Comment


    • #3
      Nếu viết cho PIC = CCS thì các hàm đã lập sẵn cho I2C kể cả MASTER và SLAVER, sau đây là mã lệnh cho MASTER:

      #use I2C(master, sda=PIN_C4, scl=PIN_C3, fast)
      void main()
      {
      int8 i;
      while(1)
      {
      i2c_start();
      i2c_write(i);
      .......
      i2c_stop();
      }
      }

      Trong CCS có viết khá rõ, nếu ai quan tâm, tới PIC và CCS thì tìm hiểu thêm.

      Comment


      • #4
        Để tìm hiểu về chuẩn I2C, nên vào trang web của Philip, nơi cha sinh mẹ đẻ của nó,,,
        Work is glory

        Comment


        • #5
          Theo chủ đề, em rất muốn các bác giúp em một tay xây dựng cái tutorial về I2C, sâu khi xây dựng xong thì chúng ta bắt tay vào việc lập trình với PIC, vơi' 89, dùng I2C bằng phần mềm(Nếu MCU đó ko hỗ trợ như 89C51, PIC đời thấp) hoặc = cứng nếu MCU có hỗ trợ(ví dụ PIC16F87xa)....

          Comment


          • #6
            I2C thường có 2 chân:
            1- SCL(Serial clock), chân này do con master phát ra. Là chân xung nhip để đồng bộ thu/phát.
            2- SDA(Serial data), chân này 2 hướng, có thể master hoặc slaver, nó được đồng bộ bởi chân SCL.

            Ngoài ra đương nhiên phải có chân GND nữa là đương nhiên. Nếu kết nối giữa các bản mạch thi có thêm chân cấp nguồn VDD nữa.

            Cả 2 SCL và SDA đều kiểu "Open drain"(giống như Open colector). Bởi thế nhất thiết phải có điện trở Pull up kéo lên VDD. Nếu ko thì chi out được mức thấp, chứ mức cao ko có tác dụng-->I2C ko làm việc được. Điện trở kéo lên VDD thông thường từ 1.8K--->47K. Giá trị được nhà thiết kế khuyên dùng là 1.8K. Ta nên theo phương án này.

            Comment


            • #7
              Vấn đề tốc độ:
              Thông thường thì tốc độ I2C là 100Khz. Quy định tốc độ là tốc độ của chân SCL. Và thông thường người ta hay dùng tốc độ <= này.
              Ngoài ra Philips còn đưa ra tốc độ:
              +Fast mode: lên tới 400 Khz.
              +Hight mode: lên tới 3.4 Mhz
              Còn nếu các bác dùng 89C51 làm thủ công thì tốc độ làm bằng phần mềm thấp. Phải làm mấy động tác sau cho it nhất môi nhịp.
              SDA=data;
              SCL=0;
              SCL=1;
              Ngoài ra thêm các lệnh rẽ nhánh nưa nên với thạch anh 24 mhz sẽ có thể đạt được tốc độ 100 khz, nhưng có lẽ ko đạt được 400khz. Nhưng như thê là OK hầy hết ứng dụng rùi
              Một số PIC16 thì có phần cứng hỗ trợ I2C, có thể đạt đươc 400Khz(nếu ko nhầm). Còn PIC18 trở lên thì em chưa đọc.

              Mong các bác tiếp tuc viêt về Protocol I2C bus

              Comment


              • #8
                Re

                Tui dùng chuẩn I2C giao tiếp 2 con ATMega16 với nhau thì bình thường nhưng khi giao tiếp với 3 con thì bắt đầu xảy ra xung đột làm cho con này bị treo luôn. Bác nào biết cách phân xử Bus giúp tôi với.

                Comment


                • #9
                  Các bác bàn bạc về I2C -- Nhờ xem giúp tại hạ viết cái này đã đúng chưa ( data shift register - cũng na ná như I2C - thiếu mỗi ACK ).
                  Vào đây :
                  http://www.dientuvietnam.net/board/s...p?t=616&page=2

                  ( giao tiếp 89C52 với TSA5520 )
                  Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                  Comment


                  • #10
                    Hy vọng giúp được chút gì cho bạn. Nếu design của bạn chỉ dùng Single master thì dùng file "Main_S_Master" cho Main, còn nếu design của bạn chỉ dùng Multi_Master thì dùng file "Main_M_Master". Chú ý: Device tui đang dùng là 87C552 nên bạn phải thay đổi dòng "$include" file cho phù hợp với design của bạn.



                    Warning:Đây là cái tui viết để test nên có một số routine không cần thiết và có thể còn có bug trong đó, nên bạn phải cẩn thận khi dùng và modify lại cho phù hợp với design của bạn. Tui hoàn toàn không chịu trách nhiệm về những gì do chương trình này gây ra. Use it at your own risk.

                    Comment


                    • #11
                      Sao ko thấy các đại ca viết tiếp nhỉ?
                      Đang thấy hay!
                      Em đọc mấy cái của Phillip nhưng có 1 số thuật ngữ ko hiểu...hic
                      Thien thu van co: Yeu la kho!!!
                      Van co thien thu: Kho van yeu!!!!!!!!!!!!!!!!!!!!!!

                      Comment


                      • #12
                        em toàn thấy các bác viết về I2C cho PIC không hà.Có bác nào viết cho họ 89lpc9xx chưa?Em đang rất cần nó để tham khảo.

                        Comment


                        • #13
                          Viết cho PIC hay cho vi điều khiển nào cũng thế thôi, chỉ cần dựa trên ngôn ngữ c, bạn chuyển sang vi điều khiển của bạn bởi việc khai báo lại các biến thế là OK.
                          Ah quên. PIC có hỗ trợ I2C rồi, nếu bạn muốn code chương trình viết bởi 89c51 thì liên hệ với tôi. he he
                          Last edited by blackmoon; 06-09-2006, 13:20.
                          CUNG CẤP PSOC, MẠCH NẠP
                          CHUYỂN ĐỔI USB <-> RS485 AutoBaud
                          RS232 <-> RS485 MultiBaud
                          MẠCH NẠP USBPPI S7-200
                          Mobile: 0906076116
                          Email:

                          Comment


                          • #14
                            Chủ đề về I2C là rất hay đó. Mình cũng đã từng làm một số thiết kế về chuẩn giao tiếp này và nói chung rất OK! I2C là một chuẩn giao tiếp do Philips định nghĩa, nên như bác nào trên diễn đàn đã nói nên vào nơi cha sinh mẹ đẻ của nó đọc thì dễ hiểu và đầy đủ hơn. Tuy nhiên, trước mắt mình muốn giới thiệu cùng những bạn chưa biết sơ lược về chuẩn này:
                            - Chuẩn giao tiếp I2C là một giao tiếp giữa một thiết bị master với 1 hoặc nhiều thiết bị slaver trên cùng một bus 2 dây, dây dữ liệu (SDA) và dây đồng hồ đồng bộ (SCL). Thông thường I2C bus là "open drain", nên bạn cần mắc các điện trở pull-up cho hai dây này lên +VCC, giá trị thông thường là 2.2K.
                            - Trong các thiết bị slaver có sử dụng chuẩn giao tiếp I2C bao giờ cũng có các chân địa chỉ phần cứng (3 chân địa chỉ là điển hình nhất!).
                            - Trong truyền dẫn I2C có các bít điều kiện đánh dấu là START và STOP để Master thông báo cho Slaver biết lúc nào là bắt đầu đường truyền và khi nào là kết thúc đường truyền. Ngoài ra sau mỗi byte dữ liệu truyền sẽ có một bít xác nhận ACK nếu tín hiệu nhận thành công, và NAK nếu tín hiệu nhận không thành công.
                            - Truyền dẫn của chuẩn I2C là hai hướng nhưng đơn công, nghĩa là đang truyền thì không nhận và đang nhận thì không truyền. Quá trình truyền dẫn trong chuẩn I2C có thể bao gồm các quá trình cơ bảo sau: Ghi, Đọc ngẫu nhiên và Đọc không ngẫu nhiên (Thuật ngữ "Ghi", "Đọc" là hướng từ Master).
                            - Về tốc độ, có hai tốc độ được định nghĩa phổ biến là 100K và 400K. Với các ứng dụng thông thường, hay dùng 100K.
                            - Khi sử dụng các laọi chip có sẵn block I2C Controller thì việc viết chương trình truyền nhận dữ liệu qua I2C sẽ dễ dàng hơn rất nhiều. Với các bạn sử dụng họ AT89x thì phải định nghĩa và viết các sub-prog cho truyền nhận kiểu này nên sẽ vất vả hơn đôi chút. Nhưng các bạn có thể sử dụng các ngôn ngữ lập trình bậc cao có hỗ trợ về lập trình thông qua I2C thì sẽ đỡ tốn thời gian hơn rất nhiều đấy, như Bascom51 chẳng hạn.
                            Chúc các bạn sớm thực hiện được chương trình.
                            Hà Nội của ta
                            Thủ đô yêu dấu
                            Một thời đạn bom, một thời hòa bình...:cafe:

                            Comment


                            • #15
                              Bác nào có thể cho em code tham khảo khi viết I2C cho Slave(sử dụng 8051) được không ?
                              Tham khảo trên mạng toàn là code cho Master không à .

                              Comment

                              Về tác giả

                              Collapse

                              CHIBANG Tìm hiểu thêm về CHIBANG

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X