一、什么是I2C?
I2C是一种同步串口总线的协议,由NXP公司设计。主要的架构为一主多从。为什么IIC是同步串口总线?因为它是通过两根线在主控制器和从机进行通讯,一根为同步时钟线(SCL),一根为串行数据线(SDA)。两根总线需要上拉电阻,总线在空闲的时候SCL和SDA都处于高电平。IIC总线的标准模式下速度可以达到100Kb/s 快速模式下可以达到 400Kb/S。
二、IIC的架构
IIC是一主多从的架构,也就是一个可控制器下可以挂载多个IIC的从设备。那么通讯的时候是确定是和哪个设备通讯的呢?每个IIC的从设备都有自己的器件地址,一般是7位的地址。这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备了。以下是一个IIC的基本框架接线图。
SDA 和 SCL 这两根线必须要接一个上拉电阻,一般是 4.7K。其余的 I2C 从器件都挂接到 SDA 和 SCL 这两根线上,这样就可以通过 SDA 和 SCL 这两根线来访问多个 I2C设备。
三、IIC的速率
IIC的速率是由主设备决定的。这个也比较好理解:谁控制了SCL同步时钟线谁就控制着速率。但是速率不是随便来设定的,需要考虑从机以及电路的特性,以免超出从机的上限,导致数据无法解析。IIC总线的标准模式下速度可以达到100Kb/s 快速模式下可以达到 400Kb/S。当然,还有更高的速率,具体可以参考彻底搞懂IIC总线(5)I2C总线传输速度详解这篇博文
四、IIC的协议部分
这部分是比较重要的部分,IIC主要可以分为读以及写。那么IIC是怎么在主从机实现读写的呢?下面就涉及到读写的时序,在描述读写时序前,我们先来了解一些术语
1、空闲状态
之前说过,两个总线是要通过电阻上拉的。所以在空闲状态下,SDA和SCL都处于高电平。
2、数据位
I2C 总线在数据传输的时候要保证在 SCL 高电平期间,SDA 上的数据稳定,因此 SDA 上的数据变化只能在 SCL 低电平期间发生,如下图所示:
3、起始位
IIC通信的起始标志,通过起始位“唤醒”从机做好数据接收的准备。时序如下图所示
在 SCL 为高电平的时候,SDA 出现下降沿就表示为起始位。如果不好记忆,可以通过一定的逻辑推出。起始位一定是从空闲状态产生的。开始的时候,SDA和SCL都是高电平。根据数据传输的时序,SDA线在SCL为高电平是应该保持稳定的,如果SDA在SCL电平的情况下,从空闲位(高电平)被拉到底电平,就会触发起始标志了
4、停止位
停止位就是停止 I2C 通信的标志位,和起始位的功能相反
在 SCL 位高电平的时候,SDA出现上升沿就表示为停止位。可以通过逻辑推出,推出过程起始位基本一致
5、应答信号(主从ACK,从主NOACK)
当 I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态,等待 I2C 从机应答,也就是等到 I2C 从机告诉主机它接收到数据了。应答信号是由从机发出的,主机需要提供应答信号所需的时钟,主机发送完 8 位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过将 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败。
当 I2C 从机发送完 8 位数据以后主机会在下个时钟周期把 SDA 拉高触发NOACK,随后SCL拉低,SDA拉低,最后SCL拉高保持空闲,SDA拉高触发STOP信号,之后SDA保持空闲电平等待下一次数据传输
6、IIC写时序
具体步骤:
1)、开始信号。
2)、发送 I2C 设备地址,每个 I2C 器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个 I2C 器件。这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为1 的话表示这是一个读操作,为 0 的话表示这是一个写操作。
3)、 I2C 器件地址后面跟着一个读写位,为 0 表示写操作,为 1 表示读操作。
4)、从机发送的 ACK 应答信号。
5)、重新发送开始信号。
6)、发送要写写入数据的寄存器地址。
7)、从机发送的 ACK 应答信号。
8)、发送要写入寄存器的数据。
9)、从机发送的 ACK 应答信号。
10)、停止信号。
7、I2C 读时序
I2C 单字节读时序比写时序要复杂一点,读时序分为 4 大步,第一步是发送设备地址,第二步是发送要读取的寄存器地址,第三步重新发送设备地址,最后一步就是 I2C 从器件输出要读取的寄存器值,我们具体来看一下这几步
1)、主机发送起始信号。
2)、主机发送要读取的 I2C 从设备地址。
3)、读写控制位,因为是向 I2C 从设备发送数据,因此是写信号。
4)、从机发送的 ACK 应答信号。
5)、重新发送 START 信号。
6)、主机发送要读取的寄存器地址。
7)、从机发送的 ACK 应答信号。
8)、重新发送 START 信号。
9)、重新发送要读取的 I2C 从设备地址。
10)、读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。
11)、从机发送的 ACK 应答信号。
12)、从 I2C 器件里面读取到的数据。
13)、主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。
14)、主机发出 STOP 信号,停止 I2C 通信。
8、I2C 多字节读写时序
有时候我们需要读写多个字节,多字节读写时序和单字节的基本一致,只是在读写数据的时候可以连续发送多个自己的数据,其他的控制时序都是和单字节一样的。