利尔达吧 关注:21贴子:184
  • 0回复贴,共1

IIC波形问题分享

只看楼主收藏回复

  各位好,最近在调试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.结论:
  4-1.模拟IIC情况下,如果MCU支持开漏输出,则用开漏输出,因为开漏只能拉低不能拉高,这样不会造成电平冲突等问题。
  4-2.如果用推挽输出的话,那么MCU在控制SDA引脚时,
   a) 输出高电平,则MCU设置SDA为输入状态,靠外部上拉将SDA稳定在高点平;
   b) 输出低电平,则MCU这只SDA为输出状态,且输出低电平。
   c) 输入状态,MCU设置SDA为输入状态。


IP属地:浙江1楼2019-11-12 09:17回复