SMBus学习记录
注:本文基于对于smb3.0 spec的学习总结。更多时序要求需要查阅spec。
SMBus 是 System Management Bus 的缩写,译为系统管理总线,SMBus是一种二线制串行总线,1996年第一版规范开始商用。它大部分基于I2C总线规范。
Overview
系统管理总线(SMBus)是一个双线接口,通过它,各种系统组件芯片和设备可以相互通信,也可以与系统的其余部分进行通信。它基于I2C总线的工作原理。
SMBus为系统和电源管理相关任务提供控制总线。系统可以使用SMBus将消息传递到设备和设备之间,而不使用单独的控制线。可减少引脚数。
本文档描述了SMBus设备使用的电气特性、网络控制约定和通信协议。这些可以被认为存在于七层OSI网络模型的前三层,即物理层、数据链路层和网络层。通常在OSI模型的更高层实现的功能超出了本文档的范围。
SMBus的最初目的是定义智能电池、电池充电器和与系统其余部分通信的微控制器之间的通信链路。然而,SMBus也可以用于连接各种各样的设备,包括电源相关设备、系统传感器、eeprom、通信设备等等。
OSI模型
物理层:负责将信息编码传输(将数据→0or1)
数据链路层: 通过物理网络链路供数据传输——确定数据包形式
网络层 :源和终点间建立连接
Layer 1 – The Physical Layer
总线空闲时为0khz。
SMBus设备可以支持三种不同的最大总线速度之一中的一种:100 kHz、400 kHz和1 MHz。
设备超时定义
从设备在检测到任何单个时钟保持在低电平(持续时间大于超时时间最小值)时释放总线(停止驱动总线,让SMBCLK和SMBDAT浮动高)。检测到这种情况的设备必须重置其通信接口,并且能够在不迟于超时时间最大值时接收新的启动条件。
允许Master将正在进行的任何违反tLOW:SEXT或tTIMEOUT、MIN规范的Slave终止。这可以通过Master在进行中的字节传输结束时发出停止条件来完成。
Layer 2 – The Data Link Layer
SMBus在总线上分别使用固定电压水平定义逻辑“0”和逻辑“1”。
SMBCLK为高期间,数据线SMBDAT必须保持稳定,数据才有效。只有当SMBCLK为低时,数据线才能改变。
CLK高电平,DAT由高转低,即为传输START;CLK高电平,DAT由低转高,即为传输STOP。启动和停止由Master决定。在启动状态后,总线被认为是忙碌的。当STOP后CLK和DAT都保持高电平超过一定时间,总线才被再次认为是空闲的。
SMbus上的数据传输
每个字节由8位组成。在总线上传输的每个字节后必须跟随着一个确认位。字节首先传输最高有效位。下面的图表,说明了应答(ACK)的位置。
与确认相关的时钟脉冲由主控制器产生。数据发送端,在确认时钟周期释放SMBDAT线(高)。为了确认一个字节,接收器必须在时钟脉冲的高周期内将SMBDAT线拉低。希望NACK一个字节的接收器必须让SMBDAT线在确认时钟脉冲期间保持高电平。
ack
nack
时钟产生和仲裁
可能出现一个以上的Master试图同时在总线上放置时钟信号的情况。产生的总线信号将是由所有Master提供的有时钟信号的线与。
SMBCLK线路上的高到低转换将导致所有相关设备开始计算其低周期,并开始驱动SMBCLK low(如果该设备是主设备)。一旦设备完成其低周期计数,它将释放SMBCLK线。然而,如果另一个具有较长低周期的主机保持SMBCLK线低,则SMBCLK上的实际信号可能不会转换到高状态。在这种情况下,释放SMBCLK行的主机将进入SMBCLK高等待期。当所有设备的低周期都已计数完毕时,SMBCLK线将被释放并进入周期。所有与此相关的设备都将开始计算它们的高周期。第一个完成其高周期计数的设备将把SMBCLK线拉低,循环将再次开始。SMBCLK低周期由最慢的设备确定,SMBCLK的高周期由最快的设备确定。
时钟生成和仲裁
时钟同步
可能会出现多个主服务器试图同时在总线上放置时钟信号的情况。由此产生的总线信号将是由主机提供的所有时钟信号的线与信号。
仲裁
只有当总线空闲时,Master才可以启动传输。一个或多个设备可以在最小保持时间内产生启动条件,从而在总线上产生启动条件。
由于生成启动条件的设备可能不知道其他主设备正在争用总线,因此当SMBCLK为高时,在SMBDAT线路上进行仲裁。当另一个Master(或多个Master)在SMBDAT线路上传输低电平时,传输高电平的Master在仲裁周期中失去对总线的控制。丢失仲裁的主机可以继续提供时钟脉冲,直到丢失仲裁的字节完成为止。
在两个Master试图访问同一Slave的情况下,仲裁可能会继续超过地址字节。在这种情况下,仲裁将继续处理剩余的传输数据。如果两个Master正在仲裁,第一个Master希望在总线上重复启动,而第二个Master希望在总线上放置一个“0”数据位,则第一个Master不能启动并失去仲裁。如果第一个Master希望在总线上重复启动,而第二个Master希望在总线上放置一个“1”数据位,则第一个Master赢得仲裁。如果两个Master在同一位位置重复启动总线,仲裁应在每个数据位继续进行。
此机制要求参与仲裁周期的Master在仲裁期间监视SMBDAT线路的实际状态。
如果一个Master也包含Slave功能,并且在地址阶段的仲裁周期中失去对总线的控制,它必须检查总线上的实际地址,以确定是否有另一个Master试图访问它。在这种情况下,失去仲裁的Master必须立即切换到其Slave模式,以便接收其余的消息。
时钟低扩展
SMBus提供了一种时钟同步机制,允许不同速度的设备在总线上共存。除了总线仲裁程序外,时钟同步机制可以在位或字节传输期间使用,以允许速度较慢的Slave应付速度更快的Smater。
在位级,设备可以通过周期性地延长时钟低间隔来减慢总线速度。
在传输一条信息的过程中,允许设备将时钟延长至本文件AC规范中所述的最大限制。虽然如此,设计用于周期性地延长每个时钟周期的设备必须保持最小频率为10khz(1/fSMB,MIN=100µs),以保持SMBus带宽。
数据传输格式
从设备的地址放在主机总线的起始位置之后。地址长7位,后接第八位,指示数据传输方向(R/W#);0表示传输(写入Slave),而1表示数据请求(从Slave读取)。数据传输总是由主机生成的停止(P)条件终止。
Layer 3 – Network layer
1.masters, slaves, and hosts
Master devices
主设备发出命令,生成时钟,并终止传输。根据事务类型,事务中的主机可以向从设备(master-transmitter)发送数据,也可以从从设备((master-receiver)接收数据。
一个设备可以被设计成只作为一个主设备,也可以是一个主从设备,在这种情况下,它既可以作为主设备,也可以作为从设备。SMBus上可能有多个主设备。
Slave devices
从设备响应自己的地址并接收命令。根据事务类型,从设备可以从主设备接收数据,也可以向主设备发送数据。
Host
主机是一个专门的主机,它为系统的CPU或系统管理处理器提供主接口。主机必须是主从主机,并且必须支持SMBus主机通知协议。
2.设备标志-从机地址
在系统管理总线上作为从设备存在的任何设备都有一个唯一的地址。
3.使用设备
一个典型的SMBus设备将有一组命令,通过这些命令可以读写数据。所有命令的长度为8位(1字节)。命令参数和返回值的长度可能不同。访问不存在或不受支持的命令可能会导致错误情况。首先传输最高有效位。
对于任何给定的设备,有15种可能的命令协议。从设备可以使用15个协议中的任何一个或全部来通信。协议包括快速命令、发送字节、接收字节、写入字节、写入字、读取字节、读取字、进程调用、块读取、块写入和块写入块读取过程调用、写入32、读取32、写入64和读取64。
4.数据包错误检查
总线协议
SMBus实现的数据格式为:
Master-transmitter 到 slave-receiver:在这种情况下传输方向不变。
主机在第一个字节后立即读取从机:在第一次确认(由从机接收器提供)时,主发送机变为主接收机,从机接收机变为从机发射机。
组合格式:在传输过程中改变方向时,主机生成一个重复的启动条件和从机地址,但R/W#设置为1。在这种情况下,主接收器通过在传输的最后一个字节上生成NACK和停止条件来终止传输。
1.Quick Command
在快速命令中,从机地址的R/W位表示该命令。R/W位可用于简单地打开或关闭设备功能,或启用/禁用低功耗待机模式。没有发送或接收数据。快速命令实现适用于对SMBus规范支持有限的非常小的设备。它还限制了简单设备总线上的数据。
2.Send Byte
3.Receive Byte
接收字节与发送字节相似,唯一的区别是数据传输的方向。一个简单的设备可能有主机需要的信息。它可以通过接收字节协议来实现。位ACK表示读取位置结束。
4.Write Byte/Word
写字节/字访问的第一个字节是命令代码。接下来的一个或两个字节分别是要写入的数据。在本例中,主机发送从设备地址,后跟写入位。设备确认,主设备发送命令代码。从机在主机发送数据字节或字之前再次确认(低字节优先)。slave确认每个字节,整个事务由STOP结束。
5.Read Byte/Word
读取数据比写入数据稍微复杂一些。首先,主机必须向从设备写入一个命令。然后它必须在该命令后面有一个重复的启动条件,以表示从该设备的地址读取。从机然后返回一个或两个字节的数据。注意,在重复启动条件之前没有停止条件,并且NACK表示读取传输的结束。
6.Process Call
进程调用如此命名是因为命令发送数据并等待从服务器返回依赖于该数据的值。协议只是一个写字后跟一个读字,没有读字命令字段和WriteWord停止位。注意,在重复启动条件之前没有停止条件,并且NACK表示读取传输的结束。
7.Block Write/Read
块写入从地址和写入条件开始。主机描述了消息后面的字节数将在多个字节数之后出现。如果从机有20个字节要发送,字节计数字段的值为20(14h),后跟20个字节的数据。字节计数不包括PEC字节。字节计数可能为0。块读或块写最多允许传输255个数据字节。
块读取与块写入的不同之处在于,重复启动条件的存在是为了满足传输方向改变的要求。紧跟在停止条件之前的NACK表示读取传输的结束。
8.Block Write-Block Read Process Call
块写入块读取过程调用由两部分组成。调用从地址和写入条件开始。在命令代码之后,主机发出一个写字节计数(M),它描述了在消息的第一部分中还将写入多少字节。如果主机有6个字节要发送,字节计数字段的值为6(0000 0110b),后跟6个字节的数据。写入字节计数(M)可以为零。
消息的第二部分是一个读取数据块,以重复的开始条件开始,然后是从地址和读取位。下一个字节是读字节计数(N),它可能与写字节计数(M)不同。读取字节计数(N)可能为零。
组合数据负载不得超过255字节。此进程调用的字节长度限制总结如下:
• M ≥ 0 byte
• N ≥ 0 byte
• M + N ≤ 255 bytes
读取字节计数不包括PEC字节。从第一个从机地址开始,并使用常规的PEC计算规则,根据总消息计算PEC。强烈建议在块写入块读取过程调用中使用PEC字节。注意,在重复启动条件之前没有停止条件,并且NACK表示读取传输的结束。
9.SMBus Host Notify protocol
为了防止消息从未知设备以未知格式发送到SMBus主机控制器,只允许一种通信方法,即修改后的写字协议形式。通过用警报设备的地址替换命令代码来修改标准的写字协议。当SMBus设备成为主设备时,必须使用此协议,以便与充当从属的SMBus主机通信。
从SMBus设备到SMBus主机的通信以SMBus主机地址(0001 000b)开始。消息的命令代码是启动SMBus设备的地址。由此,SMBus主机知道以下16位设备状态的来源。状态的内容是特定于设备的。
SMBus主机必须支持主机通知协议。如果系统中的设备使用可选的SMBALERT#行,主机可以实现它。
10.Write 32 protocol
写32协议用于需要向从设备发送最多32位(4字节)数据的命令。此协议可用于发送少于32位的数据,但必须填充数据包以填充32位。数据或有意义的位被压缩到低阶位,未使用的高阶位用"0"填充。例如,20位值以bit[19:0]传输,最高有效位以bit[19]传输。bit[31:20]都是0。
11.Read 32 protocol
read32协议用于需要从设备读取最多32位(4字节)数据的命令。此协议可用于读取小于32位的数据,但必须填充数据包以填充32位。数据或有意义的位被压缩到低阶位,未使用的高阶位用"0"填充。例如,20位值bit[19:0]传输,最高有效位以bit[19]传输。bit[31:20]都是零。
12.Write 64 protocol
Write 64协议用于需要向从设备发送最多64位(8字节)数据的命令。此协议可用于发送小于64位的数据包,但必须填充数据包以填充64位。数据或有意义的位被压缩到低阶位,未使用的高阶位用零填充。例如,40位值以比特[39:0]传输,最高有效位以比特[39]传输。比特[63:40]都是零。
13.Read 64 protocol
Read 64协议Read 64协议用于需要从设备读取最多64位(8字节)数据的命令。此协议可用于发送小于64位的数据包,但必须填充数据包以填充64位。数据或有意义的位被压缩到低阶位,未使用的高阶位用零填充。例如,40位值以比特[39:0]传输,最高有效位以比特[39]传输。比特[63:40]都是零。