13.1. SMBus 概述
SMBus 是一种基于 I²C 协议的双线接口。SMBus 是一种低速总线,为设备提供明确的寻址以及总线仲裁。有关更多信息,请参阅由 SBS-IF 发布的完整 SMBus 规范集。
13.1.1. SMBus 从设备地址
从设备地址使用 7 位非移位表示法来指定。例如,智能电池选择器设备的从设备地址应指定为 0x0A(1010b),而不是某些其他文档中可能出现的 0x14(10100b)。这两种不同的地址形式源于地址在 SMBus 上传输时所采用的格式。
在物理 SMBus 上传输期间,从设备地址被格式化为一个 8 位数据块,其中位 7-1 包含地址,而位 0 包含读/写位。另一方面,ASL 代码将从设备地址简单表示为一个 7 位值,因此如果需要移位,则由 OS(驱动程序)负责执行。例如,在将 ASL 值写入基于 EC 的 SMBus 中的 SMB_ADDR 寄存器之前,必须先将其左移 1 位,如地址寄存器,SMB_ADDR中所述。
13.1.2. SMBus 协议
对于任意给定的 SMBus 从设备,可能有七种命令协议,且一个设备可以使用其中任意一种或全部协议进行通信。下面列出了这些协议及其相关的访问类型指示符。请注意,这些协议值与协议寄存器,SMB_PRTCL中为基于 EC 的 SMBus 定义的值类似,只是协议对(例如读取字节、写入字节)已被合并。
表 13.1 SMBus 协议类型
| 值 | 类型 | 说明 |
|---|---|---|
| 0x02 | SMBQuick | SMBus 读/写 Quick 协议 |
| 0x04 | SMBSendReceive | SMBus 发送/接收字节协议 |
| 0x06 | SMBByte | SMBus 读/写字节协议 |
| 0x08 | SMBWord | SMBus 读/写字协议 |
| 0x0A | SMBBlock | SMBus 读/写块协议 |
| 0x0C | SMBProcessCall | SMBus 过程调用协议 |
| 0x0D | SMBBlockProcessCall | SMBus 写块-读块过程调用协议 |
所有其他协议值均为保留。
请注意,此接口使用协议值的位 7 来向 SMB-HC 指示某次事务是否应采用分组错误校验(PEC)。分组错误校验在系统管理总线规范,1.1 版第 7.4 节中进行了说明。这一非常理想的能力提高了 SMBus 通信的可靠性和稳健性。
协议值的位编码如下所示。例如,值 0x86 将用于指定 SMBus 读/写字节协议的 PEC 版本。

图 13.1 位编码示例
请注意,协议值的位 0 始终为零(偶数十六进制值)。与从设备地址类似,实现 SMBus 接口的软件负责设置该位,以指示事务是读操作(例如读取字节)还是写操作(例如写入字节)。
例如,为 EC-SMBus 段实现此接口的软件会为读事务设置位 0。对于 SMBByte 协议(0x06),这将导致在读事务时把值 0x07 写入 SMB_PRTCL 寄存器(如果请求 PEC,则为 0x87)。
13.1.3. SMBus 状态码
状态码的使用有助于 AML 判断 SMBus 事务是否成功。通常,状态码为零表示成功,而非零值表示失败。SMBus 接口使用与 EC-SMBus 相同的状态码(参见状态寄存器,SMB_STS)。
13.1.4. SMBus 命令值
SMBus 设备可以选择性地支持最多 256 个设备特定命令。对于这些设备,设备支持的每个命令值在该接口中都被建模为一个独立的虚拟寄存器。不传输命令值的协议(例如读/写 Quick 和发送/接收字节)则使用单个虚拟寄存器建模(其命令值 = 0x00)。