Trang

Thursday, May 29, 2014

Bài 8.(MSP430_Basic) I2C USCI



            I2C là một chuẩn truyền thông đa chip chủ được sử dụng khá phổ biến trong rất nhiều thiết bị như bộ nhớ,bộ chuyển đổi ADC,DAC,đồng hồ thời gian thực… Ưu điểm của chuẩn I2C là tốc độ khá cao (400Khz max) ,cho phép nhiều chip Master trên cùng 1 mạng I2C.Có địa chỉ nên sử dụng được rất nhiều thiết bị trong cùng 1 mạng(128 thiết bị với đường địa chỉ 7bit hoặc 1024 thiết bị với đường địa chỉ 10bit).

Trước hết trước khi bắt đầu các bạn nếu chưa có datasheet của dùng MSP430 thì có thể download tại đây : http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=slaa559&fileType=pdf .
 Lưu ý Datasheet vẫn luôn là tài liệu quan trọng nhất khi bạn tiếp cận bất cứ dòng vi điều khiển nào , nên việc thành thạo tiếng Anh và khả năng đọc Datasheet vẫn là quan trọng nhất. 
Tài liệu được viết cho MSP430G2553,các chip khác có module khác mã sẽ không sử dụng được thư viện đi kèm.

1.        Giới thiệu chung Module I2C_USCI
1.1.              Giới thiệu sơ lược về chuẩn giao tiếp I2C:
-       I2C là một  loại bus ngoại vi được phát triển bởi hãng Philip
-       Nguồn cung cấp cho giao tiếp I2C thường là 5v hoặc 3.3v
-       I2C là giao tiếp được thực hiện trên hai đường dây: SCL và SDA
o   SCL:Dây truyền xung clock từ master đến slave
o   SDA:Dây truyền dữ liệu theo 2 chiều
-       Do trên bus i2c chỉ có 2 dây mà có thể gắn kết nhiều thiết bị nên cần phân biệt các thiết bị bằng địa chỉ
-       Trên bus i2c ko thể kết nối 2 thiết bị có cùng địa chỉ.


Phân loại thiết bị trên I2C
-       Các thiêt bị gắn trên bus i2c được chia ra làm 2 thành phần chính là master hoặc slave.
o   Thông thường trên bus i2c chúng ta sẽ có một chip vi điều khiển đóng vai trò master(đóng vai trò điều phối thông tin).
o   Trên bus i2c các cảm biến, bộ nhớ ngoài,adc,…. thường đóng vai trò là slave,trên bus i2c có thể co nhiều con slave
Chế độ hoạt động:
-       Một master – Một slave.
-       Một master – Nhiều slave.
-       Nhiều master – Nhiều slave. 
Tốc độ hoạt động:
-       Chế độ chậm: 10 kbit/s.
-       Chế độ cơ bản: 100 kbit/s.
-       Chế độ nhanh 1: 400 kbit/s.
-       Chế độ nhanh 2: 1 Mbit/s.
-       Chế độ tốc độ cao: 3.4 Mbit/s.

Quá trình truyền dữ liệu trên bus i2c.
-       Chế độ truyền dữ liệu:
o   Để bắt đầu truyền dữ liệu master tạo sườn xuống ở chân SDA trong khi SCL ở mức 1.
o   Sau khi SDA xuống mức 0 một khoảng thời gian ngắn thì SCL cũng xuống mức 0 và bắt đầu quá trình truyền dữ liệu.
o   Dữ liệu được truyền trên bus I2C theo từng bit  tại mỗi cạnh lên của xung Clock.
o   Để kết thúc truyền dữ liệu master tạo sườn lên ở chân SDA trong khi SCL ở mức 1.




           1.2.                Module I2C USCI

