你说,while(!D0)就是死循环等待从设备拉低D0,
那程序停在这里循环,监测D0的时候,应该是while(1).也就是说,!D0=1,那么就是说D0=0的时候,程序一直在那里停在那里发SK=1,SK=0,那什么时候跳出这个循环呢?
盼您回答。。。
嗯,你说对了,不知道这个程序是你写的还是改别人的,这里是有个逻辑错误,不能用while(!D0),好点程序不会用死循环,你可以专门编写一个ACK的检测函数,例如:
i = 10;
SK = 0;
while(--i)
{
if(!DO)
break;
delayus(2); //可以发时钟信号,也可以不发
}
if(i == 0)
ACK_ERROR;
else
ACK_OK;
另一个问题其实已经写清楚了,SK上升沿主设备或从设备读数据,那么相应的从设备或主设备什么时候发出数据才能保证对方读取的时候一定是稳定的、正确的值呢(IO赋值上升、下降都要一定时间的),所以设计总线的人就利用了CLK有两个边沿,在一个沿是发数据,那么到下一个沿再读取,这个数据就是正确而且是稳定的(当然也要保证CLK的频率不要高过IO口响应的频率)。这个下降沿的用法不会在Datasheet里明说,但你看时序图是可以体会到的 |