当前位置: 代码迷 >> 单片机 >> 对郭天祥I2C对答函数的疑问
  详细解决方案

对郭天祥I2C对答函数的疑问

热度:22   发布时间:2016-04-28 15:07:46.0
对郭天祥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,则认为从机给出了正确的响应,通信正常。
  相关解决方案