The I2C-bus is for bi-directional, two-line communication between different ICs or modules.
I2C (Inter Integrated Circuit,内部集成电路) 总线是价格低廉却很有效的用以互连小规模嵌入式系统内的外设的网络。I2C 总线用两根线来连接多支路总线中的多个设备。这种总线是双向、低速的,并与公共时钟同步。可以直接将一个设备接到 I2C 总线上或是从该总线上取下,而不会影响其他设备。I2C 总线的数据传输率比 SPI 总线要慢一些,在标准模式下的传输速度为 100kbps,在快速模式下为 400kbps。
利用 I2C 接口在设备之间进行连接使用的两根线是 SDA (串行数据) 和 SCL (串行时钟),它们都是开漏,通过一个上拉电阻接到正电源,因此在不使用的时候扔保持高电平。使用 I2C 总线进行通信的设备驱动这两根线变为低电平,在不使用的时候就让它们保持高电平。每个连到 I2C 的设备都有一个唯一地址,这个设备可以是数据发送者 (总线主机)、接收者 (总线从机),也可以二者都是。I2C 是多主机总线,这意味着可以有多个设备充当总线主机的角色。
SDA 和 SCL 都是双向的。SPI 总线有两根单独的线,分别用于两个方向的通信,而 I2C 总线不同,它使用同一根线来完成主机发送数据和接收从机响应。
由于 I2C 是多主机总线,因此存在同一时刻会有多个主机试图开始数据传输的可能。为了避免混乱, I2C 总线要通过总线仲裁,以决定由哪一台主机控制总线。I2C总线上的每个设备都有一个唯一的地址,数据包传输时先发送地址位,接着才是数据。一个地址字节由 7 个地址位和 1 个指示位组成。如果指示位是 0,意味着这个传输是一个写操作,被选中的从机将接收数据并将其作为输入;如果指示位是 1,就要求从机将数据发送回主机。
- (1) SCL(serial clock):时钟线,传输 CLK 信号,一般是 I2C 主设备向从设备提供时钟的通道
- (2) SDA (serial data):数据线,I2C 通信的通信数据都通过 SDA 线来传输
低速率:I2C 一般是用在同一个板子上的两个 IC 之间的通信,而且用来传输的数据量也不大,所以本身通信速率很低(一般几百 KHz,不同的 I2C 芯片的通信速率可能不同,具体编程的时候要看自己所使用的设备所允许 I2C 的最高通信速率,不能超过这个速率)
3.1 写过程
可以总结为以下过程:
1、发送起始位
2、发送设备地址信息(写)
4、发送寄存器信息(cmd+addr/cmd/addr)
5、发送数据信息
6、发送停止位
上述过程省略了等待应答,每发送一个字节数据都会等待应答。
3.2 读过程
读过程相对来讲会复杂一些,需要先写(写要读的寄存器)再读。并且读的时候由主设备发送 ACK
1、发送起始位
2、发送设备地址信息(写)
4、发送要读的寄存器信息(cmd+addr/cmd/addr):第一次通信把data读到I2C输出buffer
5、重新开始,restart
6、发送设备地址信息(读)
7、读取数据:第二次通信直接读取buffer里的data
8、接收完毕,发送 NAK
9、发送停止信号