I2C上拉电阻是否有正确的电阻值?


72

24LC256 EEPROM 的数据表指出:

SDA总线需要一个上拉电阻到VCC(对于100 kHz,典型值为10kΩ;对于400 kHz和1 MHz,典型值为2kΩ)。

我以为任何电阻值为kΩ的电阻都能胜任这项工作(似乎EEPROM使用10kΩ的电阻在不同频率下都能正常工作)。

我的问题是:

  • 上拉电阻是否有正确的值?
  • 是否有法律/法规来确定该价值?
  • 不同的电阻值如何影响I²C数据总线?

Answers:


66

I 2 C总线的正确上拉电阻取决于总线上的总电容以及您要在其上运行的频率。

ATmega168数据表中的公式(我相信是来自I 2 C 官方规格)-

Freq<100kHzRmin=Vcc0.4V3mA,Rmax=1000nsCbus

Freq>100kHzRmin=Vcc0.4V3mA,Rmax=300nsCbus

Microchip 24LC256规定的最大引脚电容为10pF(这是非常典型的)。计算总线上并行拥有的设备数量,并使用上面的公式计算将起作用的值的范围。

如果您要关闭电池电源,我将使用该范围高端的值。如果电源没有功率限制或IC中存在功耗问题,我将使用范围下限的值。

我出售一些带有I 2 C RTC(DS1337)的套件。我在套件中包括4K7电阻,对于大多数用户来说,这似乎是一个合理的折衷方案。


通常,我会想象总线在大多数时间都处于空闲状态(无效),因此对于电池应用而言,与尝试优化I2C上拉电阻相比,还有更多重要的问题需要处理:P
Nick T

5
我唯一要添加的是在总线上设备总电容之上的缓冲区。迹线本身以及从焊盘到引脚的焊点也将具有一定的阻抗。在更长的总线上,走线/导线的电容可能大于设备的引脚电容。在设计生产板时,我通常不会确定最终的上拉值,直到我手头有一个原型并且可以将总线的范围设定为各种值。
标记

14

有意义的是,较高的频率需要较低的电阻上拉电阻:较低的电阻将更快地对电缆的电容充电/放电,从而导致陡峭的边缘。随着低频脉冲的增加,陡峭的边缘将不会对脉冲的形状产生太大影响。

因此,对于以下三种速度等级,I2C规范给出了上拉电阻的最大值与总线电容的关系:

在此处输入图片说明

最小值是根据母线电压定义的,应限制通过驱动器的电流。


3
3年后,德州仪器(TI)撰写了一份应用笔记,其含义与该答案非常接近。
尼克·阿列克谢耶夫

EDN文章:健壮的I2C通信的设计计算。[仅收集参考资料。]
尼克·阿列克谢夫

11

值的范围是正确的,但是很难准确描述该范围是什么。通常,10k可以工作。

数字输出具有指定的源或灌电流能力。如果您的输出可能吸收5 mA的电流,并且输出通过上拉至5 V连接,然后设为0,则您至少需要1k的电阻。如果使用的电流小于1k,则输出将无法吸收足够的电流以将引脚一直拉至0V。如果使用较大的值(例如10k),则该引脚仅需吸收0.5 mA电流,这远小于其额定值。

数字量输入具有规定的泄漏电流。这有点像在输入端“维持” 0或1所需的电流量。如果上拉电阻太大,那么它将无法克服泄漏电流。如果仅能克服泄漏电流,则电路中的任何噪声都足以改变输入。

当使用可吸收电流的数字输出时(“图腾柱驱动器”,“推挽驱动器”),您可能会不使用上拉或下拉电阻。但是,非常重要的一点是,不允许CMOS输入浮空,否则它们会拉扯过大的电流...而且很容易忘记,双向MCU引脚通常会作为输入出现!


