I2C总线通信及其上拉电阻计算

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、总述

I2C总线是一种应用广泛的板级通信方式,多用于一个主机(也可以多个主机)与一个或多个从机通信的场景。
本文主要介绍了I2C总线通信的格式及时序,以及总线上拉电阻的详细计算方式。

二、I2C总线通信

1. START 和 STOP 标志位

I2C通信主机可以通过发送START标志位来开始与从机的通信,或者发送STOP标志位结束与从机的通信。
一般通信过程中,当SCL处于高电平时,SDA上的电平是稳定的,但是:
当SCL处于高电平时,若SDA上有一个下降沿,则这就是一个START标志位;
当SCL处于高电平时,若SDA上有一个上升沿,则这就是一个START标志位。在这里插入图片描述
举一个实测例子:
在这里插入图片描述


2. 应答 (ACK) 和非应答 (NACK)

a. ACK

数据的每一字节(8 bits,包括地址字节)后会伴随着1bit 的来自接收方的ACK标志位。ACK标志位的意义是接收方告知发送方当前字节已被成功接收,可以继续发送下一字节。
在接收方发送ACK标志位前,发送方必须释放总线。接收方通过在ACK/NACK时钟周期的低电平相位(即SCL在START后的第9个低电平)拉低SDA来发送一个ACK标志位,这样SDA将会在ACK/NACK时钟周期的高电平相位(即SCL在START后的第9个高电平)保持为低电平。
下图是实测ACK的例子:
在这里插入图片描述

b. NACK

如果SDA在ACK/NACK时钟周期一直保持为高电平(即没有接收方拉低SDA),这就被认为是NACK标志位。NACK标志位产生的原因主要有:

  1. 接收放无法接收或发送,因为它正在执行一些实时功能并且尚未准备好开始与主设备通信;
  2. 在发送方发送数据期间,接收方收到了其无法识别的数据或命令(比如地址不正确等);
  3. 在发送方发送数据期间,接收方无法再接收更多的数据字节;
  4. 作为接收方的主机已完成了数据接收,并通过NACK标志位告知从机。
    在这里插入图片描述
    下图是实测NACK的例子:
    在这里插入图片描述

3. 数据字节格式(byte format)

SDA上的数据位对应于SCL上的每一个时钟脉冲来进行传输。每个字节由8 bit 数据组成,数据字节的内容可以是从机地址、寄存器地址或读取/写入的数据等。数据首先传输高有效位(MSB),并在SCL的高电平期间保持稳定(因为SCL为高其间若SDA有翻转,将会被视作START或STOP)。主机和从机在START和STOP标志位之间,可以传输任意数量的数据字节。
在这里插入图片描述


4. 通信过程

a. 主机向从机中写入数据
  • 当主机想向某个从机中写入数据时,主机会发送一个START标志位+从机地址到总线上,并在地址位后面的读写位中写入“0”以表示这是写操作;
  • 对应地址的从机发送应答位;
  • 主机继续发送希望写入的从机寄存器地址;
  • 从机再一次应答,表示其已经准备好接收;
  • 主机开始发送需要写入的数据到从机;
  • 在每个字节的结尾,从机发送应答位;
  • 当主机发送完所有需要发送的数据时,发送STOP标志位结束通信。
    在这里插入图片描述
b. 主机从从机中读取数据
  • 当主机想从某个从机中读取数据时,主机会发送一个START标志位+从机地址到总线上,并在地址位后面的读写位中写入“0”以表示这是写操作;
  • 对应地址的从机发送应答位;
  • 主机继续发送希望读取的从机寄存器地址;
  • 从机再一次应答;
  • 主机再一次发送START标志位(Repeated START)+从机地址,并在地址位后面的读写位中写入“1”以表示这是读操作;
  • 从机再一次应答,表示其已经准备好发送;
  • 主机释放SDA,但保持SCL时钟供应,从机开始发送数据到主机;
  • 在每个字节的结尾,主机发送应答位;
  • 当主机接收完所有需要接收的数据时,发送NACK标志位通知从机释放总线,并在NACK标志位后发送STOP标志位结束通信。
    在这里插入图片描述

