对郭天祥I2C应答函数的疑问解决办法
对郭天祥I2C应答函数的疑问程序如下:/*函数:Response()功能:等待从机应答*/void Response(){uchar iscl
对郭天祥I2C应答函数的疑问
程序如下:
/*函数:Response()
功能:等待从机应答
*/
void Response()
{
uchar i;
scl = 1;
Delay();
while ((1 == sda) && i < 250) i++;
scl = 0;
Delay();
}
main函数用到的函数都有定义
void main(void)
{
Init();
Start();
Write_Byte(0xa0);
Response();
Write_Byte(3);
Response();
Write_Byte(0xaa);
Response();
Stop();
//Wait(100);
Start();
Write_Byte(0xa0);
Response();
Write_Byte(3);
Response();
Start();
Write_Byte(0xa1);
Response();
P1 = Read_Byte();
Stop();
while (1);
}
问题是:1.这个等待从机应答函数不管从机是否把sda拉低,都能执行下去,那这个等待应答函数有什么作用???
2.每次写完一个字节后,都跟一个等待从机应答函数,然后继续写,假设从机就没有应答的话,特别是写地址的时候,就没有应答,那接下去的写数据给谁呢??
敬请各位解惑,谢谢。
[解决办法]在从设备存在,且能够正确应答时,在延时等待期间,应答信号能够回来。此时,这个程序能够正常运行;
上述假定在大部分场合是对的,所以,有人敢用。
如果要用在实际项目中,肯定不行,因为,程序是错误的。
[解决办法]郭天祥这个程序只是一个Demo程序,作为一个正式项目的程序,的确如楼主所说有不妥的地方。
一种可行的做法是,让Response函数返回i值:
倘若返回值为250,则认为Response超时,从机未给出正确的响应,通信异常,主机可以做出响应的出错处理,比如重新发送数据。
倘若返回值小于250,则认为从机给出了正确的响应,通信正常。