如果我省略I2C线路上的上拉电阻会怎样?


33

刚才我意识到I 2 C数据和时钟线(SDA和SCL)必须具有上拉电阻。

好了,根据下面的示意图,我已经使用DS1307 RTC构建了几个时钟(请参见数据表)。注意,我省略了两个上拉电阻。

I2C线路上没有上拉电阻的时钟示意图

两个时钟都可以正常工作,其中一个时钟已经工作了3个月以上。那怎么可能?无论如何,我想知道:

  1. 省略I 2 C上拉时会发生什么?

  2. 缺少上拉电阻是否可能损坏板上的这两个IC中的任何一个?

我得到的答案可以解决我将ATmega328P连接到DS1307 RTC的特定情况,就像我提供的原理图一样,但是如果问题不是太广泛,那么了解通常省略上拉电阻会发生什么会有所帮助。 ,即在I 2 C操作的其他情况下。

PS。我确实在网上搜索以找到答案,但是可以找到有关确定引体向上尺寸的文章。

更新:我使用的是Arduino IDE 1.03,并且我的固件使用DS1307RTC Arduino库(通过其功能RTC.read()RTC.write())处理RTC 。该库反过来又Wire.h用来与RTC对话。

更新2:下面是一系列示波器镜头,它们帮助我解释了I 2 C 如何在没有外部上拉电阻的情况下工作。

瞄准镜1 瞄准镜2

更新3(在添加I 2 C上拉之后):以下是在I 2 C线(在同一板上)上添加适当的(4K7)上拉电阻后拍摄的另一系列示波器。上升时间从大约5 µs降至290 ns。I 2 C现在更加快乐。

瞄准镜3 瞄准镜4


2
您的代码是否禁用了这些引脚上的上拉?
伊格纳西奥·巴斯克斯

@ IgnacioVazquez-Abrams在我的代码中没有直接提及SDA和SCD引脚(18和19)。我使用DS1307RTC库 Arduino库及其函数RTC.read()和RTC.write()处理RTC 。
里卡多2014年

该库又使用Wire.h与RTC进行通信。
里卡多

3
是的,绝对使用内部上拉电阻。注意曲线而不是尖锐的边缘。
Ignacio Vazquez-Abrams 2014年

Answers:


28

1)省略I2C上拉时会发生什么?

I 2 C总线上将没有通信。完全没有 MCU将无法生成I 2 C启动条件。MCU将无法发送I 2 C地址。

想知道为什么它能工作3个月?继续阅读。

2)缺少上拉电路可能会损坏板上的这两个IC中的任何一个吗?

可能不会。在这种特殊情况下(MCU,RTC,别无其他),绝对不是。

3)为什么MCU首先能够与I 2 C从设备通信?I 2 C需要上拉电阻。但是它们未包含在原理图中。

可能是您在ATmega上启用了内部上拉电路。从我读到的1来看,ATmega具有20kΩ的内部上拉电阻,可以通过固件启用或禁用它。对于I 2 C上拉,20kΩ太弱了。但是,如果总线的电容较低(通常很小)并且通信速度足够慢,则20kΩ仍可以使总线正常工作。但是,与使用分立上拉电阻相比,这不是一个很好的可靠设计。

1我自己不是一个ATmega家伙。

更新:作为响应I 2 C波形,已添加到OP中OP中
的波形具有非常长的上升时间常数。这是I 2 C波形通常的样子

在此处输入图片说明

PIC18F4550,Vcc = + 5V,2.2kΩ上拉电阻。波形显示SCL。SDA的上升时间大致相同。总线的物理尺寸适中:2个从属设备,PCB长度≈100mm。


感谢您的回答!是的,在我的情况下,ATmega具有必须启用的上拉电阻。我将仔细检查代码和正在使用的库,并通过评估板。我希望这可以使事情有所清除。
里卡多

1
您可能要先仔细检查从属设备的数据表。如果我没记错的话,ATMega的上拉电阻可能在30k至60k之间(取决于Vcc,温度和许多其他因素;您不能真正依靠它们来获得可靠的电阻)。您要确保向从属设备发送足够的电流以确保逻辑正确1.如果电阻太大,则从属设备将无法获得足够的电流,并且您所在的位置相同现在。
audiFanatic

4
@audiFanatic +1。顺便说一句,IMO,包括将上拉电阻器插入分接板并在默认情况下安装它们是错误的。想象一下,如果某人在一条I2C总线上有多个分线板,会发生什么情况。每个上拉电阻通常为2.2kΩ左右。所有分支板上的上拉电阻均并联出现。对于I2C,组合上拉变得太僵硬。[ 这里这里更多关于这个潜在问题的信息。]
尼克·阿列克谢夫

2
@Ricardo在示波器镜头(OP中的第一组示波器镜头)上,这不是快乐的I2C总线。我也为我的答案添加了瞄准镜。
尼克·阿列克谢夫

3
本文提供了一些i2c信号的好坏波形:dsscircuits.com/index.php/articles/…–
福特

16

您使用的库及其依赖的库(Wire)启用ATMega的内部上拉。这些是弱上拉电路,在正常使用时,应补充所有外部上拉电路(两个并联的电阻)。由于20k至70k的相对较高的电阻,因此它们在使用中不会引起很多外部问题。

省略I2C上拉会怎样?

