本人现自学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完全没有置高的必要了。
看了一晚上,还是相当晕乎,因为自学实在找不到人问,所以拜托各位老师细致讲解。十分感谢!