浅谈I2C总线,有时候它也叫 IIC
I2C(Inter Integrated Circuit,内部集成电路)总线是价格低廉却很有效的用以互连小规模嵌入式系统内的外设的网络。I2C 总线有时候也叫作 IIC,它已有20多年的历史了。I2C 接口和 SPI 接口的作用相同,但二者的使用方法有些不同。
I2C 总线用两根线来连接多支路总线中的多个设备。这种总线是双向、低速的,并与公共时钟同步。可以直接将一个设备接到 I2C 总线上或是从该总线上取下,而不会影响其他设备。一些生产商比如 Microchip 公司、Philips 公司、Intel 公司等生产的小型微处理器都内置了 I2C 接口。I2C 总线的数据传输率比 SPI 总线要慢一些,在标准模式下的传输速度为 100kbps,在快速模式下为 400kbps。
利用 I2C 接口在设备之间进行连接使用的两根线是 SDA(串行数据)和 SCL(串行时钟),它们都是开漏,通过一个上拉电阻接到正电源,因此在不使用的时候扔保持高电平。使用 I2C 总线进行通信的设备驱动这两根线变为低电平,在不使用的时候就让它们保持高电平。每个连到 I2C 的设备都有一个唯一地址,这个设备可以是数据发送者(总线主机)、接收者(总线从机),也可以二者都是。I2C 是多主机总线,这意味着可以有多个设备充当总线主机的角色。
图1. I2C总线连线图
SDA 和 SCL 都是双向的。SPI 总线有两根单独的线,分别用于两个方向的通信,而 I2C 总线不同,它使用同一根线来完成主机发送数据和接收从机响应。另外,与 SPI 总线具有多个工作模式不同,I2C 总线只有一个工作模式,时钟线 SCL 和数据线 SDA 之间的时序关系很简单直观:当空闲的时候,SDA 和 SCL 都是高电平,只有 SDA 变为低电平,接着 SCL 也变为低电平时,才开始 I2C 总线的数据传输。当 SDA 和 SCL 都变为低电平时,就是告诉总线上的所有接收设备数据包的传输开始了,在 SCL 变为低电平后,SDA 才发送第一个有效数据位,这称为开始条件。
对于被传输的每一位,当 SCL 为低电平时在 SDA 上必须变为有效,该位是在 SCL 的上升沿对 SDA 上的数据位进行采样的,也必须一直保持有效直到 SCL 再次变为低电平,然后 SDA 就在 SCL 再次变为高电平之前传输下一位。
最后,SCL 变为高电平,接着 SDA 也变为高电平,数据传输结束。这被称为结束条件。
图2. I2C总线传输的开始条件和结束条件
无论多大的数据包都可以通过 I2C 总线进行传输。像 SPI 总线一样,I2C 也是高位先传输。如果数据接收者无法再接收更多的数据,它可以通过将SCL保持低电平来中断传输,这样可以迫使数据发送者等待,直到 SCL 被重新释放。
发送方发出的每个字节都必须经过接收方确认,每个字节的第8位数据一旦传送结束,发送方就释放数据线 SDA,然后主机在 SCL 上产生一个额外的时钟脉冲,这会触发接收方通过将 SDA 置为低电平来表示接收到的字节进行确认。如果接收方没有能将 SDA 置为低电平,发送方就会中断传输,并且采取适当的错误处理措施。
图3. 带有接收方确认的I2C数据包
由于 I2C 是多主机总线,因此存在同一时刻会有多个主机试图开始数据传输的可能。SPI 总线使用一个独立的片选端来使接收从机有效,每个 SPI 从机都有一个单独的片选端,由主机驱动。I2C 没有这样的选择机制,不过总线上的每个设备都有一个唯一的地址,数据包传输时先发送地址位,接着才是数据。一个地址字节由7个地址位和1个指示位组成。如果指示位是0,意味着这个传输是一个写操作,被选中的从机将接收数据并将其作为输入;如果指示位是1,就要求从机将数据发送回主机。
I2C 总线还支持一个扩展的10位寻址模式,可连接的外设数量可达1024个,使用7位寻址模式的设备和10位寻址模式的设备可以在同一个系统中混合使用。10位寻址时,使用2个字节来保存地址。如果第1个地址字节以0b11110xx_开始,就会产生一个10位地址,第1个字节的第1、2位(第0位是读写指示位)和第2个字节的8位合起来构成10位的地址。而7位设备将会忽略这个过程。
图4. I2C普通的和带重复开始条件的7位地址格式
图5. I2C总线10位地址格式