RDK X5无法读取I2C数据

RDK X5 接 VEML7700、VL53L8CX 时无应答或超时,ESP32-C3 曾读取成功

我使用 RDK X5 测试两个 I²C 传感器模块,目前都无法在 X5 上读取,希望请教如何继续定位。

1.环境与接线

  • RDK X5 V1.0,Ubuntu 22.04.5,内核 6.1.83,aarch64。

  • /dev/i2c-5 对应 341c0000.i2c,驱动为 i2c_designware,速率 100kHz。

  • 使用 40PIN 物理针号:1→3.3V、3→SDA、5→SCL、GND→地。

  • 也测试过备用 I²C0:物理27→SDA、28→SCL。

  • 两个模块分别测试,模块 VIN 使用3.3V。

模块 7位地址 ESP32-C3 测试 X5 测试
VEML7700 环境光模块 0x10 曾成功初始化、配置读回并读取变化的光照数据;也出现过 SDA 持续为低的失败 未读取成功,出现过地址 NACK 和约1秒超时
红色 VL53L8CX 测距模块 0x29 连续11次 ID 检查通过;ST驱动初始化成功,8×8、约2Hz输出距离 地址无应答,寄存器读取返回 Remote I/O error

ESP32-C3 使用 GPIO4/SDA、GPIO5/SCL,速率同样为100kHz。VEML7700 使用 Adafruit 驱动;VL53L8CX 使用 STM32duino/ST 驱动。

2.X5 已核对的配置

运行设备树中 I²C5 为 okay、clock-frequency=100000,pinctrl 指向 i2c5grp。对应引脚由 I²C5 控制器占用,UART3 为 disabled,未发现复用冲突。

总线没有其他用户进程占用,也没有已实例化的 I²C 客户设备节点。

读取命令例如:

# VEML7700:读取配置寄存器
i2ctransfer -y 5 w1@0x10 0x00 r2

# VL53L8CX:检测默认地址、尝试寄存器读取
i2cdetect -y -r 5 0x29 0x29
i2ctransfer -y 5 w2@0x29 0x00 0x00 r2

3.VEML7700 的进一步现象

曾捕获两种不同失败:

  • 快速失败时,内核明确报告:
    slave address not acknowledged (7bit mode)。

  • 另一轮连续3次约1.06秒超时,内核报告:
    controller timed out。

超时期间保持控制器 runtime active,并读取不清中断、不取走数据的状态寄存器,结果为:

ENABLE=1,ENABLE_STATUS=1
TXFLR=3,RXFLR=0
ACTIVITY=0,MASTER_ACTIVITY=0
TX_ABRT_SOURCE=0
未观察到 TX_ABRT 或 STOP_DET

表现为命令进入发送队列后,没有观察到正常推进。超时后驱动重新初始化控制器,但继续读取仍可能超时。

此外,在 I²C0 上做过以下对照:

  • SDA/SCL均断开:约5ms返回未应答。

  • 仅接模块SCL:仍快速返回未应答。

  • 仅接模块SDA:8次中7次超时。

  • 模块改由ESP32的3V3供电、两板共地、仅由X5通信,仍未成功。

这些对照之间经历过断电上电,因此存在上电状态变化的影响,不能直接据此断言SDA短路。

4.VL53L8CX 的情况

ESP32上读到的芯片 ID 为 F0 / 0C,已实际输出距离;X5目前连默认地址应答都没有,尚未进入驱动初始化阶段。

模块此前确认的接法是 VIN=3.3V、LPn悬空、SPI_I2C_N接地。ESP32测试程序没有驱动LPn。模块背面有标为 TXS0104E 的转换芯片,但尚未取得对应原理图,不能确认LPn是否经过电平转换。

5.想请教的问题

  1. X5 这两组 I²C 接口是否还有需要核对的输入使能、上下拉或IO电源域设置?

  2. 上述“有时地址NACK、有时发送队列停滞后超时”的表现,应优先检查哪些电气条件或控制器状态?

  3. 如何进一步区分线材/焊接、模块电平转换与上拉配合,以及X5接口本身的问题?

  4. 是否有这类模块接X5成功的接线、上拉阻值或配置案例?

按你现有的日志,X5 的 I2C 控制器本身基本是通的:空载、只接一根线时都能在几毫秒内返回 NACK,说明 SCL 能发出、地址阶段能走完。问题更集中在总线物理状态和从设备侧,而不是 i2c5 少配了某项使能。

三种现象要分开读:

  • slave address not acknowledged:传输已走到地址阶段但无人应答,指向从设备没上电/没使能(LPn、电平转换 OE)、地址或 SDA/SCL 接错。
  • controller timed out 且 TXFLR=3、ACTIVITY=0、RXFLR=0、无 TX_ABRT:命令还停在 FIFO、控制器没推进到传输,更像总线没被放开(SDA/SCL 被拉低),而不是从机不应答;这一点要用电平实测确认,光看寄存器不能定因。
  • “只接 SDA 时 7/8 超时、只接 SCL 时快速 NACK”的形态与 SDA 被拉低一致,但你中间断过电,先按下面测量确认。

优先做三步电气测量(模块接好、两边都上电):

  1. 量模块 VIN 对地电压应在 3.3V 附近,GND 与 X5 GND 通断良好。
  2. 量 X5 侧 SDA/SCL 空闲电平,两者都应接近 3.3V。接近 0V 说明该线被拉死(模块或接线),明显偏低/漂移说明上拉不足;再拔掉模块量一次,判断上拉在板端还是模块端。I2C 调试指南 里的时序参数是按“IO 使能上拉 + 板端 1k 上拉”标定的,SoC 内部上拉很弱,不能替代外部上拉。
  3. 临时外接 2.2k–4.7k 上拉到 3.3V 复测,这一步能直接区分“上拉配合不够”和其他原因。

VL53L8CX 那块板再量 TXS0104E 的 VCCA/VCCB/OE:OE 必须为高才导通,LPn 必须为高芯片才退出待机(引脚位置需对照模块原理图)。这两脚状态不对,X5 上就会一直 NACK。

对应你列的几点:I2C 应用 明确 X5 的 40PIN 默认使能 I2C5(物理 3/5)和 I2C0(物理 27/28),IO 3.3V;i2c5 与 uart3、i2c0 与 pwm2 复用,确认复用项为 disabled 即可。上下拉可用 cat /sys/kernel/debug/pinctrl/34180000.lsio_iomuxc/pinconf-pins 看当前 bias 配置(见 Pinctrl 调试指南)。40PIN 的 IO 电压域按 3.3V 设计,无需改。100k 已是官方列出的最低档(100k/200k/400k/1M/3.4M),靠降速绕不开上升沿问题,要动的是上拉和线长;接线前给两块板都断电,带电插拔容易把从机留在拉低 SDA 的状态。官方文档里没有 VEML7700/VL53L8CX 接 X5 的现成案例,本次查阅未找到,只能参考 /app/40pin_samples/test_i2c.py 与 i2c-tools 的用法。

下一步最有价值的是第 2 步的空闲电平读数:SDA、SCL 各量一次(接模块与拔掉模块各一组),贴出数值就能判断是上拉问题还是被器件/电平转换拉住。如果确认是模块侧 OE/LPn 时序需要按你的板子适配,论坛可以先一起把方案理清,具体联调可能需要通过 DGP 项目对接 协调 FAE 结合原理图推进。