管理端点缓冲区操作 - 页码193
你正在深入分析 NVM Express® Management Interface Specification, Revision 2.0 中关于 SMBus 读取操作 和 I2C 读取操作 的多个示例。这里的操作描述了如何通过 SMBus 和 I2C 协议读取设备数据,以及如何进行 仲裁 操作,特别是在多个设备共享同一 SMBus 通道 的情况下。以下是对这些示例的详细分析,以帮助你理解它们的工作原理和应用场景。
一、SMBus 块读取示例
示例 2:SMBus 块读取驱动器的静态数据(VID 和序列号)
在这个例子中,主机 向 SMBus 地址 D4h 发送写命令,并开始读取驱动器的 静态数据(厂商 ID(VID)和序列号)。数据传输按以下步骤进行:
- 启动传输:主机发送 SMBus 地址
D4h,然后传送 命令代码08h。 - 读取数据:
- 设备返回 VID(例如
1234h)和 序列号(例如AZ123456),这些数据以字节形式逐步传输。 - 数据块传输:在此过程中,主机与设备之间的交互是通过 确认(ACK) 和 非确认(NACK) 信号来完成的,确保数据正确传输。
过程概述: - 读取 序列号 和 厂商 ID。 - 在整个读取过程中,主机和设备通过 ACK/NACK 信号保证数据的正确性。
示例 3:SMBus 发送字节以重置仲裁位
此示例展示了如何通过 SMBus 向设备发送字节来 重置仲裁位(Arbitration bit),以便多个设备共享同一 SMBus 通道 时进行仲裁。
- 发送字节:主机发送字节
FFh来清除所有 管理端点 中的 仲裁位。 - 仲裁过程:
- 当多个设备在同一地址上竞争时,主机通过 I2C 读取 来执行仲裁操作。
- 设备会根据响应内容判断哪个设备优先获取访问权限。
- 最终,仲裁成功的设备会将仲裁位设置为
1,表示它赢得了仲裁,并且其他设备将在下次读取时优先响应。
示例 4:I2C 读取状态和厂商内容
在此示例中,主机使用 I2C 协议读取多个驱动器的状态信息,包括 厂商信息 和 序列号。I2C 允许跨越 SMBus 块边界 进行读取,因此驱动器的序列号信息可以跨越多个数据块。
过程概述: - I2C 读取 在 SMBus 块读取 的基础上,继续读取多个数据块(例如,序列号和健康状态)。 - 设备返回的每个字节都是按照 ACK 信号发送的,确保传输的完整性。
二、SMBus 仲裁操作
仲裁机制概述:
当 多个设备 共享同一 SMBus 通道 时,必须进行 仲裁 来决定哪个设备首先获得访问权限。以下是 SMBus 仲裁 的工作流程:
- 主机发送字节:主机通过 SMBus 写命令 发送字节
FFh来清除所有设备的 仲裁位,确保新的仲裁周期开始。 - I2C 读取:主机通过 I2C 读取 从设备获取数据,在读取过程中进行仲裁。设备会根据仲裁结果设置 仲裁位:
- 如果设备 发送
0字节 而其他设备发送1,则该设备获胜并设置 仲裁位为 1。 - 重复读取:主机继续读取数据,直到 仲裁位为
1,表示设备已经获得优先访问权。
仲裁优先级:
- 警告设备优先:在 仲裁 过程中,如果有设备处于 警告状态(例如温度过高或其他问题),这些设备会在仲裁中优先处理。这是因为
0位 在仲裁中胜出,因此当设备存在警告时,它会优先响应读取请求。
注意事项:
- 在多个设备共享 SMBus 时,必须确保读取操作不会 短暂读取 相似的数据,避免产生仲裁错误。
- 如果多个设备返回相同的数据,则会触发重新仲裁,直到能够确定哪一个设备优先响应。
三、总结与应用
-
SMBus 块读取 提供了一种简单的 数据读取 机制,适用于获取设备的 静态信息(如 VID 和 序列号)以及 健康状态 等信息。它的优势在于使用 SMBus 协议进行通信,适用于简单的 管理任务。
-
I2C 读取操作 扩展了 SMBus 块读取 的功能,允许跨越多个 数据块 进行读取。这对于需要从多个设备或多个数据块中获取信息的场景非常有用。
-
仲裁机制 使得 多个设备共享同一 SMBus 通道 时能够正确管理访问权限,确保设备能够根据 警告状态 和 仲裁规则 正确响应请求。它在 多设备环境 中保证了 数据读取的稳定性 和 系统的可靠性。
-
应用场景:
- 在 多设备存储系统 或 嵌入式系统 中,使用 SMBus 和 I2C 进行 设备管理,确保设备能够在共享 通道 的情况下有序地进行通信。
- 在 高可用性系统 中,仲裁机制能够确保 警告设备 优先响应,避免因设备故障而影响系统性能。
这些操作和机制确保了 设备管理 的稳定性,并为 系统恢复 和 设备健康监控 提供了可靠的支持。如果你有任何关于 SMBus 或 I2C 读取操作 的问题,或希望更深入了解其实现,随时告诉我!