引言:系统管理总线(SMBus)是一种双线接口,通过该接口,各种系统组件芯片和设备可以相互以及与系统其他部分通信。它基于I²C总线的操作原理。附录B提供了一些SMBus特性与I²C总线不同的方式的描述。 SMBus为系统和电源管理相关任务提供了一个控制总线。系统可以使用SMBus向设备发送和接收消息,而不是使用单独的控制线。移除单独的控制线可以减少引脚数量。接收消息确保了未来的可扩展性。 通过系统管理总线,设备可以提供制造商信息,告诉系统它的型号/部件号是什么,为暂停事件保存其状态,报告不同类型的错误,接受控制参数,并返回其状态。
目录
1. SMBus介绍
2. SMBus协议时序
2.1 symbols
2.2 SMBus Quick Command
2.3 SMBus Receive Byte
2.4 SMBus Send Byte
2.5 SMBus Read Byte
2.6 SMBus Read Word
2.7 SMBus Write Byte
2.8 SMBus Write Word
2.9 SMBus Block Read
2.10 SMBus Block Write
2.11 I2C Block Read
2.12 I2C Block Write
2.13 SMBus Block Write - Block Read Process Call
3. SMBus和I2C的建议
1. SMBus介绍
SMBus(System Management Bus)协议是基于I²C协议的一种改进版本,旨在增强系统管理中的设备通信可靠性。SMBus最早由英特尔开发,用于支持智能电池和其他系统管理任务。系统管理总线。 SMBus最初的目的是为智能电池、充电电池、其他微控制器之间的通信链路而定义的。 SMBus也被用来连接各种设备,包括电源相关设备,系统传感器,EEPROM通讯设备等等。 SMBus 为系统和电源管理这样的任务提供了一条控制总线,使用 SMBus 的系统,设备之间发送和接收消息都是通过 SMBus,而不是使用单独的控制线,这样可以节省设备的管脚数。 SMBus是基于I2C协议的,SMBus要求更严格,SMBus是I2C协议的子集。相关官方文稿这边也贴出供读者参考。
SMBus有哪些更严格的要求?跟一般的I2C协议有哪些差别?
-
VDD的极限值不一样
-
I2C协议:范围很广,甚至讨论了高达12V的情况
-
SMBus:1.8V~5V
-
-
最小时钟频率、最大的
Clock Stretching
-
Clock Stretching含义:某个设备需要更多时间进行内部的处理时,它可以把SCL拉低占住I2C总线
-
I2C协议:时钟频率最小值无限制,Clock Stretching时长也没有限制
-
SMBus:时钟频率最小值是10KHz,Clock Stretching的最大时间值也有限制
-
-
地址回应(Address Acknowledge)
-
一个I2C设备接收到它的设备地址后,是否必须发出回应信号?
-
I2C协议:没有强制要求必须发出回应信号
-
SMBus:强制要求必须发出回应信号,这样对方才知道该设备的状态:busy,failed,或是被移除了
-
-
SMBus协议明确了数据的传输格式
-
I2C协议:它只定义了怎么传输数据,但是并没有定义数据的格式,这完全由设备来定义
-
SMBus:定义了几种数据格式(后面分析)
-
REPEATED START Condition(重复发出S信号)
-
比如读EEPROM时,涉及2个操作:
-
把存储地址发给设备
-
读数据
-
-
在写、读之间,可以不发出P信号,而是直接发出S信号:这个S信号就是
REPEATED START
-
如下图所示
-
SMBus Low Power Version
-
SMBus也有低功耗的版本
-
2. SMBus协议时序
对于I2C协议,它只定义了怎么传输数据,但是并没有定义数据的格式,这完全由设备来定义。 对于SMBus协议,它定义了几种数据格式。
2.1 symbols
S (1 bit) : Start bit(开始位)
Sr (1 bit) : 重复的开始位
P (1 bit) : Stop bit(停止位)
R/W# (1 bit) : Read/Write bit. Rd equals 1, Wr equals 0.(读写位)
A, N (1 bit) : Accept and reverse accept bit.(回应位)
Address(7 bits): I2C 7 bit address. Note that this can be expanded as usual toget a 10 bit I2C address.(地址位,7位地址)
Command Code (8 bits): Command byte, a data byte which often selects a register onthe device.(命令字节,一般用来选择芯片内部的寄存器)
Data Byte (8 bits): A plain data byte. Sometimes, I write DataLow, DataHighfor 16 bit data.(数据字节,8位;如果是16位数据的话,用2个字节来表示:DataLow、DataHigh)
Count (8 bits): A data byte containing the length of a block operation.(在block操作总,表示数据长度)
[..]: Data sent by I2C device, as opposed to data sent by the hostadapter.(中括号表示I2C设备发送的数据,没有中括号表示host adapter发送的数据)
2.2 SMBus Quick Command
只是用来发送一位数据:R/W#本意是用来表示读或写,但是在SMBus里可以用来表示其他含义。 比如某些开关设备,可以根据这一位来决定是打开还是关闭。
Functionality flag: I2C_FUNC_SMBUS_QUICK
2.3 SMBus Receive Byte
I2C-tools中的函数:i2c_smbus_read_byte()。 读取一个字节,Host adapter接收到一个字节后不需要发出回应信号(上图中N表示不回应)。
Functionality flag: I2C_FUNC_SMBUS_READ_BYTE
2.4 SMBus Send Byte
I2C-tools中的函数:i2c_smbus_write_byte()。 发送一个字节。
Functionality flag: I2C_FUNC_SMBUS_WRITE_BYTE
2.5 SMBus Read Byte
I2C-tools中的函数:i2c_smbus_read_byte_data()。
先发出Command Code
(它一般表示芯片内部的寄存器地址),再读取一个字节的数据。 上面介绍的SMBus Receive Byte
是不发送Comand,直接读取数据。
Functionality flag: I2C_FUNC_SMBUS_READ_BYTE_DATA
2.6 SMBus Read Word
I2C-tools中的函数:i2c_smbus_read_word_data()。
先发出Command Code
(它一般表示芯片内部的寄存器地址),再读取2个字节的数据。
Functionality flag: I2C_FUNC_SMBUS_READ_WORD_DATA
2.7 SMBus Write Byte
I2C-tools中的函数:i2c_smbus_write_byte_data()。
先发出Command Code
(它一般表示芯片内部的寄存器地址),再发出1个字节的数据。
Functionality flag: I2C_FUNC_SMBUS_WRITE_BYTE_DATA
2.8 SMBus Write Word
I2C-tools中的函数:i2c_smbus_write_word_data()。
先发出Command Code
(它一般表示芯片内部的寄存器地址),再发出1个字节的数据。
Functionality flag: I2C_FUNC_SMBUS_WRITE_WORD_DATA
2.9 SMBus Block Read
I2C-tools中的函数:i2c_smbus_read_block_data()。
先发出Command Code
(它一般表示芯片内部的寄存器地址),再发起度操作:
-
先读到一个字节(Block Count),表示后续要读的字节数
-
然后读取全部数据
Functionality flag: I2C_FUNC_SMBUS_READ_BLOCK_DATA
2.10 SMBus Block Write
I2C-tools中的函数:i2c_smbus_write_block_data()。
先发出Command Code
(它一般表示芯片内部的寄存器地址),再发出1个字节的Byte Conut
(表示后续要发出的数据字节数),最后发出全部数据。
Functionality flag: I2C_FUNC_SMBUS_WRITE_BLOCK_DATA
2.11 I2C Block Read
在一般的I2C协议中,也可以连续读出多个字节。 它跟SMBus Block Read
的差别在于设备发出的第1个数据不是长度N,如下图所示:
I2C-tools中的函数:i2c_smbus_read_i2c_block_data()。
先发出Command Code
(它一般表示芯片内部的寄存器地址),再发出1个字节的Byte Conut
(表示后续要发出的数据字节数),最后发出全部数据。
Functionality flag: I2C_FUNC_SMBUS_READ_I2C_BLOCK
2.12 I2C Block Write
在一般的I2C协议中,也可以连续发出多个字节。 它跟SMBus Block Write
的差别在于发出的第1个数据不是长度N,如下图所示:
I2C-tools中的函数:i2c_smbus_write_i2c_block_data()。
先发出Command Code
(它一般表示芯片内部的寄存器地址),再发出1个字节的Byte Conut
(表示后续要发出的数据字节数),最后发出全部数据。
Functionality flag: I2C_FUNC_SMBUS_WRITE_I2C_BLOCK
2.13 SMBus Block Write - Block Read Process Call
先写一块数据,再读一块数据。
Functionality flag: I2C_FUNC_SMBUS_BLOCK_PROC_CALL
3. SMBus和I2C的建议
虽然SMBus是基于I²C的一个协议扩展,但其应用场景和标准更严格,所以在设备通信中优先选择SMBus协议,即使硬件仅支持I²C,也可以通过软件在I²C总线上模拟SMBus功能。