上节内容讲解了I2C的特点,地址匹配,通信速度等内容,本节将着重讲解I2C的读/写过程。I2C的读/写都是按照字节结构安排的,每个字节后面跟着应答,应答在写过程中由从设备给出,读过程的应答由主设备给出。
1. I2C写过程
写过程主要是由Master(主设备)发起如图1,在START + SLAVE ADDRESS之后是读/写控制位,如果该位为0,表示该阶段完成之后,紧跟着的就是写过程。写数据是按照字节组织的,也就是每次写一个字节就会等待从设备应答。至于一次交易可以写多少个字节,I2C的通用协议并没有规定,数据的内容也是根据主从双方的具体需要制定,比如EEPROM,在写存储器内容前,开始的一个或两个byte会规定为存储器阵列的地址,之后的数据解释为存储器的内容。通信过程如图2,

图1

图2
图2显示了I2C的写数据的过程,每个字节后设备都应该应答,但也有丢失应答的情况,称该应答为NACK。即= not acknowledge(SDA HIGH),如下几种情况会发生NACK:
- 在设备地址阶段,没有SLAVE匹配该地址,因此没有对应的设备应答
- 数据传输出错,或数据对于从设备无法理解
- 从设备忙于其它事务,无法对该数据做出应答
- 传输的数据数量超出从设备的处理范围。
第一种情况的处理办法是放弃与该地址设备通信,因为该设备不存在。其它都是主从协议或主从数据处理不匹配造成,如第三种情况,从设备可以拉低SCL进行通信延迟以平衡双方的事务处理。
在主设备发送完最后一个 byte,并得到从设备的应答后,即可发起停止(stop),结束整个通信过程。
二、 I2C 读过程
在图1中,如果读/写控制位为1,得到从设备应答后,紧跟的就是读数据过程。如图3,

图3
图3中,R/W#=1,表示其后的过程为读数据的过程,此时MASTER为输入,SLAVE为输出,应答也变成MASTER的行为。MASTER每接收一个byte的数据应答一次。直到MASTER确定已经完成数据读,在最后一个byte读完后应答NACK(注意不是ACK),紧接着由MASTER发起停止,主从双方都返回到空闲状态。至于一次读多少个字节,I2C通用协议并没有规定。数据内容也是主从双方根据具体的需要进行解释。
三、 I2C挂机(lockup)处理
由于I2C在通信时需要应答,在通信过程中很可能会出现挂机的情况,比如在从设备应答期间(SDA被从设备拉低)或从设备在数据阶段输出低电平时主设备突然复位,整个交易过程没有完成。从设备此时在等待主设备的下一个时钟阶段,主设备由于总线的SDA处在低电平而无法发起下一个起始(START),也无法发起停止(STOP),因此双方都处在一个等待阶段,此时I2C的总线处在挂死状态,如图4,5,解决挂死的条件是总线的SDA首先恢复到高电平,也就是从设备从低电平释放SDA。

图4

图5
挂机的处理一般采用如下方式,主设备将SDA置高(高阻),SCL连续发出9个完整的时钟,之后再跟着停止(STOP)即可解除。可以分析如下:
- 图4中恰好在应答阶段,主设备复位,也就是丢失了应答之后的时钟使从设备的低电平应答永远挂在那里。经过SCL9个时钟后,如果是写,第9个时钟恰好对应第二应答,此时SDA为高电平,相当于MASTER的NACK应答,之后发起停止,正好完成该次的I2C的整个交易过程。如果是读,也是对应从设备应答完成,后跟停止(STOP)即可完成I2C 的交易,回到空闲状态。
- 如果其它情况如图5(I2C 停在其它状态)是由于本次连续发送9个1,对于写过程随时可以发起停(STOP)状态。对于读过程,最严重是从设备输出一个字节0(8’h0),而挂机恰好停留在最高位上(最左边的位)这样在后面的每次SCL的周期内总线都输出0,但第8个SCL是主设备应答,由于主设备的SDA为高电平,因此该应答为NACK,由于从设备得到NACK应答已经做好停止的准备,再有更多的SCL与SDA,从设备也不会响应,直到主设备停(STOP)状态发起,从而使总线回到空闲状态。
- 健壮的系统,在上电后检查MASTER的SDA是否为低电平,如果是应通过发送复位码恢复系统。
四、I2C 总线的电平
由于众多的不同技术标准的设备(CMOS, NMOS,双极型晶体管)都可以连接到I2C总线上,因此对于逻辑0和逻辑1所对应的的电平并不固定,一般由每个芯片的VDD决定。对于输入参考电平一般规定如下:输入低电平VIL为0.3VDD,输入高电平为VIH为0.7VDD如图6,

图6
早期的传统器件由于采用TTL电平,当时对于电平的规定为VIL=1.5V, VIH=3.0V,所以该类器件对于输入电压的电平并不随VDD变化,在使用时应引起注意。
四、 I2C总线与SMBus 的区别与联系
在两线制的总线结构中还有一类总线称为SMBus (system management bus)或系统管理总线,该总线与I2C无论在电气特性还是协议方面都及其类似,因此许多工程师把它们混为一谈,其实它们还是有区别的。它们的异同点表现如下:
- I2C 总线是由Philip公司发明的,目前由NXP维护,而SMBus 由Intel公司及其合作伙伴于1995年发明的。
- 协议基本相同,都有启动,地址,应答,读写,停止等过程。但SMBus 又加入了二级的软件管理系统可以用于特殊的管理系统,特别是在器件地址选择阶段又加入了地址抉择协议,可以进行器件地址的动态分配,通过这种方式可以使得SMBus 器件或设备支持热插拔,并且做到器件识别地址自动分配,这在计算系统中应用极为广发。详细内容可以参照SMBus 协议
- 速度等级基本相同, SMBus 也规定了100K,400K,1M,3.4M四个等级,但I2C在最低数据传输速率上没有限制,比如100Kbps, 完全可以低于100K的速度进行传输,甚至可以低于1Bps的速度传输也是允许的,只是传输效率低而已。但SMBus 规定最低的传输速率为10Kbps,低于10Kbps为非法传输,因此经常利用3-5ms的时间间隔内没有SCl信号认为系统挂死,而复位系统。这在I2C上是不允许的。
- 电平的差异性,I2C总线规定VIL=0.3VDD, VIH=0.7VDD。而SMBus 规定VIL=0.8V ,VIH=2.1V这与I2C的电平要求有较大的差别。
除了以上介绍内容外,还有其它的内容比如I2C 总线的中继(repeater),集线器(hub),扩展器等内容,在后续的文章中会结合具体芯片加以介绍。