I2C知识大全系列二 —— I2C硬件及时序
I2C硬件接口
I2C的数据(SDA)和时钟(SCL)信号都是双向的,通过电流源或上拉电阻接到电源,VDD大小取决于I2C设备接口的耐压能力。两根线都为高时,总线处于空闲状态(IDLE)。I2C接口的特殊构造以实现“线与”功能,即每个信号接口都分为输出的漏极开路(或集电极开路)和输入缓冲器部分。
I2C硬件连接示意图如下所示:
线与功能
漏极开路/集电极开路的特点是不能输出高电平,必须通过外接上拉输出高电平。如果总线上有任何一个设备接口输出低电平,则整个总线的状态表现为低电平,由此实现I2C总线信号的“线与”功能。
“线与”功能的好处在于可以实现总线的仲裁控制。总线的控制权会交给最后一个输出低电平的设备,其它设备(输出为高)通过检测总线上的电平状态(表现为低),对比与自己输出状态不一致,则自动退出对总线的控制请求。
漏极开路/集电极开路的缺点是对于一个距离长的数据线,信号传输速率得不到有效保证。更长的走线对于输出驱动器表现为更大的容性负载,等效容性负载C和信号线的上拉电阻R构成RC振荡器。RC越大,意味着反射和振荡越强,从而影响总线的信号完整性。这也是I2C规范对总线电容值约束在400pf以内的原因。高速模式(Hs)对信号完整性的要求更高,协议有定义相关SDA/SCL处理办法,以保证在数据线够长、速率够高时,信号完整性也可以得到满足。
主从与收发
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。
(1)如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送。
(2)如果主机要接收从器件的数据,首先由主机寻址从器件。然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据传送。
数据有效性
每传输一比特数据SDA,对应产生一个时钟脉冲SCL。SCL为高时,SDA不允许变化;只有在SCL为低时,SDA才可以变化。如下图所示:
开始和结束条件
开始条件(S):SCL为高时,SDA由高变低;
结束条件(P):SCL为高时,SDA由低变高。
开始/结束条件总是由主机(Master)发起的。主机发出开始条件(START)后,总线处于忙状态;主机发出结束条件(STOP)后,总线处于空闲状态。
在操作中,如果主机发出重复开始条件(repeated START,Sr)而非结束条件(STOP),则总线仍处于忙的状态。也就是说,重复开始条件(Sr)和开始条件(S)在功能上是相同的。在本文(协议)中,除非特别说明,开始条件和重复开始条件统一表述为S。
I2C总线的数据传输
SDA上传输字节数据必须是8比特长度,每次传输不限定传输的字节数。每个字节(8位)数据传送完毕后紧接着应答信号(第9位,Acknowledge Bit)。数据传输过程中,先发送高位(MSB),再发送低位(LSB)。如果在数据传输过程中,从机如果没有准备好接收或发送下一个字节(比如内部中断需要处理等),它可以通过拉低SCL强制主机进入等待状态。直到从机释放SCL,主机才开始下一个字节的发送或接收。如下图所示:
应答与非应答
协议规定数据传输过程必须包含应答。接收器通过应答(1 bit)通知发送的字节已被成功接收,发送器可以进行下一个字节的传输。主机产生数据传输过程中的所有时钟,包括应答的第9个时钟。发送器在应答时钟周期内释放对SDA的控制,这样接收器可以通过将SDA拉低通知发送器数据已被成功接收。如下图所示:
应答
SCL为高的时候,SDA数据才是有效的,因此接收器发送ACK时,要保证SCL为高的同时,SDA为低电平;建立和保持时间也要满足规范要求。如果在第9个时钟周期,SDA为高,表明接收器无应答(NACK),主机可以据此发出结束条件(STOP)命令结束此次传输,或发起重传请求(repeated START)重新传输数据。
无应答
有5种情况可能导致无应答(NACK):
- 总线上没有对应地址的接收器件
- 接收器件没有准备好与主机的通信
- 接收器件无法解析读取的数据
- 接收器件无法收取更多的数据
- 主机作为接收器(Master-Receiver)时,在读取从机(Slave-Transmitter)发出的最后一个字节数据后,发出NACK通知从发送器释放数据线SDA,以便主机发起结束(STOP)或重传(Sr)指令