I2C 报错问题排查

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

  • 5
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值