现在,无需外部电阻,内部弱上拉电路是将线路拉高的唯一方法。根据您的电路板布局,i2c线路的速度,您访问它的频率,外部干扰等,它们可能会起作用,而可能不会起作用。你真幸运 您确实有引体向上,但不是您期望的。

缺少上拉电阻可能会损坏板上的这两个IC中的任何一个?

即使没有内部上拉电阻,缺少任何上拉电阻也不会损坏任何一个IC。i2c器件SCI和SDA线的内部构造类似于NPN晶体管。它们是集电极开路,实质上是电流控制/开关二极管。

最后要注意的是,当ATMega为5v且i2c设备仅为3.3v的设备时,内部上拉电阻会导通,这可能会引起问题。或者,如果您具有内部上拉电阻,并且外部电阻器连接到3.3v或其他电压,也会引起问题。本质上,这是Wire库中有意忽略的错误。


4
+ You do have pull-ups, just not ones you expected.1--我猜你把它钉了。谢谢!
里卡多

就是这样,您知道我已经添加了一些示波器镜头,以帮助阐明设置过程。
里卡多

2
@里卡多(Ricardo)是的,在33khz看到这些。最低的i2c规范速度的三分之一,信号仍然非常差。在100khz或400khz时,您将无法进行通信。不过,很棒的事情是,许多i2c设备以最高速度的一小部分工作。只需记住,内部上拉电阻可高达70k ohm,典型的i2c电阻为4.7k
Passerby 2014年

8

通常,您需要为I 2 C接口电路配备上拉电阻。如果该接口在导线两端确实是完整规格I 2 C,那么没有电阻的信号线将永远无法进入高电平。它们可能会保持较低或达到某个中间水平,该水平取决于两端各部分的泄漏电流。这样做的原因是因为真正的I 2 C是开漏总线。

某些设备实际上可能具有20K到100K欧姆范围内的片上上拉电阻,只是在不使用器件的I 2 C接口时将接口引脚保持在高无效电平。对于简单和短接口,这些上拉电阻可能恰好足以在向时钟和/或数据发送信号时提供将线拉高所需的电流。

从原理图上很难看出来,但在某些情况下,I 2 C接口是使用通用I / O端口引脚实现的,然后在软件中进行了扩展。有时,实施者可能无法使用开漏方法在此配置中操作I / O引脚,这可能是为什么没有上拉电阻的接口似乎可以工作的一个原因。

一天结束时,您可能要自己使用示波器检查一下您以前的时钟之一上的信号,以查看接口上的1和0是否在规定的电压电平内工作。然后,您将确定您是否对这种实现感到非常幸运,或者我上面提到的因素之一在起作用。


4

省略I2C上拉时会发生什么?

I2C总线很可能根本无法工作。

缺少上拉电阻可能会损坏板上的这两个IC中的任何一个?

很有可能不会。


3

您的I2C线路根本无法工作。如果我没记错的话,I2C只会断言低电平信号,而不会使它们回到高电平状态,这就是为什么需要这些电阻器的原因。

缺少上拉电阻不应损坏任何IC。


I2C引脚为漏极开路。
马特·杨

1

I2C是TTL逻辑协议;因此您的数据和时钟线是漏极开路的。换句话说,I2C硬件只能将这些线驱动为低电平。当它们不为零时,它们将保持浮动状态。这就是上拉电阻的输入位置。这是简化的示意图,但请与我合作一秒钟。

原理图

模拟该电路 –使用CircuitLab创建的原理图


如你看到的; 当TTL逻辑不将输出驱动为低电平时,需要上拉电阻以确保在输出端看到逻辑1。正如我已经提到的,TTL逻辑无法将线路驱动得很高。如果不存在,则输出将处于浮动状态,并且您将在输出中看到不可预测的信息(就您所知,您的微波炉或同事的肠道功能障碍是由无糖的小熊软糖引起的)波动的值)。

现在,如果您要使用微控制器在软件中实现I2C,那么这可能不会有太大的问题,因为它很可能会使用CMOS逻辑,该逻辑可以驱动高电平或低电平输出。


1
很高兴它有所帮助。
audiFanatic

2
器件使用TTL还是CMOS逻辑都无关紧要-正常的TTL和正常的CMOS输出将拉高和拉低信号。I2C信号要么是集电极开路TTL,要么是(更可能是)漏极开路CMOS-在两种情况下,源的输出级都缺少将信号拉高的晶体管,因此需要上拉电阻拉高信号。微控制器可能在这些引脚上具有内部上拉电阻。
彼得·贝内特

3
-1正如Peter Bennett所说,许多答案都是错误的。将TTL信号称为“漏极开路”是无价之宝。
Joe Hass 2014年

请注意,使用TTL进行I2C有很多优点,即,您通常不需要电平转换器来处理连接到同一总线的具有不同电源电压的组件。对于TTL 输入级,只需将上拉电压设置为最低电压芯片的最高可接受输入电压就足够了很多倍。在CMOS上,这是行不通的。
Ben Voigt 2014年

@BenVoigt:否-调用“需要上拉电阻器”配置“ TTL”是错误的,因为可以使用CMOS或TTL进行这种排列,而DS1307是CMOS部件。Maxim数据手册清楚地表明输出为漏极开路,并且框图显示了一个输出的FET。
Peter Bennett

0

当我用一个微型单片机作为时钟源来冲击I2C时,我就能够在不上拉的情况下驱动SCL。

但是,SDA的确需要带上拉的OC,以便从设备可以下拉并正确响应。

问候

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.