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.
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ỉ
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
- 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.
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.
em không thể download thư viện I2C về được. Có thể gửi qua tiennguyenotk01@gmail.com được không ạ
ReplyDelete