I2C总线协议

概述

I2C总线协议:飞利浦公司(Philips)为了使得硬件效益最大电路最简单,缩减生产成本而设计开发出来的一种简单的双向两线总线。通过该总线协议,可以有效地在IC之间进行数据的传输,实现IC之间的读写控制。现实中,许多硬件模块都是支持I2C协议的,比如:液晶模块、AT24XX存储芯片模块、高精度时钟模块、数字温湿度传感器等等。

常用I2C模块

术语

缩写 描述
发送器(Transmitter) 向总线发送数据的设备
接收器(Receiver) 从总线接收数据的设备
主机(Master) 发起传输,产生时钟信号并终止传输的设备
从机(Slave) 能被主机寻址的设备
多主机(Multi-master) 在不破坏数据的情况下,可以同时有多个主机控制总线
仲裁(Arbitration) 如果多台主机试图同时控制总线,只有一者可以做到,且获取到的数据正确
时钟同步(Synchronization) 同步两个或多个设备的时钟信号
LSB(Least Significant Bit) 低有效位
MSB(Most Significant Bit ) 高有效位
REPEATED START 重复START信号,用于组合格式协议中从写模式切换到读模式。其总是出现在ACK之后,表示地址阶段的开始。

I2C总线特点

a. I2C属于主从结构,包括一主多从结构,也存在着多主多从结构。但是,多主这种情况用得不多,并且在通信过程中涉及到到时钟同步和仲裁机制以防止数据损坏,通常比较复杂,这里暂且就不进行分析了。

b. 在所有数据传输中,都是由master发起的,slave只能进行接收或者回应。slave是不能主动发起传输。对于master,当其进行写操作时,可以称之为发送器;当期进行读操作时,可以称之为接收器,这只是概念性的一个区分,有个了解即可。

c. I2C总线只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL,支持双向传输,属于半双工通信模式。

d. I2C从设备不可以通过片选信号选定。既然I2C总线支持一主多从,那么当在总线上挂接多个I2C设备,协议怎么知道去选择哪一个从设备通信呢,所以,连接到总线的每个设备都是通过一个唯一的地址以供主机进行软件寻址。

e. I2C总线速率:

标准模式(Standard-mode): 速率高达100kbit/s

快速模式(Fast-mode): 速率高达400kbit/s

快速模式+(Fast-mode Plus): 速率高达1Mbit/s。

高速模式(High-speed mode): 速率高达3.4Mbit/s

超快速模式(Ultra Fast-mode): 速率高达5Mbit/s(限单向)

常用的是标准模式和快速模块,对于通信速率大于等于1Mbit/s的通信模式,要查看IC SPEC确认是否需要重新配置上拉电阻阻值或者使能某些模式等。

f. 技术兼容。在所有总线速率模型中,I2C协议可以完全向下兼容比最高总线速率更低级别的速率模式。7位地址和10位地址可以连接到同一I2C总线,并且可以在所有总线速率模型中使用。

g. 应用技术场景广。包括:系统管理总线(SMBus),电源管理总线(PMBus),智能平台管理接口(IPMI),显示数据通道(DDC)和先进电信运算架构(ATCA)等

I2C通信过程

空闲状态

当总线处于空闲状态时,SDA和SCL线皆被上拉至高电平,而连接到总线的器件的输出级必须要有一个开路漏极或开路集电极去实现“线与”功能。

起始条件和结束条件(S/Sr & P)

STOP 条件

所有的传输都是以START信号为起始条件,以STOP信号为结束条件。

起始条件(S/Sr):当SCL为高电平时,SDA从高电平拉为低电平

停止条件(P):当SCL为高电平时,SDA从低电平拉为高电平

START和STOP信号都是由主机控制产生的。当STOP信号产生后,总线恢复到空闲状态,SDA和SCL线皆为高电平。如果生成了Sr信号,总线将继续保持忙碌状态。Sr信号的作用和S信号的作用类似,但是大多数的器件对于通信所需的读时序都是需要以Sr信号过渡,而不是START+STOP信号,具体要求还需参考对应器件的datasheet。

DATA有效性

DATA 有效性

在SCL高电平期间,SDA线上的电平信号必须保持稳定。

只有当SCL线上的电平信号为低电平时,SDA线上的数据才能发送改变。

从上图可以知道,每传输一个数据位都需要一个时钟脉冲信号,主机会负责产生所有的时钟脉冲。

BYTE传输

BYTE 传输格式

数据传输遵循上图的格式,启动条件完成后,发送一个从地址,这个地址长度为7bit,后面的第8位是一个数据方向位(R/W),上图通信的设备地址为0x50。此后,SDA线上每次传输的字节大小必须是8bits,但是传输的字节数量可以不受限制。数据最先传输的是最高有效位(MSB),每个字节传送完毕后通常有一个确认位(ACK)。

ACK&NACK

ACK 条件

ACK:表示在每个字节传送完毕后,由接收器向发送器发出信号,表示成功地接收到该字节,并且可以发送下一个字节。在ACK期间(第9个CLK),发送器会释放SDA先,接收器获得SDA线控制权,并在SCL高电平期间拉低SDA线产生ACK信号。

NACK:如果SDA在第9个CLK期间一直为高,表示没有产生确认信号。之后,主机可以发送STOP信号来终止传输,或者发送Sr信号开始新一轮的传输。产生NACK的情况可能:

