16. I2C 协议
IIC-BUS(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发。 主要是用来方便微控制器与外围器件的数据传输。 它是一种半双工,由SDA(数据)和SCL(时钟)组成的两线式串行传输总线。
最新的I2C协议规范是2021, I2C spec
16.1 物理信号
I2C由一条时钟线和一条数据线组成。 上图是IIC协议数据传输的基本形式。
I2C的输入输出结构采用的是开漏的结构。 开漏结构不能够自主得到高电平,所以需要通过外部上拉电阻Rp来的实现IIC通信过程中的高电平。 Rp的大小取决于I2C不同模式时的灌电流大小。
图16-2和图16-3是描述I2C获得高低电平的情景。 因为一条I2C总线上面可能会同时连接上多个设备,如果I2C使用的是推挽输出的话容易引起短路。 I2C设备可以通过控制N-MOS管的开关来控制输出信号的电平高低。 当MOS管G极为低电平时MOS管截止I2C总线上面由于有上拉电阻的存在而为高电平; 当MOS管G极为高电平时MOS管导通,I2C总线相当于直接接地为低电平。
I2C的输入是通过TTL肖特基触发器将数据传输到输入数据寄存器当中,再提供给处理器处理。
I2C的电平标准:
由于种类的设备都有可能连接到I2C总线上面,比如说CMOS、NMOS等,所以I2C的高电平和低电平的标准是不一定的。高电平和低电平的值分别为0.7VDD和0.3VDD。
16.2 总线连接
I2C是主从连接, 在一个I2C bus上面只能有一个master, 可以有多个slave。
I2C的时钟线总是由主机控制,主机与从机之间的数据传输只在SDA一根线上完成,不能同时发送和接收数据,所以I2C是一种半双工的通信协议。一条I2C总线上面可以挂载多个设备,每一个设备都有其对应的设备地址,设备之间数据传送只能由一个设备传送给对应地址的设备。
16.3 协议规范
16.3.1 编码规则
起始、停止条件:I2C的起始信号为当时钟信号线(SCL)为高电平时,数据线(SDA)产生一个下降沿,停止信号为当时钟信号线(SCL)为高电平时,数据线(SDA)产生一个上升沿。
应答位、非应答位:当主机传送8位数据结束后,主机会将SDA线拉高,此时如果从机正确接收数据则会将SDA拉低并在SCL高电平时保持低电平,这个信号为ACK信号。如果在传输8位数据后从机没有将SDA拉低则该信号为NACK。如果出现NACK则表示数据传输出错。
数据有效性:当时钟信号为高电平的时候,数据线上的信号需要保持不变也就是在时钟线为高电平的时候数据线出现上升下降沿的话就会产生停止和启动信号,从而导致数据的传输出错。
数据组织:SDA上的数据传输是以8bit即一个字节为单位传输的,每一次传输的字节数没有限制,每传输完一个字节后必须跟随一个应答位。
我们以01001011(0X4b)为例,其时序图如下:
16.3.2 信号传输
I2C总线上面的每一个设备都有唯一的地址与之对应,信号传输时也是根据指定的地址找到设备来传输信号。
写操作:主机确定了从机的设备地址后,生成一个开始信号,然后向IIC总线上面发送设备的地址和读写方向标志。从机检测到该地址和自己设备地址相对应后,回复主机一个应答信号。主机接收到应答信号后就开始向这个设备以字节为单位发送数据,每一个字节后面都会带有从机的应答信号,直到主机发送完成最后一个数据后生成一个停止信号结束此次数据的传输。
读操作:读操作与写操作有一些类似,同样的是需要确定需要读取的从设备的地址。然后主机生成开始信号,再向IIC总线上发送从设备的地址和读数据的指令。从设备接收到地址与自己的吻合后会产生一个应答信号。就这从设备就开始向主机发送主机想要读取的数据,主机正确接收数据后会向从机回复应答信号,当主机想要结束读取操作时,主机会回复一个非应答信号,然后生成停止信号结束数据的读取。
16.3.3 时钟频率
I2C 总线支持多种通信速率,常见的有:
- 标准模式(Standard mode):100kbps
- 快速模式(Fast mode):400kbps
- 高速模式(High-speed mode):3.4Mbps
16.3.4 寻址机制
I2C 使用7 位地址空间,最多可寻址127 个从设备。地址空间的前7 位用于指定从设备,最后1 位用于表示读/写方向。
每一个12C 外设都会对应一个唯一的地址(这个地址可以从I2C 外设器件的数据手册中得到),主机和从机之间的通信就是通过这个地址来确定主机要和哪个从机进行通信的。