前言
本文主要是记录和总结笔者在学习开发I2C外设驱动过程中的心得,包括I2C总线协议的通信方式、数据格式,SMBus协议与I2C的异同点等内容。笔者也是初步接触相关知识,文章内容多有参考网上资料,如有谬误,请评论指出,不胜感激!
I2C总线协议
I2C总线协议介绍
I2C 是一种由飞利浦公司在上世纪80年代开发的两线式串行总线,用于连接微控制器及其外围设备进而实现设备间的半双工通信。
主要特点:
- I2C总线由两根双向的信号线组成,SCL时钟线和SDA数据线;
- I2C总线是一种多主机总线,设备只要可以进行数据的发送和接收都可以作为主机;
- I2C总线上的设备只存在简单的主/从机关系,而设备都具备一个唯一的7位(或10位)地址;
- I2C总线上的数据传输和时钟频率由主机设备控制,同一时间只能有一个主机进行通信;
I2C总线传输过程和数据格式
- SDA和SCL的特定组合表示总线开始或结束一次数据传输:
- 开始条件(S):SCL为高时,SDA由高变低;
- 结束条件(P):SCL为高时,SDA由低变高。
- 开始条件后跟一个8bit的数据位,从最高有效位(MSB)开始传输;
- 数据位结束之后接着ACK应答信号(第9位,Acknowledge Bit)
SMBus协议
笔者补充:笔者认为从物理层看,除开二者的电气特性和SMBus Alert功能(多加了一条线)外,二者通信过程(时序和数据格式)一致。所以笔者认为,可以把SMBus看作是定义更加严格、功能更丰富一些的I2C,一般通信过程二者是可以直接互通的。
SMBus协议介绍
SMBus同样由两根双向的信号线组成,基于I2C总线的工作原理。与I2C类似,两条信号线分别为SMBCLK与SMBDAT,即一条时钟线一条数据线,并且这两条信号线都是双向的,另外SMBus还有一条可选的Alert信号线(后面章节会单独介绍SMBus Alert功能)。
与I2C相同:
- SMBCLK为高时,SMBDAT由高到低转换表示启动条件。
- SMBCLK为高时,SMBDAT由低到高转换表示停止条件。
*启动和停止条件始终由总线控制设备生成。在启动状态后,总线被视为繁忙。在停止条件下或SMBCLK和SMBDAT线路均保持高电平超过最大超时时间后,总线再次空闲。
SMBus通信的起止条件时序示意图
SMBus传输时序与数据格式
- 数据在SMBus上是按字节(byte)进行传输的,每个字节由8位(bit)组成,由最高有效位(MSB)开始传输。另外总线上传输的每个字节后面必须跟一个确认位;
- 在START条件后,控制设备将其想要寻址的目标设备的7位地址放在总线上。地址为7位长,后跟第八位,表示数据传输的方向(R/W#);0表示写入数据,而1表示数据读取数据,最后整个过程由控制设备生成的STOP条件终止;
- 在数据传输时序方面,I2C与SMBus是相同的;
SMBus总线上的设备类型
SMBus协议是一种多主机总线,在SMBus协议中设备的类型分为以下三种:
- 控制设备(Controller devices)
- 目标设备(Target devices)
- 主机(Host)
控制设备 | 目标设备 | 主机 |
控制设备在通信过程中负责发出命令,生成时钟,控制启动和停止条件; 根据传输的需要,控制设备可以向目标设备发送数据,也可以从目标设备读取数据; 在SMBus中可以存在多个控制设备。 | 目标设备根据控制设备的发出的命令响应自己的设备地址; 根据传输的需要,目标设备可以从控制设备接收数据,也可以向控制设备发送数据; *目标设备在某些情况下可以成为控制设备,例如响应SMBus主机通知协议(SMBus Host Notify protocol)时。 | 主机是一个专用控制设备,为系统的CPU或系统管理处理器提供主接口。 主机必须支持SMBus主机通知协议。 *一个系统当中可以不存在主机,但最多存在一个主机。 |
SMBus总线特点
电气特性
- I2C的[R1]规范中有讨论将电源电压最大支持到12V设备的情况,而SMBus(V3.0)规范要求设备的标称电源电压限制为最小1.8V,最大5V;
- I2C和SMBus的逻辑输入电压阈值也不同;I2C要求VIL(Low-level Input Voltage)为VDD的30%,VIH(High-level Input Voltage)为VDD的70%;SMBus规范要求阈值固定,VIL为0.8V,VIH为1.35V;
*通常情况下,即便逻辑输入电压阈值不同,在SMBus规范允许的电源电压范围内,I2C和SMBus设备也能进行互通。
总线速率与时钟延迟
SMBus与I2C的最小总线速率和最大时钟延长不同:
- I2C总线规范没有限制最小时钟频率和延长时钟低电平的时限;
- SMBus要求最低工作频率为10kHz,也限制了控制设备在信息的每个字节内延长时钟低电平的最大时间为25ms,目标设备在信息的每个字节内延长时钟低电平的最大时间为10ms;
I2C与SMBus总线传输协议差别
- I2C只规定了数据在设备间的传输方式,具体的数据格式由设备厂商决定;
- SMBus规范定义了一个SMBus设备与另一个设备通信时必须使用的面向命令的协议:
- 这些协议的包括:快速命令、发送字节、接收字节、写入字节/字、读取字节/字、处理呼叫、块写入/读取、块写入块读取过程调用、SMBus主机通知协议、写/读32/64(bits)协议(在下一小节会详细介绍);
*SMBus规定的11种不同的命令协议是需要用户软件自行实现的,ip层面上(除了快速命令协议)一般没有对应的控制寄存器去控制相关协议的使用场景;
*协议中提到的command code跟具体设备有关系,要依据设备去选择发送的code,例如读取设备的eeprom时,command code就是eeprom的memory address;
SMBus规范协议
快速命令协议
快速命令协议只是发送目标设备的地址附带读/写位用于简单地打开或关闭设备,不进行数据的发送或接收。
发送/接收字节协议
发送字节
接收字节
控制设备发送目标设备地址,匹配后并通过写/读位向目标设备发送/接收数据。
写/读字节协议
写字节协议是在控制设备发送了目标设备地址和写请求后跟一字节的命令码,表示写入数据的寄存器地址,最后跟要写入的字节数据;
而读字节协议有所不同,控制设备需要先发送目标设备地址和写请求以及读取数据的寄存器地址,之后重发启动条件,表示从该设备的地址进行数据读取。
处理呼叫协议
该协议是在读字协议发送命令码之后跟一个字的数据,要求设备返回一个依赖于发送数据的字数据。
写入/读取块协议
写入块数据
读取块数据
块写块读呼叫处理协议
*前半段发送的数据位数(Byte Count)和后半段接收的数据位数可以不同
写/读32bits协议
写32bits协议
读32bits协议
主机通知协议(Host Notify protocol)
协议内容:
- SMBus中的主机设备需要支持该协议,主机设备会对主机地址(0b0001 000)进行响应;
- 在协议中,发起SMBus的设备将作为master,把主机设备当作slave进行写数据;
通信格式如下图所示:
SMBus主机地址(0x08)是协议要求预留的特殊地址,一般不允许占用;
发起通信的设备会在第一个byte把自己设备的地址发出,主机设备由此可以知道信息的来源设备,之后会加上代表设备状态的数据;
应用场景:新设备在总线热拔插后用于通知主机新设备的状态信息;
SMBus数据包错误检查
数据包错误检查(PEC,Packet error checking)的功能通过在每个消息传输结束时附加数据包错误代码(PEC)来实现。在SMBus支持的所有传输协议中,除了快速命令(Quick Command)和主机通知协议(Host Notify protocol),都可以把PEC作为一个可选项附加在数据段之后。
PEC是一个CRC-8错误检查字节,根据所有消息字节(包括地址和读/写位)计算。PEC由提供最后数据字节的设备附加到消息中。
以发送字节协议(Send Byte protocol)数据格式为例:
带PEC的数据段
不带PEC的数据段
SMBus Alert信号线
SMBus中存在可选的第三根信号线——Alert信号线。 目标设备可以通过该信号引脚向主机设备发送想要通话的请求,当目标设备在发出Alert信号之后,会同时把Alert信号线拉低并启用ARA(Alert Response Address警报响应地址)准备进行Alert地址响应;
主机设备接收信号并处理Alert中断,同时通过ARA(0b0001100)访问所有SMBALERT设备。只有将SMBALERT引脚信号拉低的设备才会响应ARA。
Alert过程的数据格式:
- 如果多个设备将ALERT拉低,则最高优先级(最低地址)的设备将在目标地址传输期间通过标准仲裁赢得通信权限。
- 在收到NACK(表示控制设备读取传输结束)后,目标设备必须停止下拉SMBALERT信号。