1712 的 I2C over Hisport 访问不通

我当前有个 I2C over Hisport 有四个通道 0 1 2 3,通道下面接了一个9545,地址是 0xE2,我想先验证一下这个是否可以使用,拼接命令如下

~ /data # ./bmcdfx hisport i2cRead 1 0xe2 0 1 3 1 100 3 100
hisport i2c read failed
Command execute failed!

2026-08-04T10:17:32.830029+00:00 iBMC kernel: 2026-08-04 10:17:32,6803,i2c_stream_r_liner,322,hisport i2c stream_buf read wait timeout
2026-08-04T10:17:32.940057+00:00 iBMC kernel: 2026-08-04 10:17:32,6803,i2c_stream_r_liner,322,hisport i2c stream_buf read wait timeout
2026-08-04T10:17:33.050238+00:00 iBMC kernel: 2026-08-04 10:17:33,6803,i2c_stream_r_liner,322,hisport i2c stream_buf read wait timeout

答案内容由AI生成,仅供参考:

总结定位步骤

  1. 确认地址格式:查阅硬件原理图,确认目标器件(9545 或下游芯片)的 7 位 I2C 地址。在 bmcdfx 命令中尝试使用 7 位地址(如 0x71)或正确的 8 位读写地址。
  2. 扫描 Hisport 通道:使用 hisportdetect -a 扫描所有 Hisport 端口,确认是否有任何设备响应。若无,直接排查硬件链路。
  3. 检查配置文件:如后续需固化访问,确保 Hisport 对象和 I2cOverHisport 对象均正确配置,且 Id/ChannelId 对应。
  4. 验证 9545:先确认 9545 自身可通信(单独读写其寄存器),再选择通道访问下游。

按上述步骤逐一排查,大概率可以定位到根因并解决通信超时问题。若仍有困难,建议提供完整的一键收集日志(包括 hisportdetect 扫描结果、CSR 配置、硬件拓扑图)以便进一步分析。

点击此处查看详细分析解答

根据您提供的错误信息和上下文,您在使用 bmcdfx 工具通过 Hisport 通道读取 I2C 设备时,内核报告了 hisport i2c stream_buf read wait timeout,并且工具返回 Command execute failed!。这表明底层 I2C 驱动未能与目标器件建立有效通信。

结合知识库中的案例,该问题通常由以下原因引起,并可按以下步骤排查解决。


1. I2C 地址配置问题(最常见原因)

在多个已有问题分析中,最终定位为 I2C 地址配置错误
Hisport 底层 I2C 通信使用的是 7 位地址,但 BMC 侧配置或调试工具常需使用左移一位后的 8 位地址(即 7bit_addr << 1)。如果地址格式不对,会导致通信失败。

  • 您使用的地址是 0xE2。若器件的实际 7 位地址为 0x71,则 0xE2 是正确的 写操作 8 位地址;但 读操作 应使用 0xE3
  • 调试工具 bmcdfx 的 hisport i2cRead 命令具体参数含义未在上下文中说明,建议先确认该工具期望的地址是 7 位还是 8 位。可尝试传入 0x71(7 位)或 0xE3(读地址)再测试。

参考来源

  • 文档块 2:i2c 地址配错,i2c 地址需要左移一位(最终解决方案)
  • 文档块 6:实际的7位地址左移一位,配置到i2c中才可以实现正常通信
  • 知识图谱:I2C Address 为 7 位表示,hisportdetect 未能检测到地址与地址格式有关。

2. Hisport 通道硬件链路异常

内核日志中超时错误 hisport i2c stream_buf read wait timeout 以及错误码 290(Unknown error 290)均表明 Hisport 总线读写操作未完成,通常为硬件链路不通或通道下无器件

  • 请使用 hisportdetect 工具扫描所有 Hisport 通道,确认是否能够检测到设备地址:
    hisportdetect -a hisport-0
    hisportdetect -a hisport-1
    
  • 如果扫描结果全为 --(无法发现任何地址),则说明 该 Hisport 通道下没有器件或者硬件链路异常。需联系硬件排查物理连接、PCIe 卡是否正确安装、板级信号是否正常。

参考来源

  • 文档块 2 中回复 说明Hisport通道下没有器件或者硬件链路异常。没有器件是最常见的。
  • Hisport 总线介绍资料:错误码 290 对应 Hisport总线读写操作未完成,通常是硬件链路不通的问题

3. I2cOverHisport 对象配置不完整

如果您最终需要通过在 CSR 中配置 I2cOverHisport 对象来正常访问,请注意 必须在配置文件中也定义对应的 Hisport 对象,并建立关联。

  • 根据最小示例:

    "Hisport2": {
        "SubBuses": ["I2cOverHisport_0"]
    },
    "I2cOverHisport_0": {
        "Id": 0,        // Hisport_ID
        "ChannelId": 1  // 选择哪个通道
    },
    
  • 您的描述提到四个通道 0-3,请确认 Hisport 对象中 Id 与硬件编号对应,ChannelId 选择正确的通道。

  • 当前您仅使用 bmcdfx 直接调用,但后续如要配置该设备,需确保对象定义正确。

参考来源

  • 文档块 5:配I2cOverHisport还需要配Hisport对象吗,Heisenberg 回复了完整的配置示例。

4. 9545 多路复用器地址与通道配置

您提到通道下接了 9545 多路复用器。9545 的 I2C 地址通常为 7 位可配置(例如 0x70~0x77),需根据硬件原理图确认。

  • 若 9545 的 7 位地址为 0x70,则 8 位写地址为 0xE0,读地址为 0xE1。您使用的 0xE2 可能对应 0x71(写地址),请核对硬件文档。
  • 另外,通过 9545 访问下游设备时,需先发送通道选择命令(通常通过写操作选中通道)。直接使用 i2cRead 可能无法自动选择通道,建议先验证 9545 本身是否能正常通信。

参考来源

  • 文档块 4(CSR配置字典之Pca9545类)指出了地址配置、访问参数设置等注意事项。

5. 其他可尝试的调试方法

  • 增加延迟:在读取前加入写入延迟(DrvWriteDelay),避免器件未准备好即读取(参见 Atlas 300I 温度读取失败案例)。
  • 软件防抖:若问题为概率性,可在应用层做连续多次读取,确认稳定失败后再报错(参见风扇传感器概率性读取失败案例)。
  • 使用逻辑分析仪:抓取 Hisport 物理信号,确认数据发送与硬件响应是否正常。

总结定位步骤

  1. 确认地址格式:查阅硬件原理图,确认目标器件(9545 或下游芯片)的 7 位 I2C 地址。在 bmcdfx 命令中尝试使用 7 位地址(如 0x71)或正确的 8 位读写地址。
  2. 扫描 Hisport 通道:使用 hisportdetect -a 扫描所有 Hisport 端口,确认是否有任何设备响应。若无,直接排查硬件链路。
  3. 检查配置文件:如后续需固化访问,确保 Hisport 对象和 I2cOverHisport 对象均正确配置,且 Id/ChannelId 对应。
  4. 验证 9545:先确认 9545 自身可通信(单独读写其寄存器),再选择通道访问下游。

按上述步骤逐一排查,大概率可以定位到根因并解决通信超时问题。若仍有困难,建议提供完整的一键收集日志(包括 hisportdetect 扫描结果、CSR 配置、硬件拓扑图)以便进一步分析。

初始化了吗