20-06-2009, 04:18 PM | #1 |
Đệ tử 1 túi
Tham gia ngày: Sep 2008
Bài gửi: 13
: |
I2C truyền và nhận nhiều byte dữ liệu.
Chào các bạn,
Mình có đọc các bài viết về I2c Trên diễn đàn nhưng đa số chỉ truyền nhận 1 byte, hoặc truyền nhiều byte nhưng phải start và stop nhiều lần. Sau khi mày mò, mình đã truyền được nhiều byte. Dưới đây là đoạn code đọc 2 byte của Master Code:
int16 read_I2C_2byte( int8 slave_addr) { int16 result; int8 low, high; i2c_start(); i2c_write(slave_addr+1); high= i2c_read(1); low= i2c_read(0); i2c_stop(); result = make16(high, low); return result; } Code:
void write_I2C_2byte(int8 byte1, int8 byte2, int8 slave_addr) { i2c_start(); i2c_write(slave_addr); i2c_write(byte1); i2c_write(byte2); i2c_stop(); } Code:
#INT_SSP void i2c_isr() { int8 state; state = i2c_isr_state(); if(state<0x80) { if (state == 1) byte1= I2C_read(1); if (state == 2) byte2= I2C_read(1); } if(state >= 0x80) { if (state == 0x80) I2C_write(high); if (state == 0x81) I2C_write(low); } clear_interrupt(INT_SSP); } Hàm i2c_isr_state(); sẽ trả về giá trị 0x80 khi Slave truyền byte thứ nhất, trả về giá trị 0x81 khi Slave truyền byte thứ hai,... Các đoạn code trên có thể được điều chỉnh để truyền hoặc nhận tối đa 127 byte chỉ với 1 lần Start và 1 lần Stop. Đây là những gì mình đọc, suy nghĩ và kiểm chứng trên mạch thật. Mong các bạn đóng góp ý kiến để hoàn thiện nó. thay đổi nội dung bởi: rien, 22-06-2009 lúc 05:21 PM. |
|
|