A. 总线上没有对应设备地址的器件,所以在地址响应阶段不予ACK回应

B. 器件正忙,无法响应主机(接收器无法接收更多的数据)

C. 传输的数据有误,不符合协议规范

D. 主机作为接收器,已经收到最后一笔数据准备发送STOP信号结束传输,比如:在主机读取从机过程中,如果读取的数据已经是最后一笔数据了,那么主机可以不予ACK回应,接着发送STOP信号结束整个传输过程即可。

等待机制

如果从机由于某些特效原因(比如正在处理一个内部中断),不能接收/发送接下来字节,它可以拉低SCL总线迫使主机进入等待状态,需要等待其重新释放总线主机才能进行接下来的传输操作。

数据传输格式

常见的数据传输格式有:

7-bit addressing

A. 主机发送-从机接收,在整个传输过程,传输方向没有发生改变。当总线上的从机接收到start起始信号后,开始监听总线,并将总线上监听到的设备地址与自己当前的地址进行匹配,如果匹配成功将产生应答,并开始接下来的数据传输,从机需要对接收到的每个byte进行回应(ACK)。

7bit 写操作

B. 从机应答设备地址后,主机发送 -> 主机接受,从机接收 -> 从机发送。主机在发送STOP前,可以发送NACK,对最后一笔读取数据不予回应。

7bit 读操作

C. 在数据传输过程中,主机改变传输方向(读->写/写->读),中间以Restart信号过渡,并且,如果主机是作为接收器,可以发送NACK,对最后一笔读取数据不予回应,之后,再发送Restart + Addr。

7bit 读写操作切换

10-bit addressing

引进10-bit addressing是为了拓展总线下可用的设备地址数量。7位地址和10位地址可以连接到同一I2C总线,并且可以在所有总线速率模型中使用。10-bit addressing的设备地址由START/RESTART条件后的前两个字节构成:

第一个字节组成:1111 0+XX(10位地址的两个MSB有效位)+ R/W位。

第二个字节组成:10位地址的剩余bits

前面描述的7位寻址的所有读/写格式的组合都可以用于10位寻址。这里列举两例:

A. 主机发送-10bit从机接收

在整个传输过程,传输方向没有发生改变。当主机紧跟START信号发出第一个字节后,可能会有多个设备匹配成功并产生应答,所有当前匹配成功的设备都会继续比较第二字节的地址是否一致,但是只有一个从机能够匹配成功并产生应答。

B. 主机接收-10bit从机发送

I2C底层框架

I2C经典框架图

在上面这个框图对应的是一主多从的情况,一条I2C总线下挂接着多个I2C通信设备,并且总线通过上拉电阻接到了VCC。

I2C控制器作用:在嵌入式系统里面,每一种主控芯片基本上都会有I2C控制器,I2C控制器简化了我们的操作。当我们想要发送数据时,只需要把数据写到寄存器里,控制器就会把操控总线,发出数据,并等待从设备返回一个回应信号。如果没有I2C控制器,就需要控制管脚来模拟I2C时序通信,把一位一位的数据组装成8位传输。

I2C设备直接连到I2C总线上,总线上还会放一个上拉电阻。 如果某些I2C设备模块的引脚驱动能力异常,比如说上拉能力较强,下拉能力较弱,那么即使程序的操作流程上是正确的,也有可能出现概率性的通信失败情况。因为模块的拉低电平能力较弱,有时候并不能满足一个信号形成的条件,这时候可以通过更改电阻阻值进行调节芯片引脚的驱动能力。

如何在SDA上实现双向传输

内部电路逻辑

主设备与I2C从设备之间的数据可以通过SDA传输,也就是说主设备可以通过SDA读写从设备,那其内部就需要有发送接收引脚。总线要能实现双向传输还需满足以下两点:

a、在主设备发送时,从设备不应该发送,这一步可以通过时钟信号来控制。

b、在主设备发送时,从设备的发送引脚信号不应该影响到SDA线上电平信号,相当于悬空在总线下,使用开集/开漏电路可以达到类似的效果。当Master Send和 Slave Send发出某些信号时,从SDA线上读取到的电平是多少,这里我们可以画出一个真值表进行统计

Master Send Slave Send SDA Receive
0 0 1
0 1 0
1 0 0
1 1 0

一共有4种情况:

当Master Send输出0,pn结截止,SDA信号由上拉电阻和Slave Send决定。如果Slave Send输出高电平,其三极管导通,SDA将接到GND,读取到的信号为低电平;如果Slave Send输出低电平,pn结截止,SDA由上拉电阻拉高,读取到的信号为高电平;

当Master Send输出1,pn结导通,SDA将接到GND,读取到的信号为低电平。

所以,当Master/Slave不想影响SDA信号时,就不驱动三极管。当两者都不驱动时,SDA信号由上拉电阻决定,即为高电平。当Master/Slave想拉低SDA信号时,其只需输出高电平即可。

参考资料

《AT24cxx.pdf》

《SMBus_3_1_20180319.pdf》

《UM1020_datasheet.pdf》

《I2C总线协议中文版.pdf》

作者

弯弯月牙儿

发布于

2021-05-04

更新于

2021-05-07

许可协议

评论