一、I2C总线定义
要搞清楚一种总线,就跟了解一件事情的来龙去脉一样,首先要弄清楚由来。
I2C是Inter-Intergrated Circuit的简称,英文翻译过来是:内置集成电路。为什么I2C是内置集成电路?I2C总线是由Philips公司在80年代初开发的一种简单、双向二线制同步串行总线,为了让主板、嵌入式系统用以连接低速的周边设备而发展的,从这个字面上意思上来看,I2C是一种低速率的串行总线,为了解决低速设备接入高速设备而存在的。
I2C可以写成I²C、IIC,I2C之所以被广泛应用,因为这种通信总线比较简单,物理上只需要两根线--串行数据线(SDA)和串行时钟线(SCL),即可在连接于总线上的器件传送信息。这里说明一点,I2C仅限于板级间走线,因为通信距离受到一些参数限制,比如总线的负载电容、总线上的电流等等。 既然是双方或者多方通信,肯定会有发起的一方。我们将发起通信的这一方称为主器件,主器件用来启动总线传送数据,并产生时钟,数据在时钟脉冲的作用下,去寻址从器件。此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据的传输方向。主机负责产生时钟和终止数据传送。
二、工作原理
下图是I2C总线电路的结构分析,虚框内是IC内的电路,虚框外是外部电路。
从上图可以看出:I2C两根线:一根串行时钟线SCL、一根串行数据线SDA,且两根线对应到器件的两个pin均是双向的,也就是说主器件和从器件不是恒定不变的。
Pin脚的电路结构为开漏输出(开漏输出的典型特点是需外接上拉电阻才能对外输出高电平),所以需要通过上拉电阻接电源VCC,保证总线空闲时两根线都是高电平,且能够实现高低电平的变化。总线在传输数据时,当SCL电平为高时,SDA数据有效,且需要保持一定的时间;当SCL为低电平时,SDA数据无效,允许变化。
I2C总线有主从之分,连接总线的外部器件也都是CMOS器件,输出级也都是开漏电路,在总线上消耗的电流很小,这样保证I2C总线不需要太大的电流驱动能力。但I2C总线上可扩展的器件数量主要是由电容负载来决定,因为每个器件的总线接口都有一定的等效电容,而线路中电容会影响总线传输速度,当电容过大时,有可能造成传输错误。所以需要根据不同的负载电容去估算支持的最大从设备数量。I2C总线的电容负载能力为400pF(通过驱动扩展可达到4000pF),每一个器件的输入都相当于一个等效电容,由于I2C总线扩展器件的连接方式为并联,因为I2C总线的等效电容等于每个器件的等效电容之和,等效电容存在会造成传输信号波形的畸变,在超出范围时,会导致数据传输出错。
由上图可以看出,Rp是上拉电阻,CL就是该器件I2C接口的对GND电容,上拉电阻Rp计算方式:(VDDmax-UINLmax)/Rpmin< (2~4)mA(I/O口的灌电流)其中:VDDmax:电源电压的最大值,UINLmax:I/O口上允许的低电平的最大值(CMOS电路结构中UINL<=0.7V)
举例:评估出一个最小的上拉电阻阻值
已知:电源电压VDD=5V±%10,IO端口的驱动能力为3mA,UINmax=0.7V,则最小的上拉电阻计算如下:
(VDDmax-UINmax)/Rpmin<3mA 代入数据,得Rpmin=1.6k;
上拉电阻Rp的最大值计算
总线电容是线路连接和管脚的总电容,它决定了Rp的最大值
1)标准模式:每条总线线路的最大电容负载都为400pF,且Tr<300ns;
2)快速模式:每条总线线路的最大电容负载都为200pF,且Tr<300ns;
I2C的速率:
标准模式SM(Standard mode):100kbit/s,
快速模式FM(Fast mode):400kbit/s,
快速+模式(Fast mode Plus):1Mbit/s
高速模式HS(High-speed mode):3.4Mbit/s
快速模式器件的输入有抑制毛刺的功能,SDA和SCL输入有施密特触发器;
快速模式器件的输入缓冲器对SDA和SCL信号的下降沿有斜率控制功能;
如果快速模式器件的电源电压被关断,SDA和SCL的I/O管脚必须悬空,不能阻塞总线;
评估I2C总线一个最大的上拉电阻阻值方法
I2C端口输出高电平是通过Rp上拉到VDD实现,线上电平由低到高的变化,电源通过Rp对线上负载电容Cl充电,从低电平切换到高电平,是需要一定时间的,即上升时间,这个上升时间可以近似用充电时间常数RpCl表示,瑞昱100kbit/s速率应用,信号上升时间小于300ns,假设线上的Cl为20pF,计算出对应的Rp值为17k。(计算公式:Rpmax=tr/(0.8473Cb)),tr为上升时间,Cb为总线电容。最大的Rpmax是变化的,需要根据实际的Cb计算。
如果Rp*Cl充电时间常数过大,将是信号上升沿变化缓慢,达不到传输数据要求;如果Rp太小,则会增大端口的sink电流,在可能的情况下,Rp取值大要一些,以减少好点。
电路干扰:在I2C设备的电源入口处要加滤波电容,一般加10nF或100nF;SDA和SCL上如果有干扰,要做滤波处理,总线上串接几十欧姆的电容,对地加几十pF电容;
三、通信流程
I2C通信特征总的来说,主要是同步串行通信、非差分、低速率。
I2C的在数据传输过程中共有三种类型的信号:开始信号START,结束信号END,应答信号ACK/NACK.
开始信号:SCL为高电平时,SDA由高电平跳变为低电平,表示开始通信;
停止信号:SCL为高电平时,SDA由低电平跳变为高电平,表示结束通信;
应答信号ACK(NACK):在接收数据的IC在接收到一个字节数据后,向发送数据的IC发出特定的低电平脉冲(NACK是高电平脉冲,应答信号一般是在第9个时钟传输),表示已经收到数据。开始和结束信号都是由主机发车,应答信号是由从机发出。
数据的有效性:当开始传输数据时,I2C是在SCL为高电平时采样,所以SDA线上的数据必须在时钟SCL高电平周期内保持稳定的高电平或者低电平状态,否则会导致通信失败。同样,只有在SCL线上的时钟信号是低电平时,SDA线上的电平才能改变。
空闲状态:SCL,SDA线上都是高电平。
ACK/NACK说明:
1.主机向从机发送数据,从机无法接收或者无法识别解析数据时,会发送NACK;
2.从机向主机发送数据,主机不想接收了,主机会发送NACK,这时从机释放SDA总线,好让主机接下来发送STOP信号。
发起通信的流程
首先主机会线拉低SDA总线,标志我要开始通信了,接下来主机会发送 7bit的地址+1bit的读写位 如果某个从设备地址和主机发的地址吻合,就会发出一个ACK信号,通信就此建立。之后的读写操作,要具体看从设备的通讯规范,比如读一个寄存器可能要如下操作:
图中,灰色表示主机发送,白色表示从机发送。主机之所以如此发送数据,是根据从机的通信手册来的,并不是标准的I2C协议规定的,主机并不知道这些数据的意义,只有从机知道。
传输步骤
1.在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信
2.主机想总线发送要与之通信的从机的7位或者10位地址,以及读写位。
3.每个从机将主机发送的地址与自己的地址进行比较,如果地址匹配,则从机将SDA线拉低一位,返回一个ACK位,如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。
4.主机发送或接受数据帧:
5.传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认成功接收到该帧。
6.随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。
以上是单个字节的传输步骤详解,多字节的读写和页写,后面我们根据代码再介绍。
四、I2C通信优缺点
与其他通信协议相比,I2C听起来很复杂,以下是其优缺点的总结。
优点
缺点
- 数据传输速率比SPI慢
- 数据帧的大小限制为8位
评论
查看更多