I2C和其他类似的协议使用“开漏”(或“集电极开路”)输出。漏极输出不能上拉,而漏极开路输出只能下拉。这就是为什么需要外部上拉电阻的原因。现在,上拉电阻器的范围受到了其他限制。上拉值将与总线电容形成一个RC电路。太小的值将再次阻止输出驱动器吸收足够的电流以将引脚一直拉低至0。但是,太大的值将花费太长时间来使总线电容充电。

如果存在不允许违反的建立/保持时间,则这些时间将帮助您确定RC时间常数。总线电容在很大程度上取决于PCB布局,因此您可以选择一个R值和一个C值,以提供一个在数字输入的建立/保持时间内舒适的值。


7

较低的上拉电阻值(较低的电阻)可以改善信号过渡的边缘,但有时会变得过硬-如果总线上的设备无法吸收上拉电流,您会得到逻辑“低”的信号,实际上并不是那么低,这可能会导致通信错误(以及很多痛苦)。

我会采用最高的上拉电阻,以便为您提供可靠的通信。


5

对于低频,该值实际上并不重要,但对于高频,它会与电路中的其他电容结合使用,对信号产生滤波效果,这就是为什么它们建议不同速度使用不同值的原因。


2

我尚未看到的一个问题是功耗。如果使用3.3伏电源,则每当输出低时,接地的3.3K电阻将浪费1mA电流(3.3mW功率)。使用10K电阻器会将电流和功率降低三倍。如果I2C总线上有很多通信,那么功耗可能最终会成为总功耗的重要部分,尤其是当总线长时间处于低电平状态时。例如,如果一个人正在读取100字节/秒,但是在读取每个字节之后,总线将留给设备输出下一个字节的第一位,并且这些字节中的大多数都已清除了MSB,则总线可能会花费90%的时间。 SCL和SDA较低的时间。取决于系统在做什么,这可能会大大增加功耗。

为了节省功率,将“上拉”电阻器连接到I / O引脚而不是VDD可能会有所帮助。虽然我还没有看到硬件I2C实现对此提供支持,但是将主输出数据放在单独的I / O引脚上,该引脚通过电阻而不是使用集电极开路驱动器和固定的上拉电阻连接到总线,这样可以避免当主机要输出“ 0”时浪费电流。另外,如果主机要暂时将SCK保持低电平,而不关心SDA上的内容,则主机可能会禁用上拉,直到准备好进行更多通信为止。如果没有器件需要使用时钟延长,则主机可以简单地将直接输出用于SCK,而不必担心该线上的任何上拉。

如果人们正在使用软件与快速处理器进行碰撞,并且尽管总线电容很高,但仍希望获得良好的性能,则可以将上述方法与处理器内置的弱上拉电路结合使用。在读取数据时,在SCK的每个下降沿之后立即短暂地打开一个非常强的上拉电阻,然后切换到一个弱上拉电阻。尽管有电容,强上拉电阻也会将线路拉高,一旦线路拉高,弱上拉电阻就可以将其保持高电平。即使设备在将线路拉低至强上拉电阻时遇到问题,一旦关闭强上拉电阻,也可以这样做。



-1

这是400kb / s的波形(200KHz 101010波形)。RC为4.7K欧姆和212pF。RC值允许2 TAU稳定。

在此处输入图片说明


这个答案是错误的。200 kHz时钟提供200 kb / s,而不是400。只有上升沿受上拉电阻的影响。这些图看起来很混乱,几乎就像发生了某种调制一样。物理量及其单位之间用空格(或稀疏空间)书写。Tau是符号,而不是缩写。
venny

@venny这是总线在稳定时间内运行速度过快的典型波形。只有2个TAU稳定,波形没有平坦的顶部,因此是“某种调制”。如果这是伪随机模式,则沉降的可变性将非常明显;阅读“数据眼”。最后,200KHz时钟的高电平为2.5uS,然后低电平为2.5uS。2.5uS的周期恰好是我提到的400KHz数据。
Analogsystemsrf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.