Module I2C mình giới thiệu trong bài này thuộc loại USCI ( The universal serial communication interface) cung cấp giao tiếp truyền thông đa mode . Các module USCI hơn hẳn module USI ở khả năng lập trình mềm dẻo cho phép hoạt động với nhiều chức năng hơn.Một chip cũng có thể có nhiều module USCI cho phép hoạt động đồng thời ,được ký hiệu thành USCI_A0 ,USCI_Bx…
Chú ý các module:   
-       USCI_Ax hỗ trợ các module : UART ,SPI
-       USCI_Bx hỗ trợ các module : I2C , SPI
Module I2C USCI cung cấp giao tiếp giữa MSP430 và các thiết bị dùng giao tiếp I2C theo chuẩn I2C 2 dây.Đặc điểm nổi bật của I2C USCI :
-          7-bit hoặc 10-bit địa chỉ giao tiếp                 
-          Giao tiếp qua 2 chân SDA và SCL
-          Chế độ giao tiếp đa Master
-          Chế độ Slaver truyền nhận
-          Hỗ trợ tốc độ giao tiếp từ 100kbps tới 400kbps
-          Thiết kế tối ưu hóa năng lượng
-          Tự động khởi động từ chế độ tiết kiệm pin LPMx khi  ở chế độ Slave

Sơ đồ khối module I2C



          Module I2C hỗ trợ cả thiết bị Slave hoặc Master I2C .Giao tiếp I2C yêu cầu các thiết bị đều phải có địa chỉ duy nhất và phải được cài đặt sẵn vai trò Master hay slave .Nhiều thiết bị có thể đặt vai trò Master,nó sẽ đóng vai trò tạo xung đồng bộ SCL,tuy nhiên khi có nhiều Master thì phải có đồng bộ xung SCL.Thông thường các mạng I2C phải được mắc thêm điện trở kéo lên như hình dưới nhưng mạng có MSP430 được nhà sản xuất đề xuất không cần lắp thêm điện trở này(Có thể trong chip đã thiết kế sẵn điện trở kéo lên rồi).

          Trong sơ đồ chân của từng chip có ký hiệu pin dành cho giao tiếp I2C,ví dụ như UCB0SDA(P1.7) và UCB0SCL(P1.6) trong chip MSP430G2553.Khi muốn kết nối I2C giữa MSP430 và một thiết bị nào đó chúng ta chỉ cần nối 2 chân SDA và SCL của thiết bị với MSP430,nối chân đất và nguồn.Chú ý điện áp nguồn cấp của thiết bị đó.



2.        Khởi tạo và Reset
Module USCI reset khi set bit UCSWRST hoặc có lệnh reset hệ thông PUC(sẽ set bit UCSWRST) .Để chọn chức năng I2C bit UCMODEx=11 (UCBxCTL1) .Set bit UCSWWRST sẽ gây ra :
-          Dừng giao tiếp I2C.
-          Pin SCL và SDA ở trạng thái cao trở
-          UCBxI2CSTAT,bit 6-0 clear
-          UCBxTXIE và UCBxRXIE clear
-          UCBxTXIFG và UCBxRXIFG clear
Khi muốn sử dụng I2C thì nhất thiết phải khởi tạo thông số cho các thanh ghi I2C . Các bước khi khởi tạo Module I2C:
-          Set bit UCSWWRST =1 trong UCxCTL1 để chọn chức năng I2C cho Module USCI_x
-          Chọn chức năng giao tiếp ngoại vi cho các Pin SCL và SDA ở thanh ghi PxSEL
-          Chọn địa chỉ của chip
-          Chọn tần số giao tiếp
-          Xóa bit UCSWRST ->0
-          Cho phép ngắt UCxRXIE hoặc/và UCxTXIE
Ví dụ sau mình cài đặt cho module USCI_B trên 2 chân P1.6 và P1.7 chế độ Master ,dùng nguồn xung clock là SMCLK, có tốc độ 100ksps , địa chỉ của slave được set trong biến addr.

