一、基本介绍
I2C总线(Inter-Integrated Circuit)是一种同步半双工串行通信总线,是Philips(飞利浦)[现NXP(恩智浦)]公司在1980年代初开发设计的、被广泛使用且功能强大的总线,
用于主设备(一个或多个)与单个或多个从设备之间的通信。如下图,多个不同的外围设备可以共享一组仅通过2根线连接到处理器的总线,允许多个集成电路之间进行数据交换,这种简单且可扩展性也是I2C总线与其他接口相比最大的优势之一。
二、物理层
I2C总线只需要两根串行信号线:串行数据线SDA (serial data)用于传输数据,串行时钟线SCL(SCL数据线)用于控制数据收发时序。
I2C总线设备间的连接方式、物理拓扑图如下;
主控制器与从设备(一个或多个)都是通过两根信号线连接,信号线上主设备和从设备都能作为发送器和接收器;为确保传输过程的指向准确性,每个设备都有自己的唯一地址(7位/10位设备地址),以实现制定从设备的定向传输与群发传输。
如上图所示,
总线的内部都是漏极开路驱动器(Open-Drain),设备只能将总线拉低(提供对地短路)或释放总线(对地高阻抗),并允许上拉电阻到高电平,
即SCL、SDA可以被驱动为低电平,但是不能被驱动为高电平,
因此每条线上都要使用一个外部上拉电阻,在总线被释放的情况下,上拉电阻将总线上拉至高电平。
1、上拉电阻怎么取值?
以下为TI关于I2C总线上拉电阻的计算方法
其中,
VOH是逻辑高电平;VOL是逻辑低电平;IOL是逻辑低电流。
从上面公式可以看出,
电源电压限制了上拉电阻的最小值 ;
容性负载Cb限制了上拉电阻的最大值。
I2C总线上拉电阻,确定过程:
步骤①
根据上表速率需求参数及上述公式,计算出上拉电阻的最大值和最小值;
步骤②
确定最小值和最大值后,可在速度和功率做权衡后决定电阻的取值;
较小的电阻将由于较小的RC延迟而提供较高的速度,而较大的电阻器将提供较低的功耗。
通常常见的取值是4.7kΩ、2.2kΩ等
步骤③
硬件测试测出I2C信号线的具体波形参数,上升时间、下降时间、建立时间、保持时间、逻辑高低电平等,并比较实际测量值与所需速率对应的参数要求是否相符,做最终选取。
实际项目中,
通常先根据经验直接确定上拉电阻值,比如4.7kΩ,
然后,若硬件测试结果不满足速率要求,再通过降速或改变上拉电阻值来优化。
总线容性负载Cb
容性负载主要是由连接在总线上的器件以及线路中的电容所产生的;
每个器件的总线接口都有一定的等效电容,而线路中的电容也会影响到总线传输速度;
当电容过大时,有可能造成传输错误。
因此,I2C总线的负载能力有限,通常在400pF以内。
这个负载能力决定了总线允许的长度以及所接器件的数量。
在设计I2C总线系统时,需要考虑到这些容性负载的影响,以确保总线正常工作。
若容性负载偏大,可通过降低传输速率、使用总线缓冲器、增加端口驱动能力等方式来缓解。
2、I2C总线传输速率
I2C总线传输速率主要受上拉电阻及总线容性负载的影响;
有如下5种速率模式,一般不同器件可能支持不同的速率。
标准模式(Standard):100kbps
快速模式(Fast):400kbps
快速模式+(Fast-Plus):1Mbps
高速模式(High-speed):3.4Mbps
超快模式(Ultra-Fast):5Mbps(单向传输)
3、为什么是开漏(Open-Drain)?
原因有二
①防止短路
假设用推挽结构,多个设备挂在同一总线上,当存在某一设备将某一信号线驱动为高电平,而其他设备驱动为低电平,会导致短路(电源接地),导致器件损坏或降低寿命;对于开漏结构,任何设备都不能将信号线驱动为高电平。
②“线与”
当总线上连接的多个主设备时,就有可能两个或两个以上的主设备同时尝试初始化传输数据,为避免由此产生混乱发展出一个仲裁过程,它依靠线与连接所有I2C总线接口到I2C总线 ;
如果两个或两个以上的主设备尝试发送数据到总线,在其他主机都产生“0”的情况下,首先产生一个“1”的设备将丢失仲裁,放弃数据传输。
如果上面的说法不好理解?
不妨抓住"线与"的本质"与",
比如 C=A&B,只要其中一个变量 A/B 为低,那么 C 就必然为 0,
如下图,即使DATA1(其中一主设备)为高电平,DATA2(另一主设备)为低电平,所以 SDA得到的为低电平,并且DATA1(其中一主设备)丢失仲裁权。
在双方或多方通信中,将发起通信的一方称为主设备,主设备用来启动总线传送数据,并产生时钟,数据在时钟脉冲的作用下,去寻址从设备;此时任何被寻址的设备被称作从设备;主设备负责产生时钟和终止数据传送。
SDA线上的每个字节都必须为8位长,每次可以传输的字节数不受限制。每个字节后面必须跟1位应答位;数据优先高位(MSB)传输;
如果从设备在执行某些其他功能之前不能接收或发送另一完整字节的数据,它可以保持时钟线SCL LOW以迫使主机进入等待状态。当从设备准备好接收另一个字节的数据并释放时钟线SCL时,数据传输继续。
主设备和从设备进行数据传输时遵循以下协议格式。数据通过一条SDA数据线在主设备和从设备之间传输0和1的串行数据。
串行数据序列的结构可以分为,起始位,地址位,读写位,应答位,数据位,停止位。
1、几种基础信号/数据
① 空闲状态
总线空闲时SCL和SDA为高电平
② 起始位
SCL为高电平时,SDA被从高电平拉到低电平,数据传输开始,如下图,
③ 停止位
SCL为高电平时,SDA被从低电平拉到高电平,数据传输结束,如下图,
④ 应答位
在1个字节(8位,即8个时钟周期)传输完成之后,也就是第9个SCL时钟周期,主设备(发送器)释放SDA总线,把SDA总线控制权交给从设备(接收器),
如果从设备发送应答信号ACK,则SDA会被拉低,表示应答,如上图;SDA保持高电平为非应答。
I2C总线最大的一个特点就是具有完善的应答机制,从设备接收到主设备的数据时,会回复一个应答信号来通知主机表示“我收到了”。
⑤ 非应答信号
如下图,第9个SCL时钟周期,SDA保持高电平,表示非应答信号。
非应答信号的产生可能是主设备,也可能是从设备,
产生非应答信号的情况主要有以下几种:
- 主设备寻址时I2C总线上没有对应的从设备地址;
- 从设备正在执行一些操作,处于忙状态,还没有准备好与主设备通讯;
- 主设备发送的一些控制命令,从设备不支持;
- 主设备接收从机数据时,主机产生了非应答信号,通知从设备数据传输结束,不要再发数据。
⑥ 数据有效性
SDA必须在SCL处于高电平的周期内保持稳定,从前面可以看出当SCL为高电平时,SDA电平状态只要变化就会对应一种信号,起始位或停止位信号。
因此,只有当SCL处于低电平时,SDA的电平状态才能改变;1个时钟脉冲传输1个数据位。
一次传输的数据总共有8位,由主设备(发送器)设置,它需要将数据位传输到从设备(接收器);8位数据传输完成会紧跟一个ACK/NACK位,
如果从设备(接收器)成功接收到数据,则从设备(接收器)发送ACK;否则,发送NACK。
数据可以重复发送多个,直到接收到停止位为止。
⑦地址位
地址位支持 7bit或10bit,一般常用的是7bit地址,用来识别不同设备,I2C总线上挂载的设备具有地址唯一性。
地址位由主设备发送,从设备负责接收并识别该地址是否为自己的地址;
主设备如果需要向从设备发送/接收数据,首先要发送对应从设备的地址,然后会匹配总线上挂载的从设备的地址。
对于7bit地址位的I2C总线,理论上最多能挂载的从设备数量为127个;
但实际挂载数量还受总线容性负载Cb不超过400pF的限制。
一般项目中很少挂载多个从设备;需要挂载多个从设备时为了数据传输可靠性,会使用I2C总线缓冲器。
2、仲裁机制
仲裁只有在多个主设备时才有可能发生,一主多从系统中不需要仲裁。
如果有两个或两个以上的主设备在START条件的最小保持时间内生成START信号导致总线上的有效START条件,这就需要通过仲裁确定哪个主设备被允许数据传输,即I2C总线仲裁。
I2C总线仲裁可分为两部分:SCL同步和SDA仲裁。
① 时钟同步
SCL总线具有线"与"逻辑功能,这意味着多主系统中一旦有一个主设备发送时钟低电平,会将SCL线保持在低电平,直到达到时钟高电平状态,如下图,
具有最长SCL低电平周期的主设备决定了同步SCL时钟的高电平周期;
具有最短SCL高电平周期的主设备决定了同步SCL时钟的低电平周期。
时钟同步是借助I2C接口到SCL线的线"与"逻辑功能(开漏输出)实现的,当多个主设备同时发送时钟信号时,在总线上表现为统一的时钟信号,这就是SCL的同步原理。
② SDA仲裁
总线仲裁的主要作用是在多个设备同时请求访问总线时,解决可能出现的冲突和竞争问题,保证设备能够有序地进行数据传输和通信。
SDA仲裁也是建立在总线具有线"与"逻辑功能基础上的,当多个节点向总线发送1位数据后,比较总线上的数据与自己发送的是否一致,
- 是,继续发送;
- 否则,退出竞争,让出控制权。
I2C总线的控制逻辑:低电平优先
SDA仲裁保证了I2C总线系统在多个主设备同时尝试控制总线时的正常通信,并且不丢失数据,总线系统通过仲裁只允许一个主设备可以继续控制总线。
SCL 时钟同步和SDA仲裁过程没有先后关系,而是同时进行的。
3、读/写操作
① 写寄存器操作
写寄存器的操作过程如下:
1> master发起START
2> master发送I2C Address(7bit)和W操作"0"(1bit),等待ACK
3> slave发送ACK
4> master发送Register Address(8bit),等待ACK
5> slave发送ACK
6> master发送Data(8bit),即要写入寄存器中的数据,等待ACK
7> slave发送ACK
第6步和第7步可以重复多次,即顺序写多个寄存器
8> master发起STOP
② 读寄存器操作
读寄存器的操作过程如下:
1> master发送I2C Address(7bit)和W操作"0"(1bit),等待ACK
2> slave发送ACK
3> master发送Register Address(8bit),等待ACK
4> slave发送ACK
5> master发起START
6> master发送I2C Address(7bit)和R操作"1"(1bit),等待ACK
7> slave发送ACK,(master收到该ACK后,继续发送时钟脉冲,但将释放SDA线,以便slave传输数据)
8> slave发送Data(8bit),即要读取寄存器中的数据,等待ACK
9> master发送NACK/ACK
第8步和第9步可以重复多次,即顺序读多个寄存器
10> master发起STOP
注意:当需要顺序读取多个寄存器时,slave每发送完8个Data,如果继续读取下1个字节,master应该回答"ACK"(即 9> master发送ACK),以提示slave准备发送下1个字节;
如果maste不继续读取更多字节,那么maste应该回答"NACK",以提示slave准备接收STOP信号。
4、I2C死锁
死锁表现形式:SCL为高电平时,SDA始终保持低电平,是I2C应用中比较容易出现的一种问题。
在I2C主设备读写操作中,主设备在开始信号后驱动SCL线产生8个时钟脉冲,然后将SCL信号线拉低电平时从设备输出应答信号,将SDA信号拉为低电平。
此时如果主设备异常复位,SCL就会被释放,表现为高电平;如果此时从设备没有发生复位,则继续保持I2C应答,即把SDA一直拉为低电平,直到SCL为低电平,才会结束应答信号。
I2C主设备在复位后会检测SCL、SDA信号,若检测到SDA线为低电平,就判定I2C总线被占用,同时一直等待SCL、SDA信号变为高电平。
这种情况下,I2C主设备等待从设备释放SDA线,同时I2C从设备也在等待主设备将SCL线拉低以释放应答信号,二者就这样持续相互等待,导致I2C总线进入死锁状态。
四、电平转换1、什么是电平转换?
电平转换是针对两个或两个以上IC之间通讯时进行的一种转换技术,两个IC的通信接口的电平如果不一样,就需要进行电平转换以保证正常通讯;
否则通讯信号传输会出错;如果二者电平相差较大,会损坏芯片或者降低器件寿命。
举个栗子两个I2C接口,一个是3.3V,另一个是1.8V,这两个接口建立通讯关系就需要进行电平转。
不同电源电压和器件技术的阈值电平,如下图
2、电平转换电路方式
1> 电平转换专用IC
为满足不同电压域之间的数据通讯或控制,各大芯片厂商推出了多种多样的电平转换芯片(单向/双向)。
① 双向转换下图是润石的一款双向转换电平转换专用芯片的典型应用电路,它的两个双向通道使用独立的可配置电源轨供电,这两个双向通道在没有方向控制信号的情况下独立地确定数据流的方向;
每个I/O引脚都可以自动重新配置为输入或输出,即自动定向功能;不需要额外的方向控制管脚控制电平转换方向。
② 单向转换
下图是润石的一款具有可配置电压转换和三态输出的单位双电源总线收发器的典型应用电路,它的两个双向通道也使用独立的可配置电源轨供电,这两个双向通道需要DIR管脚的控制信号确定数据流的方向。
电平转换专用IC构成的电平转换电路,一般情况下速率比较高,可达MHz以上,在选型设计时也要评估下速率和驱动能力;但成本较高。
对于成本比较敏感的产品中会谨慎使用电平转换专用IC。
2> 分离器件搭建
下图为一种使用MOS管搭建的双向电平转换电路,该电路的使用非常普遍,不仅应用普遍,在面试中还经常被作为基础知识问及。
左右两侧均默认为高电平
从左向右传输高电平:SDA_1V8输出高电平(1.8V)时,MOS管Q1的Vgs=0,Q1截止,SDA_3V3被电阻R2上拉到高电平(3.3V);
从左向右传输低电平:SDA_1V8输出低电平(0V)时,MOS管Q1的Vgs=1.8V,大于Q1导通电压阈值,Q1导通,SDA_3V3被MOS管下拉到低电平(≈0V);
从右向左传输高电平:SDA_3V3输出高电平(3.3V)时,MOS管Q1的Vgs=0,Q1截止,SDA_1V8被电阻R1高电平(1.8V);
从右向左传输低电平:SDA_3V3输出低电平(0V)时,一开始MOS管Q1的Vgs=0,Q1截止;
由于MOS管体二极管的存在SDA_1V8被拉低到低电平,Vgs≈1.8V,Q1导通,SDA_1V8被MOS管下拉到低电平(≈0V)。
上述MOS管搭建的双向电平转换电路具有成本低,传输速率较低的特点。
上拉电阻和MOS管的参数选型尤为重要,对于上拉电阻的取值需要考虑驱动能力(速率)和功耗;
对于MOS管的选型需要考虑阈值电压Vgs(th)和漏源导通电阻Rdson(与结温的关系)等参数。
五、PCB Layout
通常,走线必须选择使总线线路的串扰和干扰最小的线路,
总线线路在高电平时最容易受到串扰和干扰,因为上拉器件处于相应的高阻状态。
如果PCB上的走线长度或带状电缆超过10cm,包括VDD和VSS线配线方式建议如下:
如果只有 VSS 线,那么配线方式建议如下:
这些配线方式也会使 SDA 线和 SCL 线的电容负载一样,如果PCB用了VSS层 或VDD层,VDD和VSS线可被忽略。
如果总线线路是双绞线,每条总线都必须围着VSS绕。另一种方法是SCL线围着 VSS绕,SDA线围着VDD绕,后者必须在两条双绞线的末端连接一个电容使VDD 线向VSS线解耦。
如果使用的是屏蔽的总线线路,屏蔽连接到VSS干扰将很小,但是屏蔽的电缆在 SDA和SCL线之间的电容耦合必须很低才能减少串扰。
以上是NXP I2C协议规范中给出的Layout相关建议。
I2C总线速率不高,一般Layout时I2C总线按类差分处理,走线尽可能短,远离单板上的高频器件或信号线。
上拉电阻建议放置在OD输出端附近;
当12C总线上主从器件(Master、Slave两端均为OD输出时,电阻放置在信号路径的中间位置;
当主设备端是软件模拟时序,而从设备是OD输出时,应将电阻安置在靠近从设备的位置。
I2C协议还定义了串联在SDA、SCL线上电阻Rs。
其作用是保护I2C总线器件的IO;防止总线上高电压的毛刺影响IO并将振荡和干扰 减到最小。
该电阻的选择一般在100~200ohm左右;该电阻并不是必须的,在恶劣噪声环境中可以选用。
六、硬件测试项
上升时间、下降时间、奖励时间、保持时间、时钟频率、读测试等...
一般将测试得到的结果与器件规格书或I2C协议中要求的指标进行对比,判断是否满足要求。
最后
以上内容参考NXP、TI、润石、ST官方协议、设计指南或规格书,可在其对应官网下载;