BMC给CPLD发送的SMC命令具体数据如何解读

scanner 1

scanner配置如下:
“Scanner_LM75Device1”: {
“Chip”: “#/Smc_EnclSMC”,
“Offset”: 4371,
“Size”: 2,
“Type”: 0,
“Mask”: 255,
“Period”: 3000,
“Debounce”: “None”,
“ScanEnabled”: “<=/Scanner_PowerGd.Value”,
@DefaultDefault”: {
“ScanEnabled”: 0
},
“NominalValue”: 32767,
“Status”: 0,
“Value”: 0
},
tracechip Smc_EnclSMC start的数据如下:
image

Scanner 2

scanner配置如下:
“Scanner_RiserTemp”: {
“Chip”: “#/Smc_IEU”,
“Offset”: 4352,
“Size”: 2,
“Type”: 0,
“Mask”: 255,
“Period”: 3000,
“Value”: 0,
“Debounce”: “#/ContBin_H3L3”,
“ScanEnabled”: “<=/Scanner_PowerGd.Value”,
@Default”: {
“ScanEnabled”: 0
}
},

tracechip Smc_EnclSMC start的数据如下:
image

Accessor 1

"Accessor_LogicVerId": {
  "Chip": "#/Smc_IEU",
  "Offset": 2304,
  "Size": 1,
  "Mask": 255,
  "Type": 0,
  "Value": 0
},

image

Accessor 2

"Accessor_LogicVerId": {
  "Chip": "#/Smc_EnclSMC",
  "Offset": 2816,
  "Size": 1,
  "Mask": 255,
  "Type": 0,
  "Value": 0
},

image

对smc交互数据有几个问题:
问题1 Accessor 1的offset是2304, Accessor 2的offset是2816,为何write_data都是04 00 00 09 00 ED
问题2 scanner 1和scanner 2先写后读的read_length=10的这条数据应该怎么解析?
问题3 为何Scanner_LM75Device1(scanner 1)会读两次? 第二次读的数据要怎么解析?

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

  • 相同的 write_data 源于 SMC 命令字的标准化及 M/S=0 时 Parameter 无效。
  • 第一次读 10 字节是获取长度。
  • 第二次读完整数据,并根据 Scanner 配置的 Mask、Offset 等解析出实际物理量。
点击此处查看详细分析解答

根据提供的上下文信息,对您提出的三个问题解答如下。核心信息来源于论坛讨论、知识图谱中的实体定义以及相关配置文档。


问题1:Scanner 1(Offset 4371)与 Scanner 2(Offset 4352)为何 write_data 都是 04 00 00 11 00 12

原因分析
SMC 使用标准化的 4 字节命令字(Command Word)来定义操作类型,包含 Function(6bit)、Command、M/S(Master/Slave)、R/W(Read/Write)、Parameter 等字段【Knowledge Graph: Command Word, SMC Command】。当 M/S 位为 0 时,Parameter 字段无效,即命令字中的参数部分被忽略【Document Chunks: WH11003 回复】。

对于读取传感器(如温度)的通用操作,Function 和 Command 字段是固定的,不同 Scanner 虽然配置的 Offset 不同,但发送的 SMC 命令字类型相同,因此 write_data 内容一致。注意:用户 trace 中的 write_data 是 6 字节,实际可能是 SMC 命令字加上额外字段(如 Length)的组合,但其核心命令部分保持一致。

引用

  • WH11003:“SMC 命令字 4370、4371、4372 读取的同一个位置吧,M/S 位为 0 时,Param 似乎是无效的。”
  • 知识图谱:SMC 命令字是 4 字节标准化标识,包含 Function、Command、MS、RW、Parameter 等字段。

问题2:先写后读时,read_length=10 的第一次读取数据如何解析?

解析目的
论坛用户 huangzhiyu(即 Huangezhiyu)明确指出:

“两次读的原因是这样的:BMC 并不清楚硬件实际返回的数据是多少,所以会先读 8 个字节获取到 len 字段,再通过 len 字段读取实际要返回的数据长度的数据。”【Document Chunks: huangzhiyu 回复】

因此,read_length=10 的第一次读操作是为了获取实际数据的长度(len 字段)。返回的二进制数据中包含长度信息,通常在前若干字节中(例如 trace 中返回 59 00 21,可能前 2 字节表示长度)。BMC 据此长度构造第二次读请求,读取完整的传感器数据。

注意:具体长度字段的偏移和格式未在上下文中明确给出,但其作用是固定的——确定后续有效数据长度。


问题3:Scanner_LM75Device1 为什么会读两次?第二次读的数据怎么解析?

两次读的原因
直接引用 huangzhiyu 的解决方案:

“两次读的原因:BMC 并不清楚硬件实际返回的数据是多少,所以会先读 8 个字节获取到 len 字段,再通过 len 字段读取实际要返回的数据长度的数据。”【Document Chunks: huangzhiyu 回复】

即:

  1. 第一次读(固定长度,如 10 字节):获取实际数据长度。
  2. 第二次读(动态长度,由第一次读到的长度确定):读取完整的传感器数据。

第二次读数据的解析方式
第二次读到的二进制数据对应传感器实际值,需要配合 Scanner 配置 中的以下字段进行解析:

  • Offset:指明数据在 SMC 寄存器中的起始位置(但 trace 显示底层实际使用的 offset 可能与配置不同,详见论坛讨论【Document Chunks: liujie_11 问题】)。
  • Size:数据占用的字节数(示例中为 2)。
  • Mask:用于提取有效位(示例中为 255,即全部位有效)。
  • Type:数据类型(如 0 表示无符号整数)。

最终传感器数值 = (第二次读取的原始值 & Mask) >> shift,具体移位量由硬件协议定义。例如温度传感器可能按线性公式转换为摄氏度。

引用

  • 知识图谱:Scanner 是硬件传感器,其 Value 属性通过 SMC 命令读取。
  • 配置文档:Scanner 定义中包含 Chip、Offset、Size、Mask 等参数【Document Chunks: Scanner 配置示例】。

总结

  • 相同的 write_data 源于 SMC 命令字的标准化及 M/S=0 时 Parameter 无效。
  • 第一次读 10 字节是获取长度。
  • 第二次读完整数据,并根据 Scanner 配置的 Mask、Offset 等解析出实际物理量。

以上解答全部基于提供的上下文内容,未引入外部信息。

问题2
smc应该会先固定读10个字节 其中第一个字节是读取长度,第二个是完成码,后面的是CPLD填充的数据。

问题3
如果先读的10个字节数据中,读取长度大于十,就会再按照读取长度再读一次。

问题一
smc读分两步操作
1、写一条固定的命令通知cpld接下来是要读数据 --对应write
2、读数据 --对应read

问题2
第一个字节是读取长度,长度不包括自己和crc
第二个是完成码
后续 长度-1 个字节是数据段
紧跟着数据段的一个字节是crc

这里有官方字段的解释,可以参考

概述-BMC SMC命令字-BMC管理接口-模组寄存器手册-S920L08-鲲鹏模组开发文档-鲲鹏社区