OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9693|回复: 2

IIC的数据传输过程(热心群友指导的)

[复制链接]

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
发表于 2012-11-25 22:48:25 | 显示全部楼层 |阅读模式
//等待应答信号到来
//返回值: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的情况了

希望新手们,能理解。呵呵。
感谢群友。
发布出来,也是为了能在网络上保留这些有意义的问题。
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
 楼主| 发表于 2012-11-25 22:54:31 | 显示全部楼层
另外,在网络上搜到一个资料:

24C02中IIC总线的应答信号(ACK)时序图分析 



上图是应答信号的时序

首先关于发送端和接收端的定义得明确一下:发送端就是往IIC总线上送数据的设备,接收端是从IIC总线上获取数据的设备
从这个时序图上,能看出来,发送端在发送数据后,要在SCL第9个脉冲来临前把SDA拉高,以等待接收端发来ACK信号
接收端在接收到数据后,会向发送端发出ACK信号,也就是图上标的ACKNOWLEDGE

在单片机系统中,单片机和2402是互为发送端和接收端的
也就是说,当单片机向2402写数据的时候,会向IIC总线发送数据,这时单片机作为发送端,2402作为接收端。反过来,读取2402的数据时,单片机就成了接收端,2402成了发送端。
单片机作为发送端时,当它发送完一字节的数据后,需要执行的语句是:SDA=1;SCL=1;SCL=0 ,即将SDA拉高,等待接收端发送ACK信号                                                                                                                  当单片机作为接收端时,如果接收多个数据,那么,在每接收完一字节的数据后,都要执行以下语句:SDA=0,ACL=1;SCL=0,向等待ACK的2402发送ACK信号
如果只接受一个字节的数据,那么就不发送ACK,这个时候,就要把SDA置高,即执行语句:SDA=1
 
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
回复 支持 反对

使用道具 举报

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
 楼主| 发表于 2012-11-25 22:55:24 | 显示全部楼层


 
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 00:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表