Em có đoạn code như sau, với ý tưởng là lưu một byte vô ROM (0x66) vào địa chỉ 0001, sau đó đọc lại byte đó và gởi ra cổng nối tiếp, nhưng em không đạt kết quả (không gởi ra cổng nối tiếp được gì)
Code:
int main(void) {
Init_PORTS(); //Khoi tao cac cong I/O
Init_I2C(); //Khoi tao module I2C
Init_UART1_Module();
Init_TMR1();
//Buoc 1, tao dieu kien START, cho hoat dong I2C hoan tat
_SEN = 1;
Wait_I2C(); //Cho hoat dong I2C hoan tat
//Buoc 2, xuat dia chi cua ROM voi thao tac ghi, cho va kiem tra ACK
Write_I2C(0xA0); //Xuat dia chi cua ROM, sap ghi vao ROM
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
//Buoc 3, xuat dia chi cua thanh ghi dich (target), cho va kiem tra ACK
Write_I2C(0x00); //Xuat dia chi cao
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
Write_I2C(0x01); //xuat dia chi thap
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
Write_I2C(0x66); //Xuat noi dung cua thanh ghi 0x0000
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
_PEN = 1; //Tao ra dieu kien STOP
Wait_I2C(); //Cho hoat dong I2C hoan tat
// doc du lieu tu ROM va goi ra cong RS232
_RSEN = 1; //Tao ra dieu kien START
Wait_I2C(); //Cho hoat dong I2C hoan tat
//Buoc 2, ghi dia chi cua ROM, sap thao tac ghi vao ROM
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); // cho hoan tat goi byte.
while(1) Nop();
}
//Chuong trinh con khoi tao cac cong I/O
void Init_PORTS(void) {
LATC = 0xFFFF; //Tat cac LED (anode chung) noi vao cong E
TRISC = 0; //LED noi vao RC5
TRISG=0;
}
//Chuong trinh con khoi tao module I2C
void Init_I2C(void) {
I2CCON = 0x8200; //bit15=I2CEN, bit9=DISSLW (tat Slew Rate
//Control cho cac toc do baud khac 400 kbps)
I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);
}
//Chuong trinh con xuat 1 byte qua module I2C
void Write_I2C(unsigned char d) {
I2CTRN = d;
}
//Chuong trinh con cho hoat dong 00Master I2C sau cung hoan tat
void Wait_I2C(void) {
while (!_MI2CIF);
_MI2CIF = 0;
}
//Chuong trinh con xu ly khi hoat dong I2C bi loi
void I2C_Fail(void) {
_PEN = 1; //Tao ra dieu kien STOP
Wait_I2C(); //Cho hoat dong I2C hoan tat
LATC &= 0x0000; //Bat LED noi vao RE0 de bao loi
U1TXREG = 70;
while (1); //Dung chuong trinh tai day
}
unsigned char Read_I2C(void) {
unsigned char d;
_RCEN = 1; //Cho phep nhan byte
Wait_I2C(); //Cho hoat dong I2C hoan tat
d = I2CRCV; //Lay byte da nhan dat vao d
_ACKEN = 1; //Ghi bit ACK/NACK ra I2C bus
Wait_I2C(); //Cho hoat dong I2C hoan tat
return d; //Tra byte da doc ve chuong trinh goi
}
em xin lỗi vì code hơi dài, nhưng em không hiểu nó sai chỗ nào đành phải gởi lên cho mọi người xem giúp.
Các hàm đọc/ghi I2C em là tương tự TUT4 của anh namqn. Fcy của em là 7372800, baud của I2C = 100khz.
Các chân A0, A1, A2 của ROM em đã nối mass, nên địa chỉ của ROM là A0(ghi) và A1(đọc)
Module UART thì chắc ko sai, vì em đã thử các ví dụ khác, truyền và nhận rất tốt, tốc độ baud cũng ko sai, em đã kiểm tra kỹ, hơn nữa em nghi nếu sai tốc độ baud thì nó sẽ nhận được các ký tự lạ, đằng này không nhận được gì trên máy tính.
ROM thì chắc ko chết, vì em đã mua một con mới về thử

.
Vậy có ai biết xin góp ý giúp em, hoặc có một ví dụ nào đó cụ thể về đọc ghi ROM 24c512 thì cho em xin để tham khảo, em cám ơn rất nhiều.