三、I2C总线上拉电阻计算

一般I2C电路中常见的上拉电阻取值为2.2kohm,1.5kohm,但是这个值到底是怎么来的?既然2.2kohm可以,那么2.1kohm可以吗?10ohm、100kohm是否可以?下文将进行I2C上拉电阻的理论计算。

实际上,I2C上拉电阻与电路的设计(走线、总线拓扑)以及器件选型息息相关,当上述信息确定后,总线上拉电阻的范围(最大值与最小值)也就大体确定了。剩下的就要根据实际信号完整性测试结果来细微调整。接下来我们就分别来看最大值与最小值的确定。

1. 上拉电阻最大值 Rp(max)

a. 表达式的确定

一个典型的I2C应用如下图所示:
在这里插入图片描述
I2C总线使用Open-Drain的输出控制器,总线上的主机或从机可以控制其内部下拉MOSFET的导通或关断来控制I2C总线电平。如下图所示:
在这里插入图片描述
在这里插入图片描述

因此每一个device控制一次MOSFET的导通与关断,涉及的都是一整条总线电平的翻转。

但由于实际布线长度,和拓扑的影响,总线会有分布电容的存在,并且每一个I2C device也会有输入容抗(Ci),这使得总线电平的每一次翻转,都是一次RC电路的充放电(其中,R是上拉电阻,C是总线电容bus line capacitive load)。因此这种翻转(也即上升沿、下降沿)的时间就会受到RC值的影响,一旦RC过大、上升/下降沿时间过长,I2C总线可能在还未上升到逻辑高电平之前就被再次拉低,或还未下降到逻辑低电平之前就被再次拉高,就会影响总线通信。

所以,我们要将RC限制在一个合理的水平内,以保证信号完整性符合协议规定。那么,什么是合理的水平呢?
合理的水平就是——要在规定的时间内完成电平的翻转。我们来具体分析:

在这里插入图片描述

首先,如上表所示,I2C协议规定,低电平输入电压VIL小于0.3×Vcc,高电平输入电压VIH大于0.7×Vcc。
而RC电路阶跃响应的公式为:
在这里插入图片描述
对于VIH=0.7×Vcc:
在这里插入图片描述
对于VIL=0.3×Vcc:
在这里插入图片描述
通过移项得:
在这里插入图片描述
在这里插入图片描述
那么上升沿时间rise time就是从VIL到VIH的时间,即:
在这里插入图片描述
则可以得到:
在这里插入图片描述
那么Rp(max)就是由总线tr和总线Cb来决定,接下来我们看 tr 和 Cb的确定。


b. 上升沿时间 tr

I2C协议中规定了不同mode(通信速率)下的上升沿/下降沿时间的最大值,这是需要满足的底限。
在这里插入图片描述
fast-mode举例,协议规定最大上升沿时间是300ns,除了要满足协议规定,我们还需要:

  • 查看总线上所有器件的spec,看它们的上升沿时间要求会不会更严格(<300ns),如果有更严格的,就需要整条总线遵守最严格的限制,即找到总线 tr(min);

在这里,我们就按照300ns来计算。


c. 总线电容 Cb

I2C协议中规定了不同mode(通信速率)下的总线电容最大值,fast-mode下Cb(max)为400pF。
在这里插入图片描述

