查看: 761|回复: 0

[技术交流] IIC 波形问题分享

[复制链接]

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
发表于 2019-11-7 16:45:11 | 显示全部楼层 |阅读模式
各位好,最近在调试IIC的时候遇到了SDA波形有半高电平的状态,下面分享一下解决的方法。
1.测试方法
       通过IIC将数据0XEF写入eeprom中的0x01地址。整个操作过程如下且通过示波器测试波形 通信参数: 起始信号+写0XA0+从机回ACK+写0X01+从机回ACK+写0XEF+从机回ACK+STOP
2.问题描述
   注意:(以下图片中黄色为SDA,蓝色为SCK)
测试发现写入过程中,从机每次的ACK应答都会产生一个半高波形,如下图红框所示。


猜想:SDA在从机产生ACK应答时主机和从机发生了电平冲突。
关于ACK信号:主机写入过程中,当8bit写入完成后,在随后的第九个时钟上如果SDA为低,则主机收到ACK,若是SDA为高,则主机收到NOACK。
如下是有问题的程序关键部分:
从ACK的介绍和有问题的程序上看,当第八个bit完成时,SCL会拉低,然后在拉高。在SCL拉低的时候从机立即会进行数据变化,产生低电平(ACK信号),但是此时主机的SDA还是输出高状态,所以电平冲突,造成了半高电平的产生。
3.解决办法
从问题上看,说明是在从机发送ACK时两端产生了SDA控制权的冲突,导致了这个问题。因为SDA本身带有上拉,所以第一删除无用的SDA输出高语句,第二当需要主机发送高电平时,主机设置SDA为输入状态,通过外部的上拉将SDA稳定在高点平。程序和实际结果如下所示,可以看到ACK时的半高状态消除:
4.结论:
1.模拟IIC情况下,如果MCU支持开漏输出,则用开漏输出,因为开漏只能拉低不能拉高,这样不会造成电平冲突等问题。
2.如果用推挽输出的话,那么MCU在控制SDA引脚时,
  a) 输出高电平,则MCU设置SDA为输入状态,靠外部上拉将SDA稳定在高点平;
  b) 输出低电平,则MCU这只SDA为输出状态,且输出低电平。
  c) 输入状态,MCU设置SDA为输入状态。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则

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