rdkx3 iic 3和5的引脚是不是有问题

那个iicc0的物理的3和5引脚 读不了那个陀螺仪,没有应答,100kHz和400kHz均测试失败,测试用物理的35和36的gpio模拟的iic正常读,iic的物理的3和5引脚静态测试的输入高低电平没问题,iic引脚输出高低电平也没问题,这是什么问题呀,难道是驱动的问题吗,

板卡:Hobot X3 PI V2.1
RDK OS版本:2.1.1
Ubuntu:20.04.6 LTS
内核:4.14.87
hobot-boot:2.0.4-20240828232052
hobot-audio-config:2.0.0-20240828232052
I2C驱动:hobot-i2c

  1. IMU型号:
    ICM-20948,模块为GY-ICM20948V2,9轴IMU。
    磁力计为芯片内部连接的AK09916。

  2. I2C地址:
    ICM-20948地址为0x68,WHO_AM_I寄存器正确值为0xEA。
    使用GPIO软件I2C时能够正常读取:
    address=0x68
    WHO_AM_I=0xEA

  3. i2cdetect -y 3:
    当前系统没有/dev/i2c-3,执行会提示:
    Error: Could not open file /dev/i2c-3

设备树中I2C3控制器存在,但状态为disabled。
目前只有:
/dev/i2c-0 (我们使用有问题)
/dev/i2c-1

i2cdetect -y -r 0扫描结果全部为“–”,0x68和0x69均无ACK。

  1. dmesg | grep -i i2c:
    hobot-i2c a5009000.i2c: hobot i2c probe start
    hobot-i2c a5009000.i2c: round_rate:96000000
    hobot-i2c a5009000.i2c: I2C bus speed is 400000
    hobot-i2c a5009000.i2c: clkdiv = 0x1d
    hobot-i2c a5009000.i2c: i2c0 diag register…
    hobot-i2c a5009000.i2c: hobot_i2c_0 probe done

没有看到timeout或bus error日志,但访问0x68返回Remote I/O error。

  1. 上拉电阻:
    没有额外外接上拉电阻。
    GY-ICM20948V2模块自带电平转换和上拉:
    主控侧SDA/SCL分别有4.7kΩ上拉到模块输入电源。
    传感器侧SDA/SCL分别有4.7kΩ上拉到1.8V。
    模块VCC接RDK的3.3V。

根据你描述的现象(I2C3 引脚静态电平正常、GPIO 模拟 I2C 正常,但硬件 I2C3 无法读取陀螺仪),结合社区已有案例,问题分析如下:

可能原因

  1. 设备树未正确使能 I2C3:X3 的 I2C3 默认可能未开启,需要在 config.txt 中显式使能
  2. 引脚复用冲突:I2C3 的引脚可能被其他功能占用
  3. 驱动时序问题:hobot-i2c 驱动在特定频率下与某些陀螺仪兼容性不佳
  4. 上拉电阻问题:硬件 I2C 需要外部上拉,而 GPIO 模拟时你可能已经外接了上拉

排查步骤

1. 检查 I2C3 是否已使能

# 查看当前 I2C 总线
i2cdetect -l

# 如果看不到 i2c-3,需要在 /boot/config.txt 中添加
dtparam=i2c3=on

参考社区案例:X3 的 i2c 接口,只看到 0 和 3

2. 检查设备树节点

# 查看 I2C3 的设备树状态
cat /proc/device-tree/soc/i2c@*/status

# 或者
dtc -I fs /proc/device-tree > current_dts.txt
grep -A 10 "i2c3" current_dts.txt

3. 测试 I2C3 总线

# 扫描 I2C3 上的设备(假设陀螺仪地址是 0x68,常见 MPU6050/ICM 地址)
i2cdetect -y 3

# 尝试读取陀螺仪 WHO_AM_I 寄存器
i2cget -y 3 0x68 0x75

4. 检查引脚复用

# 查看引脚复用状态
cat /sys/kernel/debug/pinctrl/pinctrl-hobot/pinmux-pins

# 确认 I2C3 的 SCL/SDA 引脚没有被其他功能占用

5. 对比 GPIO 模拟与硬件 I2C 的差异

既然你用 GPIO35/36 模拟 I2C 能成功,建议:

# 记录 GPIO 模拟时的时序参数
# 对比硬件 I2C 的时序
i2cdetect -y 3 -r 0x03 0x77  # 限制扫描范围

# 尝试降低 I2C3 频率(在设备树中修改 clock-frequency)

6. 查看驱动日志

# 查看内核日志中的 I2C 错误
dmesg | grep -i i2c
dmesg | grep -i hobot-i2c

# 开启 I2C 调试
echo "file drivers/i2c/* +p" > /sys/kernel/debug/dynamic_debug/control

临时解决方案

如果硬件 I2C3 确实存在问题,而你急需使用:

  1. 继续使用 GPIO 模拟 I2C(你已经验证可行)
  2. 尝试切换到 I2C0 或 I2C1(如果引脚允许)
  3. 等待官方修复:社区已有反馈类似问题会在后续版本修复

建议反馈

请在你的原帖中补充以下信息,方便官方定位:

1. 陀螺仪具体型号(MPU6050/ICM20602/其他?)
2. 陀螺仪的 I2C 地址
3. i2cdetect -y 3 的完整输出
4. dmesg | grep i2c 的错误日志
5. 是否外接了上拉电阻(阻值多少)

这类问题很可能是驱动时序或设备树配置问题,建议先按上述步骤排查,如果确认是驱动 bug,官方通常会在后续 OTA 中修复。

驱动日志显示I2C0控制器初始化和probe均正常。根因最可能是:

  1. GY-ICM20948V2模块内置的电平转换芯片为推挽型(TXB系列),与I2C开漏协议存在电气不兼容,硬件I2C控制器对时序要求更严格因此失败,而GPIO模拟I2C对此容忍度更高;

  2. 上拉电阻配置在硬件I2C下存在匹配问题。

建议优先确认模块电平转换IC型号,若为TXB系列则需换用I2C兼容的方案。其次可尝试启用I2C3换用另一路硬件总线,或先将速度降至50kHz测试。如软件I2C能满足您的性能需求,直接使用也是一个稳定可行的方案。