那个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
-
IMU型号:
ICM-20948,模块为GY-ICM20948V2,9轴IMU。
磁力计为芯片内部连接的AK09916。
-
I2C地址:
ICM-20948地址为0x68,WHO_AM_I寄存器正确值为0xEA。
使用GPIO软件I2C时能够正常读取:
address=0x68
WHO_AM_I=0xEA
-
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。
- 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。
- 上拉电阻:
没有额外外接上拉电阻。
GY-ICM20948V2模块自带电平转换和上拉:
主控侧SDA/SCL分别有4.7kΩ上拉到模块输入电源。
传感器侧SDA/SCL分别有4.7kΩ上拉到1.8V。
模块VCC接RDK的3.3V。
根据你描述的现象(I2C3 引脚静态电平正常、GPIO 模拟 I2C 正常,但硬件 I2C3 无法读取陀螺仪),结合社区已有案例,问题分析如下:
可能原因
- 设备树未正确使能 I2C3:X3 的 I2C3 默认可能未开启,需要在
config.txt 中显式使能
- 引脚复用冲突:I2C3 的引脚可能被其他功能占用
- 驱动时序问题:hobot-i2c 驱动在特定频率下与某些陀螺仪兼容性不佳
- 上拉电阻问题:硬件 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 确实存在问题,而你急需使用:
- 继续使用 GPIO 模拟 I2C(你已经验证可行)
- 尝试切换到 I2C0 或 I2C1(如果引脚允许)
- 等待官方修复:社区已有反馈类似问题会在后续版本修复
建议反馈
请在你的原帖中补充以下信息,方便官方定位:
1. 陀螺仪具体型号(MPU6050/ICM20602/其他?)
2. 陀螺仪的 I2C 地址
3. i2cdetect -y 3 的完整输出
4. dmesg | grep i2c 的错误日志
5. 是否外接了上拉电阻(阻值多少)
这类问题很可能是驱动时序或设备树配置问题,建议先按上述步骤排查,如果确认是驱动 bug,官方通常会在后续 OTA 中修复。
驱动日志显示I2C0控制器初始化和probe均正常。根因最可能是:
-
GY-ICM20948V2模块内置的电平转换芯片为推挽型(TXB系列),与I2C开漏协议存在电气不兼容,硬件I2C控制器对时序要求更严格因此失败,而GPIO模拟I2C对此容忍度更高;
-
上拉电阻配置在硬件I2C下存在匹配问题。
建议优先确认模块电平转换IC型号,若为TXB系列则需换用I2C兼容的方案。其次可尝试启用I2C3换用另一路硬件总线,或先将速度降至50kHz测试。如软件I2C能满足您的性能需求,直接使用也是一个稳定可行的方案。