void I2C_USCI_Init(unsigned char addr)
{
            P3SEL |= BIT1 + BIT2;                     // Assign I2C pins to USCI_B0
            //P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
            P3DIR&=~(BIT1+BIT2);
            P3OUT|=(BIT1+BIT2);
            P3REN|=BIT1+BIT2;
            UCB0CTL1 |= UCSWRST;                      // Enable SW reset
            UCB0CTL0 = UCMST+UCMODE_3+UCSYNC;         // I2C Master, synchronous mode
            UCB0CTL1 = UCSSEL_2+UCSWRST;              // Use SMCLK, keep SW reset
            UCB0BR0 = 40;                             // fSCL = SMCLK/40 = ~400kHz
            UCB0BR1 = 0;
            UCB0I2CSA = addr;                         // Set slave address
            UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
}

3.        Chế độ Master
Đây là chế độ rất hay được sử dụng khi đọc các cảm biến đơn giản,khi đó MSP430 sẽ cấp xung clock đồng bộ và tín hiệu điều khiển.Trong khi chế độ Slave dùng khi giao tiếp với các thiết bị phức tạp có khả năng làm master hoặc với VĐK khác.
Một chú ý là khung truyền I2C không giống nhau hoàn toàn với mọi thiết bị,một số có sự thay đổi nhỏ so với thông thường.Địa chỉ thiết bị có thể là 7bit hoặc 10bit,các thiết bị như cảm biến,IC chuyên dụng thường chỉ có 1 hoặc vài địa chỉ nhất định.Ví dụ DS1307 có địa chỉ cố định là 0x68,có nghĩa là trong 1 mạng I2C chỉ được phép có 1 IC loại này.Các vi điều khiển chẳng hạn thì cho phép tùy ý đánh địa chỉ I2C cho nó.Một vài dòng VĐK khi ghi địa chỉ slave phải ghi 8bit gồm 7 bit địa chỉ và 1 bit R/W để set quá trình đọc hay ghi vào slave,tuy nhiên ở MSP430 thì không cần.
Khung truyền với đường địa chỉ 7bit



Khung truyền với đường địa chỉ 10bit

3.1.               Chế độ Master Transmitter
Sao khi khởi tạo,chế độ Master Transmitter được khởi tạo.Do msp430 hỗ trợ chế độ đa chip chủ,nên khung truyền sẽ rất phức tạp,để đơn giản mình chỉ trình bày giao tiếp với msp430 là Master và các chip slaver.
Khung truyền Transmmitter



Khung truyền đơn giản hóa

Các thủ tục khi viết chương trình :

-       Master gửi tín hiệu start.
-       Master gửi 7 bit địa chỉ thiết bị slave và bit write(bit 0) cuối cùng.( Không cần viết code vì msp430 tự động lấy địa chỉ trong thanh ghi địa chỉ Slave UCB0I2CSA ).
-       Slave nhận được 8 bit ở trên thi gửi trả tin hiệu ACK(bit 0) .
-       Master nhận được tín hiệu ACK thì master gửi di 8 bit địa chỉ của thanh ghi có trong con slave.
-       Sau khi nhận 8 bit địa chỉ thi slave gửi trả bit ACK.
-       Sau khi nhận bit ACK master gửi đi 8 bit dữ liều cần ghi.
-       Sau khi nhận 8 bit dữ liệu slave sẽ gửi lại bit ACK để xác định đã nhận dữ liệu.
-       Nếu muốn ghi tiếp thì master gửi tiếp 8 bit, còn nếu muốn kết thúc thì master gửi tín hiệu stop(SP).




unsigned char I2C_USCI_Write_Byte(unsigned char address, unsigned char data)
{
            while (UCB0CTL1 & UCTXSTP);             // Cho den khi tin hieu STT duoc gui xong
            UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, Gui bit START

            while (!(IFG2&UCB0TXIFG));                                        // Cho cho bit START gui xong
            if(UCB0STAT & UCNACKIFG) return UCB0STAT; //Neu bao loi thì thoat khoi ham
            UCB0TXBUF = address;                                                 // Gui dia chi thanh ghi can ghi


            while (!(IFG2&UCB0TXIFG));                                        // Cho gui xong
            if(UCB0STAT & UCNACKIFG) return UCB0STAT; //Neu bao loi thì thoat khoi ham
            UCB0TXBUF = data;                                                                  // Gui du lieu

            while (!(IFG2&UCB0TXIFG));                                        // Cho gui xong
            if(UCB0STAT & UCNACKIFG) return UCB0STAT; //Neu bao loi thì thoat khoi ham
            UCB0CTL1 |= UCTXSTP;                    // Gui bit STOP
            IFG2 &= ~UCB0TXIFG;                     // Xoa co USCI_B0 TX
            return 0;
}


