Học liệu

Module I2C_USCI trong MSP430

  • 16/01/2019
  • Học liệu

  1. Giới thiệu chung Module I2C_USCI

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 la 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 kéo dây SDA xuống mức 0 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 kéo dây SDA xuống mức 0 trong khi SCL ở mức 1.

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

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(unsignedchar 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

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).

 

unsignedchar I2C_USCI_Write_Byte(unsignedchar address, unsignedchar 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;

}

 

 

4. 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.

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.

unsignedchar I2C_USCI_Read_Byte(unsignedchar 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;

}

 

Các tin khác