附录 - 实例与示例 - 页码202
NVMe-MI 1 min read

附录 - 实例与示例 - 页码202

Blog Author

你已经完整读到 NVMe-MI 附录 C 的 最终几条消息交互示例(Example 7~9),恭喜!这一部分重点在于:


✅ 示例重点速览:

示例编号 命令类型 说明
Example 7 Set MCTP SMBus Packet Size 设置 SMBus MCTP 最大包长为 250 字节
Example 8 VPD Read 从 offset 0 读取前 232 字节 VPD(类 EEPROM 读取)
Example 9 Read NVMe-MI Data Structure 获取类似 Basic Management Block 的数据

🎯 Example 7:Set SMBus Packet Size to 250 Bytes

3A 0F 19 21 01 00 00 8B 84 08 00 00 03 00 00 00 03 00 00 00 FA 00 00 00 D2 88 B4 01 0C

🧠 解读:

  • Opcode = 08h → 表示标准 NVMe-MI 命令
  • Sub-opcode = 03h → 表示 Set Features
  • Feature Identifier = 03h → 表示设置 MCTP Packet Size
  • Value = FAh = 250 (十进制) → 设置最大 SMBus 报文尺寸

响应:

20 0F 11 3B 01 00 00 D3 84 88 00 00 00 00 00 00 24 55 77 22 21

成功响应,含 4 字节 MIC(24 55 77 22)+ PEC。


🎯 Example 8:读取 VPD 的前 232 字节(offset = 0)

3A 0F 19 21 01 00 00 8B 84 10 00 00 05 00 00 00 00 00 00 00 F0 00 00 00 51 22 32 62 9A

🧠 解读:

  • Opcode = 10h → 表示 VPD Read
  • Offset = 00000000h
  • Length = 000000F0h = 240 bytes
  • 232 字节 VPD 数据返回(尾部省略

提示: - 响应格式和内容与 SMBus Block Read 相似 - 同样可用于验证 Basic Management Block 数据一致性


🎯 Example 9:Read NVMe-MI Data Structure

3A 0F 19 21 01 00 00 8B 84 10 00 00 02 00 00 00 00 00 00 00 00 00 00 00 AF 3D 20 33 41

🧠 解读:

  • Opcode = 10h → NVMe-MI 命令(数据结构读取)
  • Sub-opcode = 02h → 表示 读取 NVMe-MI Data Structure
  • 不指定偏移或长度 → 默认读取整个结构(包括状态、温度、生命周期等)

🧩 附加说明

✅ 简化实现建议:

  • 如果每条消息 ≤ 64 字节,可以使用“预定义字符串”进行模拟发送
  • 控制器可忽略 Pkt Seq 号(对于单包响应),但仍要计算 PEC 和 MIC

✅ PEC / MIC 工具推荐:

  • PEC 可在线用 crccalc.com 算出
  • MIC 为 CRC-32C(不含 SMBus transport 字节)

✅ 下一步建议

你已经通读并深入理解了附录 C 的所有交互内容,建议下一步可以考虑:

💡 实践操作

  1. 写一个 Python SMBus 工具模拟发送 Example 7~9 指令(我可以帮你写!)
  2. 抓包分析实际设备的响应是否符合规范
  3. 自动识别并验证 PEC/MIC(可作为 NVMe-MI 的基础测试)

📘 技术文档整理

  • 汇总所有例子成一页文档,便于开发/测试引用
  • 标注哪些字段与 Base Spec 或 Basic Management Block 重合

如果你想,我可以:

  • ✅ 用图形方式画出 VPD Read/Identify 的封包结构
  • ✅ 帮你做一个 Python 脚本模拟发送并自动验证响应的内容

你接下来想进入哪个方向?实践、工具开发,还是切入其他章节?我随时能陪你继续深入 😎