- 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 被拉低” 的方法两种。