i2c读取数据,参数超出范围

通过i2c命令i2ctool64 1 2 48 11 0xb2 0xec 0x00 0xE9 0x07 0x01 0x05 0x02 0x01 0x02 0x00 0x00
0xb2表示芯片的地址
0xec 0x00 0xE9 0x07 0x01 0x05 0x02 0x01 0x02 0x00 0x00表示cmd命令

可以读取到数据,

但是通过lua代码实现:

local ok, data = protocol:read(0xec00E90701050201020000, 7)
有报错:
failed., ok:false, data:PropertyValueTypeError: The value 1.7005848409242e+19 for the property Offset is of a different type than the property can accept.
想咨询下:read第一个函数addr地址参数最大范围是多少?
如果超出范围,怎么解决i2c访问?

第二个问题:

"Chip_PCIeSwitch": {
          "AddrWidth": 1,
          "Address": 178,
          "HealthStatus": 0,
          "OffsetWidth": 11,
          "WriteTmout": 30,
          "ReadTmout": 30,
          "WriteRetryTimes": 3,
          "ReadRetryTimes": 3
        },

OffsetWidth最大是多少?

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

I2C读取中地址与偏移宽度的范围限制及问题分析

在您提供的i2ctool64命令中,使用了长参数序列 0xec 0x00 0xE9 0x07 0x01 0x05 0x02 0x01 0x02 0x00 0x00,这表明该操作可能涉及复杂的I2C协议扩展(如I3C或厂商自定义协议),而不仅仅是标准的I2C读写。然而,当尝试通过Lua脚本调用 protocol:read(0xec00E90701050201020000, 7) 时,系统报错 PropertyValueTypeError: The value 1.7005848409242e+19 for the property Offset is of a different type than the property can accept.。此错误明确指出:传入的Offset值(即地址偏移)超出了属性定义的数据类型范围,且类型不匹配

根据知识库中的配置规范(如CSR配置字典之Chip类、Smc类等文档),OffsetAddress 参数在系统内部通常被定义为固定宽度的无符号整数(如U32),而 OffsetWidthAddrWidth 决定了这些字段的实际字节长度。当您将一个超长的十六进制数值(如12字节的命令序列)直接作为“地址”传入 read() 函数时,系统试图将其解释为一个单一的偏移量(Offset),这不仅数值过大(远超U32范围),而且语义错误——它实际上是一连串的命令和数据,而非单纯的寄存器偏移。

解决方案:正确使用I2C高级读写接口

标准的 Readread() 接口仅适用于简单的“指定偏移读取固定长度数据”的场景。对于您这种需要发送复杂命令序列后再读取响应的情况,应使用支持 先写后读(Write-then-Read) 的复合操作接口,例如 WriteReadComboWriteRead。根据知识库中 PCIe插卡的I2C读写怎么调试_293.json 的说明:

  • WriteRead:先在特定偏移(0xffffffff)写入数据,再从该偏移读取。
  • ComboWriteRead:先在指定偏移地址写入请求数据,再从指定响应地址读取结果。

您的操作应拆分为:

  1. 将命令序列 0xec, 0x00, 0xE9, 0x07, 0x01, 0x05, 0x02, 0x01, 0x02, 0x00, 0x00 作为写入数据(req_data)。
  2. 使用 ComboWriteRead 接口,通过 busctlmdbctl 调用 bmc.kepler.Chip.BlockIOComboWriteRead 方法,先写入命令,再读取7字节响应。
  3. 确保 AddrWidthOffsetWidth 配置与实际硬件匹配(见下文)。

OffsetWidth 的有效取值范围

关于您提出的第二个问题,OffsetWidth 的最大值在系统中并非无限制。根据知识库中多份文档(如 PCIe插卡的I2C读写怎么调试 )的描述,AddrWidthOffsetWidth 是配置参数,用于定义地址和偏移字段的字节宽度,其典型取值为 1到4字节

在您提供的配置中,"OffsetWidth": 11明显错误的。该值既不符合常规硬件设计(I2C偏移通常为1-2字节),也超出了系统预期的数据类型范围(U8)。正确的 OffsetWidth 应根据目标芯片的数据手册确定:

  • 若寄存器偏移为8位(1字节),则 OffsetWidth = 1
  • 若为16位(2字节),则 OffsetWidth = 2
  • 若为24位或32位(3或4字节),则 OffsetWidth = 34

配置为 11 会导致系统在解析寄存器访问请求时出现严重错误,无法正确构造I2C通信帧。您应查阅 Chip_PCIeSwitch 对应的硬件规格书,确认其寄存器偏移的实际宽度,并将 OffsetWidth 修改为正确的值(1、2、3或4)。参考知识库中 电源适配指导_1101.json网卡配置指南_1377.json 的实例,所有 OffsetWidth 均配置为1或2,从未出现超过4的情况。

综上所述,问题根源在于:误将复杂命令序列当作单一地址使用,以及 OffsetWidth 配置严重超出合理范围。解决方案是使用 ComboWriteRead 接口处理复杂I2C事务,并将 OffsetWidth 修正为符合硬件规格的1-4之间的整数。