Cb这个值主要由以下几方面组成:

  • 导线电容:PCB layout走线本身具有一定的电容,这个电容一般与走线长度、走线宽度、走线厚度、走线与参考平面的距离、介电材料的相对介电常数相关。这个可以估算出来,但很难估算准确,一般在几十皮法级别。

  • IC管脚电容:每个连接到I2C总线的芯片的管脚都有一定的输入电容,一般在几皮法~几十皮法级别。这个值可以在芯片的spec中查到,下表为PCA9548芯片的引脚输入电容。一条I2C总线上连接的芯片越多,总输入电容也就越大,因为它们是并联关系,需要把所有芯片引脚输入电容加在一起。
    在这里插入图片描述

  • 导线连接点电容:在走线与IC管脚或其它导线连接的地方,由于焊盘、通孔或连接器的存在,也会形成额外的电容。一条I2C总线上连接的芯片越多,导线连接点越多,所以总连接点电容也就越大。

  • 寄生电容:例如元件封装本身的电容、空气介质中的微小电容等,这个值相对比较小。

以上就是总线电容的几个主要组成部分。我们可以根据自己的实际应用将上述电容加起来。这里我们按照150pF预估。


d. Rp(max) 的计算

总结上面的信息,在计算 Rp(max) 时,我们要根据实际的电路设计找到总线上所有器件的上升沿时间要求的最小值 tr(min) ,并预估总线电容 Cb(min),然后根据下述公式计算 Rp(max)。
在这里插入图片描述
根据我们上面的举例,计算得到在fast-mode 300ns上升沿时间和150pF总线电容估算的情况下,Rp(max) 为:
在这里插入图片描述
这就是上拉电阻的最大值,接下来我们看最小值如何确定。


2. 上拉电阻最小值 Rp(min)

I2C总线的低电平(下拉)是由每一个器件内部的MOSFET的导通来完成的。当MOSFET导通时,如下图所示,总线电压VBUS=Vmosfet。
在这里插入图片描述
此时,VCC被分成这样两部分:
在这里插入图片描述
其中Vrp是上拉电阻两端电压,Vmosfet是芯片内部导通的MOSFET两端电压。则:
在这里插入图片描述
I2C器件的spec中会对MOSFET的驱动能力(即下拉能力)做描述,不同器件内部MOSFET的驱动能力不同。spec中会规定MOSFET导通时 low-level output voltage的最大值,例如 I2C EEPROM M24512-DRE 的spec:
在这里插入图片描述
从上表可以看到,该芯片的VOL(max)为0.4V,sink current(IOL)为3mA左右。那么,我们就要使电路满足在3mA的sink current下,Vmosfet ≤ VOL,否则该器件就没有能力拉下I2C总线,导致通信失败。因此:
在这里插入图片描述
在这里插入图片描述

不同器件的VOL(nax)和IOL(min)会有不同,但一般都会满足I2C协议规定,I2C协议规定如下:
在这里插入图片描述
还是以最常见的fast-mode为例,一般情况下我们按照0.4V的VOL(max)和3mA的 IOL(min)来计算就可以(毕竟芯片设计需要满足协议要求),但保险起见,我们还是查一下I2C总线上所有器件的MOSFET的驱动能力。通常,VOL(max)越低、IOL(min)越低,下拉难度越大。因此,我们要找到总线上所有器件VOL(max)的最小值和 IOL(min)的最小值来计算。

这里我们就按照I2C协议来计算,并假设VCC为3.3V,则有:
在这里插入图片描述


3. 上拉电阻 Rp 最终确定

根据上述计算结果,我们得到了当前设计中,上拉电阻Rp的范围:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接下来就可以从这个范围中选取一个常见的阻值(最好是板上其它电路已经用过的阻值,这样可以减少物料种类)来使用。
上述计算过程可以适用于所有I2C总线上拉电阻的计算。

该过程只是在电路设计时进行的一个理论计算,计算中所用到的参数(例如总线电容)都是我们的估算,与实际情况相比还是会存在误差。因此我们在拿到实际板子后需要对I2C信号进行SI测试,根据测试结果再对上拉电阻的阻值进行微调。


四、I2C总线信号质量常见问题及解决方法

I2C信号质量优化 (会持续更新)


参考文献

  1. Understanding the I2C Bus
  2. I2C Bus Pullup Resistor Calculation
  3. UM10204 I2C-bus specification and user manual
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值