全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

I2C debug出现问题怎么解决

时间:2023-07-22 15:00

人气:

作者:admin

标签: 通信  DEBUG 

导读:RK 平台 I2C debug 1、I2C 通信失败,出现 log: “timeout, ipd: 0x00, state: 1” 请检查硬件上拉是否给电。 2、调用 i2c_transfer 返回值为 -6? 返回值为 -6 表示为 NACK 错误,即对方设备无应答响应,...

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;
}
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信