硬件【11】超全讲解I2C的上拉电阻

1.概述

相信很多人都清楚,在I2C总线上需要接上拉电阻?但是您针对对I2C上拉电阻足够了解吗?本文带您详细掌握一下I2C的上拉电阻。目录如下:

  • 上拉电阻的含义、上拉电阻在 I2C 电路中的作用
  • 根据VOL和IOL计算I2C上拉电阻的最小值
  • 根据总线电容计算上拉电阻的最大值

2 I2C的上拉电阻

我们知道,在I2C的电路中,在SCL、SDA线与电源之间通常会接一个电阻,这个电阻称之为上拉电阻。

但什么是上拉电阻?

上拉电阻主要用于为信号线或GPIO引脚提供默认状态。通常选择几K或几十K阻值的电阻。阻值较大的电阻确保不会通过电阻不断地将过多的电流引入到信号线上(5V Vdd / 10KΩ = 0.5mA 电流)。在常见的MCU中有大约几十K的电阻可以通过代码启用的上拉电阻将 GPIO 引脚预设为逻辑高电平状态。

在I2C 的电路中,I2C设备(芯片)的 SCL 和 SDA 的内部电路是“开漏”的,这意味着它们可以吸收电流,但无法提供电流。通俗点讲就是:这种信号可以被设置为低电平,但不能被设置为高电平。

所以我们在电路中以逻辑高电压的形式给这些信号提供电流,在常见的芯片中,电压通常为5V或3.3V。为了提供这个高电压,你需要分别在在 5V 和 SCL 、SDA 总线之间连接了一个上拉电阻。如下图所示:
在这里插入图片描述
但是,I2C上拉电阻的阻值和封装可不是随便选择的。也是有理论依据的。

3 上拉电阻最小值计算

在数字TTL电路中,通常情况下定义的高低电平电压值如下:

  • 低电平的电压 VL= 0.3 x Vdd
  • 高电平的电压 VH=0.7 x Vdd

所以,我们将I2C设备接到5V系统的电路中时,SDA和SCL的电压高于3.5V时被识别为“高电平”,低于1.5V时被识别为“低电平”。在1.5V-3.5V之间的电平,我们不能确定为高or低~

I2C设备内是有mosfet的,我们需要保证电压值高于一定值才能使mosfet导通,但电压值也不能高太多,否则容易造成mosfet损坏。

此处以LED举例:假设LED的压降是1.7V,需要高于1.7V的电压才能使LED导通,但是电流必须在LED的限定值以内。如压降为1.7V、额定电流为30mA的LED,想要LED点亮的理想情况是:(5V-1.7V)/30mA=110欧。所以针对该LED选用的限流电阻为110欧。

对于I2C引脚,在芯片手册中可以清楚的查到VOl(输出低电压)和IOL(输出低电流)。以AT24C128 EEPROM芯片的手册为例:

在这里插入图片描述
按照上述参数计算:(5-0.4)V / 2.1mA=2.2K。

我们计算出的这个值,就是I2C总线上拉电阻的最小值。我们如果选用更小的电阻值,就可能对I2C设备造成损坏。

4 上拉电阻最大值计算

电容是无处不在的,I2C总线也不例外。I2C电路中SDA和SCL引脚也会存在某种形式的引脚电容。
同样,查看AT24C128的数据手册可以查到对应的引脚电容。如下图所示。
在这里插入图片描述

包括引脚电容、PCB电容等所有的叠加,我们可以理解成有一堆的小电容连到I2C总线上,现在暂且将这些电容的累加定义为Cbus。

我们之所以关心Cbus,是因为在信号变化的过程中,其实是对Cbus进行充电和放电,这样会影响到信号的延时时间。

这些电容是如何充电的呢?就是通过VCC和上拉电阻给电容充电。

从AT24C128手册中可发现,SDA的引脚电容为8pF,SCL的引脚电容为6pF。假设PCB的电容平均值为10pF。则,在SDA总线的电容总计18pF;在SCL总线的电容总计为16pF。

我们现在关注的是上拉电阻的阻值最大值应该是多少才能保证SDA和SCL在要求的时间内进行信号高低电平的切换。引入总线电容就是为了确定上拉电阻最大值。

在AT24C128的收据手册中,也可以查询到上升时间tR的值,如下图。

在这里插入图片描述
tR就是I2C总线最大允许的上升时间。除了芯片手册有规定tR值,I2C总线也规定了tR的值如下:
在这里插入图片描述
下面引入上拉电阻计算的重量级公式:
在这里插入图片描述
到目前为止,我们已经确定了tR和Cb的值,就可以计算出上拉电阻的最大值。以400KHz的快速模式I2C为例计算:

Rp sda max=300ns/(0.8473x18pf)≈ 18K
Rp scl max=300ns/(0.8473x16pf)≈ 18K

所以,18K就是我们确定的I2C总线上拉电阻的最大值。

结合2.2K的最小值,I2C总线的上拉电阻只能选择:2.2K~18K之间的阻值,一般选择4.7K或10K。

5 总结

上面的计算我们是只计算了I2C总线只有AT24C128的情况,只需要选用2.2K~18K之间的电阻即可。
当I2C总线挂接的设备增加、PCB布线不同等多个方面都会影响到上拉电阻阻值的选择。

声明:转载处

### I2C 总线上拉电阻大小对通信的影响 #### 上拉电阻的作用 I2C总线采用开漏输出结构,因此需要外部上拉电阻来确保当设备不主动拉低信号线时,数据线能够保持高电平状态。这使得多个设备可以在同一条总线上共存并进行通信[^1]。 #### 不同阻值的选择及其影响 对于I2C总线上的上拉电阻,常见的取值范围包括1.5kΩ, 2.2kΩ 和4.7kΩ等。具体选择取决于系统的实际需求: - **较小的电阻(如1.5kΩ)** - 提供更强的电流驱动能力,加快信号边沿变化速度,有助于提高传输速率。 - 可能增加功耗,并且如果负载过多可能导致过大的电流消耗。 - **较大的电阻(如4.7kΩ)** - 减少静态电流损耗,在低频操作下节省电力。 - 较慢的上升时间可能不适合高速率的数据交换场景。 通常情况下,推荐使用介于两者之间的中间值比如2.2kΩ作为默认选项,既能满足大多数应用场景的需求又不会造成不必要的资源浪费[^2]。 #### 计算方法 为了精确确定合适的上拉电阻数值,可以根据以下简化公式来进行估算: \[ R_{pull-up} \approx \frac{V_{CC}}{(0.01 * V_{OL}) / C_b}\] 其中\(R_{pull-up}\)表示所需计算得出的理想上拉电阻;\(V_{CC}\)代表供电电压;\(V_{OL}\)指明逻辑低电平时的最大允许压降;而\(C_b\)则是整个总线网络中的寄生电容总量。 通过调整上述参数即可找到最适合特定硬件配置的最佳匹配方案。 ```python def calculate_pull_up_resistor(V_CC=3.3, VOL_max=0.4, bus_capacitance=400e-12): """ Calculate the optimal pull-up resistor value for an I2C bus. Args: V_CC (float): Supply voltage of the system in Volts. VOL_max (float): Maximum allowed output low voltage level in Volts. bus_capacitance (float): Total capacitance on the I2C lines in Farads. Returns: float: Optimal pull-up resistor value in Ohms. """ return V_CC / ((0.01 * VOL_max) / bus_capacitance) print(f"The calculated pull-up resistor is approximately {calculate_pull_up_resistor():.0f} ohm.") ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值