Trích:
Nguyên văn bởi npbaoduy
Em đã thử rồi, sau khi ghi vào ROM, cho I2C stop, timer chạy, mỗi lần ngắt sau 0.5s mới start i2c và đọc từ rom, nhưng nó chỉ đọc được giá trị 0. Phần giao tiếp I2C thì ko báo lỗi, vì nếu báo lỗi, chương trình sẽ dừng khi vào hàm I2C_Fail(), đằng này chương trình vẫn chạy (có led nhấp nháy và cứ sau mỗi 0.5s đều gởi ra cổng nối tiếp giá trị 0).
Code:
void _ISR _T1Interrupt(void) {
_T1IF = 0; //Xoa co ngat
_LATC4 ^= 1; //Lat trang thai LED
_SEN = 1; //Tao ra dieu kien START
Wait_I2C(); //Cho hoat dong I2C hoan tat
Write_I2C(0xA0);
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi xu ly loi
Write_I2C(0x00);
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi xu ly loi
Write_I2C(0x01);
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi xu ly loi
_RSEN = 1; //Tao ra dieu kien RESTART
Wait_I2C(); //Cho hoat dong I2C hoan tat
Write_I2C(0xA1); //Ghi dia chi cua ROM, chuan bi doc tu ROM
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi xu ly loi
temp = Read_I2C();
_PEN=1;
Wait_I2C();
U1TXREG = temp;
while (!U1STAbits.TRMT);
}
Nhân tiện đây em cũng xin hỏi, điều kiện start và restart khác nhau như thế nào?
Em xin cám ơn
|
Bạn nên thử với các tốc độ baud thấp, đừng thử với tốc độ tương đương tốc độ tối đa ghi trong datasheet của linh kiện.
START có đường truyền ở trạng thái idle đủ lâu, còn RESTART bao gồm STOP đi liền với START (tức là đường truyền không ở trạng thái idle đủ lâu như trường hợp START).
Thân,