(这篇主要对象为固件工程师,简单介绍SMBus的一些基本概念而已)
概述
System Management Bus (简称SMBus或是SMB) ,是1995年由Intel提出的,用来访问主机板上的设备(EEPROM、温度感测器、电压感测器等) 并收集相应的资讯(SPD、温度、电压、版本号)。 SMBus和I2C很相近,都是由两条线: Clock (SMBCLK) 和 Data (SMBDAT) 所组成的。
SMBus 通讯协议主要可以分为物理层,数据链路层和网络层三层
The Physical Layer (物理层):
不同的设备要在同一条SMBus上进行沟通预计将在至少两个具有不同电气要求的互斥环境中运行。这部分主要定义电压电平、噪声容限等。 (主要偏硬体,我也不太熟)
可以注意的地方是,SMBCLK和SMBDAT必须要设为 open drain,并且在bus没有使用的时候,两条线都需要 pull up
The Data Link Layer (数据链路层):
收到讯号之后,就可以解析讯号。 SMBCLK 通常由Master操作,目前SMBus spec定义三种频率:100 kHz、400 kHz 和 1 MHz。一般SMBDAT 是在SMBCLK low 变化,SMBCLK high 时是有效值,所以经验上来看,SMBus 两端device 的 clock frequency不需要设成一样,运作上slave 不用知道 clock frequency,只要它来得及处理就可以。解析讯号可以分为三个部分:
(1) Start and Stop
Start:在SMBCLK为high的时候,SMBDAT从high变low,表示开始通讯
Stop:在SMBCLK为high的时候,SMBDAT从low变high,表示结束通讯
(2) ACK (Acknowledge)
ACK表示收到了,就是SMBCLK为high的时候,SMBDAT为low
如下图,红色和蓝色的动作都是指在同一条SMBDAT上,前面有提到SMBDAT是必须设为 open drain,所以传送者和接收者两端都可以对其做操作。
因为SMBDAT没有人操作的时候,需要pull up,因此如果传送完8个bit,接收者没有回覆ack,就表示not ack(没人收到东西)
(3) Data Transfer
在 START 条件 (“S”) 之后,Master会先传送欲沟通的设备之 7 bits address。 Address后边跟的第8个bit是R/W#,0表示写入,而1表示数据读取。
在传送数据的时候,如果SMBCLK high的时候 SMBDAT 为high表示要传送的数据是1,反之如果SMBDAT为low表示要传送的数据为0。
最后资料传输由Master产生的 STOP (P) 条件终止。
Network Layer (网路层) :
这边就是将数据链路层解析出来的数据,解析欲执行动作,并作相对应处理。 SMBus有定义一些指令,例如下图,详情参阅 SMBus Specifications
但是通常这部分详细指令对应行为,还是会去参考设备的文件,这边用4-Kbit Serial Presence Detect (SPD) EEPROM compatible with JEDEC EE1004 (st.com) 举个简单的例子
它的spec中定义,Start之后第一个byte为slave address,第8个bit设为0表示write,后面接的byte就表示想要读取的offset (偏移量)
接着传送一个Re-Start,传送slave address,第8个bit设为1,Slave回复ack之后,会接着回覆该offset所存放的数据,直到Master发起Stop讯号
下图的Random Address Read对应SMBus Command 就是Read Byte
Seqential Random Read应该比较像 Read 32吧,不完全一样,有一点点变形