//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_WaitFor_Ack(void)
{
u8 ucErrTime=0;
SDA_IN_Init();//PortC.11:SDA设置为输入
IIC_SDA=1;
delay_us(1);
IIC_SCL=1;
delay_us(1);
while(READ_SDA)//判断PortC.11管脚是否有回馈。
{
ucErrTime++;
if(ucErrTime>250)//1/72M*10^6*250≈3.5um
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0
return 0;
}
针对上述的疑问,热心群友指导如下:
华山论剑(948480400) 21:44:11
纹个问题,等待IIC ACK,为什么要让SDA和SCL都为1后,再等待SDA信号?
刹那芳华(151328147) 21:59:59
没有吧
你理解错了
华山论剑(948480400) 22:01:12
跟谁说话,跟我说的吗
刹那芳华(151328147) 22:01:32
不需要SDA有变化,如果SDA在SCL和SDA为1时变化就变成了stop
说错了,变成了start
刹那芳华(151328147) 22:02:32
ACK信号和其他信号一样,在SCL为低电平时就已经准备好了
华山论剑(948480400) 22:05:12
你有回收ACK的时序图吗?
刹那芳华(151328147) 22:05:24
百度
华山论剑(948480400) 22:05:45
我现在的问题就是在原子的wait_ack()这个函数上
难道,不需要把SDA和SCL置1(备注掉),也可以,是吗
刹那芳华(151328147) 22:09:16
你去看看IIC的start和stop信号是怎么样的
华山论剑(948480400) 22:09:28
那个我看得懂
就是回收ACK有疑问
刹那芳华(151328147) 22:09:41
ack信号和其他信号一样的,就相当于第九个bit
华山论剑(948480400) 22:11:12
计数=250,72MHz时钟,的计数时间大概是3.5um。就是用来判断SDA的电平持续时间的吧。大概是3.5um,对吧
刹那芳华(151328147) 22:13:30
用得着判定SDA的持续时间吗?在SCL高电平的时候读取的值不就是你想要的吗?
华山论剑(948480400) 22:13:57
喔,原子的程序有判断持续时间
你的意思是,不管怎么样,只要在传输数据结束后,只要判断SDA是否为0就可以了,是这样的吧
刹那芳华(151328147) 22:15:42
数据传输过程中,前8个bit是数据,第9个bit是ACK,你和前面的一样处理就可以了
华山论剑(948480400) 22:15:48
这个0值是在SCL=1的情况下
华山论剑(948480400) 22:17:18
问题是,ACK的电平持续时间大大于数据持续时间
?
所以原子才要设置电平持续时间
应该是这样理解吧
刹那芳华(151328147) 22:20:32
持续时间是一样的
在SCL为高电平时,SDA不能变动,一变动就成了start或stop
你就当IIC有九个bit好了,只是最后一个bit是ack,这9个bit的时序一模一样
华山论剑(948480400) 22:21:21
这样啊
华山论剑(948480400) 22:24:23
那数据传输过程中,SCL起时钟作用,SDA根据SCL传输数据,那接收端在SCL的什么电平情况下,确认是数据
刹那芳华(151328147) 22:24:39
高电平
华山论剑(948480400) 22:27:13
有两种情况,SCL=1下,SDA=0或1,没有电平跳动。此时,数据位数还没有达到8.那么意味着这些SDA信号是数据。当计数达到9时,这个电平就是ACK或NACK
是这样吗
刹那芳华(151328147) 22:28:12
是的
华山论剑(948480400) 22:30:05
这时才有点明白.....但起始和停止,SCL=1时,SDA有电平跳动,那么意味着,整个起始、发送数据、ACK/NACK、停止,有信号不对称的时候,就是电平宽窄不同了
刹那芳华(151328147) 22:32:21
是的,但是有个有最小时间的限制
华山论剑(948480400) 22:32:31
了解了...
非常感谢
刹那芳华(151328147) 22:33:08
一般时间都是一样的,定时器不会差很多,除非是软件死了
华山论剑(948480400) 22:33:33
我的意思是在正常工作的情况下
华山论剑(948480400) 22:35:35
另外,在数据的传输SCL的时钟,SCL高低变化一次,数据信号只保持一个电平,因为,SCL在低电平的时候,数据是无效的。是哦
刹那芳华(151328147) 22:36:20
是的
刹那芳华(151328147) 22:37:40
SCL低电平时是用来准备数据的,此时SDA随时都可以变化,也可以不变
华山论剑(948480400) 22:38:23
假设,前面函数已经把数据传输完毕,立即调用ACK等待函数,那么这个时候判断的SDA的情况,就是ACK的情况了
希望新手们,能理解。呵呵。
感谢群友。
发布出来,也是为了能在网络上保留这些有意义的问题。
|