rdkx5,i2c5一直识别不到设备

如题,rdkx5,i2c5一直识别不到设备,上逻辑分析仪只有scl有波形,sda一直都是高电平

SCL 有时钟、SDA 全程高,说明主机在打时钟,但 SDA 上从来没被拉低过。先靠波形把两类原因分开,再决定查哪边。

1. 抓一帧完整传输,看 SDA 在地址字节里有没有跳变(跑 sudo i2cdetect -y -r 5 的同时抓,默认 100kHz):

  • 如果 SDA 连地址字节的 0 位都没有低电平(始终一条直线)→ 信号没从主机侧出来:SDA 这一根没通、接反,或该脚没在用 I2C5 功能。X5 的 40PIN 上 I2C5 占物理脚 3 和 5,且与 uart3 属同一组复用功能,srpi-config 里只能使能其中一项;先确认没把 uart3 打开。不过既然 SCL 能出时钟,复用多半已生效,重点放在 SDA 线路本身。
  • 如果地址字节期间 SDA 有跳变、只在第 9 个时钟(ACK 位)保持高 → 总线时序是正常的,只是这个地址上没有从机应答。这时查从机侧:模组 VCC 是否真正上电、是否与板子共地、SDA/SCL 是否接反、模组/外挂是否有上拉到 3.3V(40PIN IO 为 3.3V)、器件是否处于复位或未使能状态。用万用表测 SDA 空闲电压应≈3.3V。

2. 附带的两个快速核对

ls /dev/i2c-*
sudo i2cdetect -l          # 确认 /dev/i2c-5 对应的就是 40PIN 这路
sudo i2cdetect -y -r 5     # -r 用读模式探测,避免误写;显示 UU 表示地址已被驱动占用

若怀疑 SDA 脚本身没通,可把它临时当 GPIO 输出低再读回,看逻辑分析仪上的 SDA 是否真被拉低;仍为高就说明是线/焊点/引脚功能问题,而不是从机不应答。

X5 的 40PIN 定义和 srpi-config 里的复用配置项(sudo srpi-config → 3 Interface Options → I3 Peripheral bus config,改完需重启)见 管脚定义与应用,I2C5 默认使能情况见 I2C 应用。

还差两个信息:接的是什么器件、7 位地址是多少?模组自身有没有 I2C 上拉、和板子是否共地?

用python gpio工具对sda对应引脚也控制不了高低电平,scl可以控制

先别判定引脚坏了,GPIO测试要先排除复用。断电拔掉外设,再上电,在 sudo srpi-config 里把 I2C5 和 Serial3 都关闭,重启后用 GPIO.BOARD 编号、输出模式测试物理3脚(SDA),直接在板端测高低电平。

裸板能翻转就查连接线和外设;仍固定高电平,再查该脚复用/硬件。测完恢复 I2C5、保持 Serial3 关闭并重启,再测I2C。

复用说明:https://developer.d-robotics.cc/rdk_x_doc/System_configuration/srpi-config

SCL 能翻转、SDA 控不动,这两条合起来更像是物理 3 脚这一路根本没切到 GPIO,而不是从机不应答。X5 上 i2c5 和 uart3 是同一组复用,只有两项都关闭,接口才表现为普通 GPIO,而且改完必须重启;若 Serial3 还开着,3 脚可能仍挂着 uart3 的发送功能,空闲就是高电平,正好是“恒高 + GPIO 拉不低”。

请核对两个前提:

  1. sudo srpi-config → 3 Interface Options → I3 Peripheral bus config,确认 i2c5 和 uart3 都显示关闭,退出后 sudo reboot,再看状态才有效。配置界面可对照:管脚定义与应用。

  1. 用 GPIO.BOARD 物理编号 3,且测点放在 40PIN 排针第 3 脚本身,不要夹在模组端或杜邦线末端:
import time, Hobot.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(3, GPIO.OUT, initial=GPIO.HIGH)
for _ in range(10):
    GPIO.output(3, GPIO.LOW);  print("LOW ", GPIO.input(3)); time.sleep(0.5)
    GPIO.output(3, GPIO.HIGH); print("HIGH", GPIO.input(3)); time.sleep(0.5)
GPIO.cleanup()

sudo python3 xxx.py 运行(BOARD 编码与回读用法见 GPIO 应用)。顺便跑 sudo hb_gpioinfo,看该 PinNum 行的 Mode/Status 是否真被 python 进程占用。

结果怎么分:

  • 排针第 3 脚能被拉到 0V,但模组端仍恒高 → 问题在排针到模组这段:线序、接触、模组侧把 SDA 强驱动为高。断电量 SDA 对 3.3V/GND 是否短路。
  • 排针第 3 脚也恒高、hb_gpioinfo 显示该脚仍被别的功能占用 → 复用没真正生效,回到第 1 步;此时再看 dmesg | tail 有无 pin 申请失败。
  • 复用确实关闭、hb_gpioinfo 也显示为输出,脚仍拉不动 → 才轮到怀疑该脚本身或焊点,可换另一路空闲脚做同样测试作对照。

你现在是在关闭 I2C5 并重启之后测的,还是之前测的?测点夹的是排针还是模组那一端?