3.2.              Chế độ Master Receiver
Khi MSP430 muốn đọc dữ liệu từ thanh ghi nào đó của chip Slave thì sẽ hoạt động ở trạng thái này.

Khung truyền chế độ Receiver 

Khung truyền đơn giản hóa

Giải thích khung truyền :
-          Master gửi tín hiệu start.
-          Master gửi 7 bit địa chỉ thiết bị slave và bit write(bit 0) cuối cùng .( Không cần viết code vì msp430 tự động lấy địa chỉ trong thanh ghi địa chỉ Slave UCB0I2CSA).
-          Slave nhận được 8 bit ở trên thi gửi trả tin hiệu ACK(bit 0).
-          Master nhận được tín hiệu ACK thì master gửi đi 8 bit địa chỉ của thanh ghi có trong slave.
-          Sau khi nhận 8 bit địa chỉ thì slave gửi trả bit ACK.
-          Sau khi nhận bit ACK master gửi tin hiệu restart rồi gửi lại địa chỉ thiết bị một lần nữa cùng bit read(bit 1).
-          Sau khi nhận 8 bit trên thi slave gửi trả bit ACK và ngay sau đó gửi 8 bit data.
-          Nếu master muốn đọc tiếp dữ liệu thì sẽ gửi tiếp bit ACK và slave se gửi tiếp 8 bit luôn mà ko cần tín hiệu ACK ở trước nữa.
-          Nếu ko muốn đọc dữ liệu nữa thì master sẽ gửi bit NACK(bit 1)sau đó gửi tín hiệu stop.

unsigned char I2C_USCI_Read_Byte(unsigned char address)
{          
            while (UCB0CTL1 & UCTXSTP);                         // Cho tin hieu I2C STT duoc gui di
            UCB0CTL1 |= UCTR + UCTXSTT;                       // I2C TX,START

            while (!(IFG2&UCB0TXIFG));                                                    // Cho gui xong
            UCB0TXBUF = address;                         // Dia chi luu gia tri Seconds

            while (!(IFG2&UCB0TXIFG));                                                    // Cho gui xong

            UCB0CTL1 &= ~UCTR;                      // I2C RX
            UCB0CTL1 |= UCTXSTT;                    // I2C RESTART
            IFG2 &= ~UCB0TXIFG;                     // Xoa co ngat USCI_B0 TX

            while (UCB0CTL1 & UCTXSTT);             // Cho den khi I2C STT duoc gui di
            UCB0CTL1 |= UCTXSTP;                    // Gui bit STOP
            return UCB0RXBUF;
}

Chế độ Slave sẽ được đề cập trong phần MSP430_Advance
Download thư viện mẫu : I2C_USCI.h
Ví dụ mẫu :
-    Giao tiếp cảm biến MPU6050 : http://thuanbk55.blogspot.com/2014/03/giao-tiep-msp430g2553-va-cam-bien.html 
-    Đọc IC DS1307 : MSP430vsDS1307
Các bạn chú ý Project giao tiếp DS1307 thực hiện trên Proteus 8,khi chạy sẽ thấy thời gian mô phỏng sai lệch so với thực tế do mô phỏng thời gian thực nhưng khối lượng tính toán nhiều lên mô phỏng sai là điều bình thường,trên thực tế sẽ không bị trường hợp này.

1 comment:

  1. em không thể download thư viện I2C về được. Có thể gửi qua tiennguyenotk01@gmail.com được không ạ

    ReplyDelete