C51单片机模拟IIC总线,应答函数的疑问

本人现自学MCU,是个初学者,主要看郭天祥十天学会单片机的视频。今天学习I2C总线时,对“应答”有一些疑问。
首先上郭老师视频里写的应答的函数代码:
void respons() //应答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
郭老师写的函数中,先scl置位1,然后等待从机将sda拉低。如果“超时”默认从机已收到(因为模拟所以不处理非应答),跳出whlie。
但是,这样,SCL为高电平时将sda拉低不是IIC开始传输的标志么?
我看了应答的时序

网上对该时序解释——有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。
也就说第九位其实相当于前面接受八位数据时时钟脉冲中sda给出稳定高低电平。sda必须在scl释放前给出应答。这样理解对么?
我自己写的应答的函数是这样的:
void response() //应答
{
uchar i=0;
scl=0;
delay();
sda=1;
delay();
while(sda&&i!=255)
{
i++;
}
scl=0;
delay();
}
可是这样子看,又觉得特别奇怪,很不合理,这样SCL完全没有置高的必要了。

看了一晚上,还是相当晕乎,因为自学实在找不到人问,所以拜托各位老师细致讲解。十分感谢!

应答是接收设别自动产生的,不一定是从机。在IIC上除了开始,停止和重复开始外,所有数据都在在时钟的低电平变化的,也就是为高后,数据就应该稳定了。所以如果是模拟总线,应先有下降沿,再设为输入,然后读ACK,如果是从机的应答,是自动产生的,是作为数据通信正确的判断标志,为了可靠,是要判断的。主机的应答一般是程序控制的,如果要结束总线,可以给也可以不给应答;如果要继续读数据,就必须给出应答。
温馨提示:答案为网友推荐,仅供参考
相似回答