I2C debug出现问题怎么解决

描述

RK 平台 I2C debug

1、I2C 通信失败,出现 log: “timeout, ipd: 0x00, state: 1”

请检查硬件上拉是否给电。

2、调用 i2c_transfer 返回值为 -6?

返回值为 -6 表示为 NACK 错误,即对方设备无应答响应,这种情况一般为外设的问题,常见的有以下几种情况:

  1. I2C 地址错误,解决方法是测量 I2C 波形,确认是否 I2C 设备地址错误;
  2. I2C slave 设备不处于正常工作状态,比如未给电,错误的上电时序等;
  3. 时序不符合 I2C slave 设备所要求也会产生 Nack 信号。

3、当外设对于读时序要求中间是 stop 信号不是 repeat start 信号的时候,该如何处理?

这时需要调用两次 i2c_transfer, I2C read 拆分成两次,修改如下:

static int i2c_read_bytes(struct i2c_client *client, u8 cmd, u8 *data, u8 data_len) {struct i2c_msg msgs[2];
     int ret;
     u8 *buffer;
     buffer = kzalloc(data_len, GFP_KERNEL);
     if (!buffer)
         return -ENOMEM;
     msgs[0].addr = client- >addr;
     msgs[0].flags = client- >flags;
     msgs[0].len = 1;
     msgs[0].buf = &cmd;
     ret = i2c_transfer(client- >adapter, msgs, 1);
     if (ret < 0) {
      dev_err(&client- >adapter- >dev, "i2c read failedn");
            kfree(buffer);
       return ret;
      }
      msgs[1].addr = client- >addr;
      msgs[1].flags = client- >flags | I2C_M_RD;
      msgs[1].len = data_len;
      msgs[1].buf = buffer;
      ret = i2c_transfer(client- >adapter, &msgs[1], 1);
      if (ret < 0)
          dev_err(&client- >adapter- >dev, "i2c read failedn");
      else
        memcpy(data, buffer, data_len);
      kfree(buffer);
      return ret;
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分