View Single Post
Old 31-10-2009, 11:34 AM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi npbaoduy View Post
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn