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

电器工程 大气压 i2c 拉起 实时时钟
2022-01-11 07:07:48

刚才我意识到 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

4个回答

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Ω 的内部上拉电阻,可以通过固件启用或禁用。20kΩ 对于 I 2 C 上拉来说太弱了。但是如果总线的电容很小(物理上很小)并且通信速度足够慢,那么 20kΩ 仍然可以使总线工作。然而,与使用分立的上拉电阻器相比,这不是一个可靠的设计。

1我自己不是 ATmega 人。

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

在此处输入图像描述

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

您使用的库和它所依赖的库(Wire)启用了 ATMega 的内部上拉。这些是弱上拉,在正常使用中,补充任何外部上拉(两个电阻并联)。由于 20k 到 70k 的电阻相对较高,因此它们在使用中不会引起太多问题(如果有的话)。

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

现在没有外部电阻器,弱的内部上拉是唯一驱动线路高的东西。根据您的电路板布局、i2c 线路的速度、您访问它的频率、外部干扰等,它们可能有效,也可能无效。你走运了。你确实有引体向上,只是不是你期望的。

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

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

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

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

某些器件实际上可能具有 20K 至 100K 欧姆范围内的片上上拉电阻器,只是为了在不使用部件上的 I 2 C 接口时将接口引脚保持在高不活动电平。对于简单而短的接口,这些上拉电阻可能刚好足以在时钟和/或数据发出信号时提供将线路拉高所需的电流。

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

归根结底,您可能有责任使用示波器检查早期时钟之一的信号,以查看接口上的 1 和 0 是否在规范电压水平内工作。然后,您将确定您是否对该实现非常幸运,或者我上面提到的因素之一是否在起作用。

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

最有可能的是,I2C 总线根本无法工作。

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

很可能不是。