I2C总线(1)

来源:互联网 发布:林忆莲 再见悲哀 知乎 编辑:程序博客网 时间:2024/05/03 16:28

以下内容摘选自I2C的维基百科页

I2C是一种多主机,主从式,单端,串行,符合封包交换协议的总线接口。通常被用来在低速短距离的设备当中进行通信。

速度与节点数量

一般情况下I2C的参考设计中有7位或者10位的地址空间。标准模式下,一般的I2C的速度大约是100kbit/s,而在低速模式下速度仅为10kbit/s。在最近版本的I2C总线协议当中I2C的挂载节点和传输速度都有很大的提高。(Fast mode下可以达到400kbit/s,Fast mode plus下可以达到1Mbit/s,在High speed模式下速度可以达到3.4Mbit/s。)不过在实际当中,传输的bits并非全部用来传输数据。因而显见这些理论速度是难以达到的。比如其中的协议当中还规定了起始的地址位和ACK/NACK bits(用于应答的bit)。
可挂载设备节点数量主要是取决于地址位的数量。但是为了保持总线速率(主要是频繁充放电的影响),总线挂载电容必须要小于400PF。总线地址和总线电容决定了I2C总线可以连接的设备数目。

协议与传输方式

之所以名为I2C协议,是因为在他所定义的协议当中只有两条开漏传输脚–SCL(Serial Clock Line)和SDA(Serial Data Line)。在一般的I2C器件当中,通常会留2~3个用户可定义的“地址线”。以TMP175温度传感器为例,其内部有A0,A1,A2三条地址选择线。通过连接A0,A1,A2到地,到高电平,或者浮空(任选一种设备Datasheet里面定义的连接方式),里面会有对应的一个地址线,这个地址就是挂在该总线的对应的一个从设备的地址。

现在有了地址和两个传输线,就可以开始我们的传输了。首先SDA会发射一个Start信号(正如其他文献所说SCL为高电平,SDA由高变低),随后转为在SCL低电平时候开始传输bit位,SDA首先开始传输一个7位的地址线和一个1位的读写方向线(1为读,0为写)。此时对应的从设备开始对比自己设定的从设备地址,若二者比对成功,从设备回复一个ACK信号(SDA拉低确认即,active low for acknowledged)。随后主从设备握手成功,开始数据传输,每次主机每次发送读写请求,后面从设备都会发送一个ACK信号。在传输即将完成的时候,主设备会发送一个Stop信号(SCL为高电平,SDA由低变高)。一段传输宣告结束。

消息协议

简单的传输总是很美好,但是事实上大多数的传输都不会都只连接一个从设备,也不可能只开启依次传输。那么这就意味着会存在着一种混合信息传输模式(Combined message),在每次由Start传输开启的传输之后会有一个Repeated Start传输模式,他会连续发送多个Start信号,这样从机就会知道,这之后传输的数据只是混合信息的一部分。此模式下有一个明显的特点就是每次传输(或许是在不同设备间的传输)并非是以Stop为前端的。
另外的一个问题就是,纯粹的I2C定义只是定义了消息的传输流程,并没有定义消息的具体形式。但是在实际应用当中,各种设备不可能完全支持各种协议。于是乎就存在了更为轻便的SMbus和PMbus协议。这一点将在下一节着重叙述。