I2C 报错问题排查

  • Post author:
  • Post category:其他


  • i2c 报 “timeout, ipd: 0x80, state: 1”错误,芯片供电不对导致(要求1.8V,实际1.2V)。
  • i2c 报 “timeout, ipd: 0x00, state: 1”错误,测量发现SCL和SDA无法拉低,硬件电平转换电路的问题。

i2c 报错可按如下方法和步骤排查:


如果调用 I2C 传输接口返回值为 -6(-ENXIO)时候,表示为 NACK 错误,即对方设备无应答响应,这种情况一

般为外设的问题,常见的有以下几种情况:

  • I2C 地址错误;
  • I2C slave 设备处于不正常工作状态,比如没有上电,错误的上电时序以及设备异常等;
  • I2C 时序不符合slave设备所要求也会产生 NACK 信号,比如 slave 设备需要的是 stop 信号,而不是
  • repeat start 信号的时候;
  • I2C 总线受外部干扰导致的,用示波器测量可以看到是一个ACK波形。


当出现 I2C 的 log:”timeout, ipd: 0x00, state: 1”时,此时 I2C 控制器工作异常,无法产生中断状态,start 时序无法发出,有以下几种可能:

  • I2C SCL或者SDA Pin 脚iomux错误;

  • I2C 的上拉电压不对,如电压不够或者上拉电源没有等;

  • I2C Pin 脚被外设拉住,电压不对;

  • I2C 时钟未开,或者时钟源太小;

  • I2C 同时配置了CON_START 和 CON_STOP 位。


  • 当出现 I2C 的 log:”timeout, ipd: 0x10, state: 1”时,此时 I2C 控制器工作正常,但是 cpu 无法响应 I2C 中

    断,此时可能cpu0被阻塞了(一般 I2C 中断都在 cpu0上面,通过cat /proc/interrups 可以查看),或者可能

    是 I2C 中断位被关闭了。


  • 当出现 I2C 的 log 类似:”timeout, ipd: 0x80, state: 1”时,看到 ipd 为 0x80 打印,可以说明当前 SCL 被

    slave 拉住,要判断被哪个 slave 拉住:

  • 一是排除法,适用于外设不多的情况,而且复现概率高;

  • 二是需要修改硬件,在 SCL 总线上串入电阻,通过电阻两端产生的压差来确定,电压更低的那端外设为

    拉低的 slave,电阻的选取以不影响 I2C 传输且可以看出压差为标准,一般上拉电阻的1/20 以上都可

    以,如果是 host 拉低也可以看出。另外在此基础上通过示波器来抓取波形更加直观,比较不同 slave 和

    host 的低电平大小,与最后出问题时的低电平大小比较,相等的就是拉低总线的”元凶“。

    遇到比较多的情况是sda被拉低,证明是谁拉低的,同样参考上面 “SCL 被拉低” 的方法两种。



版权声明:本文为YuZhuQue原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。