为什么在 I2C 中的 Vcc/SDA 和 Vcc/SCL 之间放置电阻会导致方波?

电器工程 Arduino i2c 示波器 波形
2022-01-17 04:14:13

当我在 Arduino 和 EEPROM 芯片之间进行通信时,我试图理解为什么在 Vcc 和数据/时钟线之间放置电阻有助于我的波形是方形的。如果电路中没有放置电阻器,则波浪看起来像鲨鱼鳍。电路仍然起作用,但它们绝对是看起来很奇怪的波。

作为背景,这个问题是在使用 I2C 将 Arduino 连接到 Microchip 24LC256 (EEPROM) 之后出现的。用我的示波器检查信号后(试图调试一些不相关的东西),我注意到这些波看起来很糟糕。在我看来,它们就像鱼翅(有没有更可接受的 EE 短语?)。我检查了几次以确保我的探头范围被正确调整/补偿,并验证我在其他电路上没有得到这样的行为。这是接线的样子:

原始接线设置

黄色信号是 SDA 线,蓝色是 SCL

在一次偶然的谈话中,我告诉了一位 EE,他们说这对于 I2C 来说并不少见。他建议在 Vcc 和 SCL 之间放置一个 10k Ohm 电阻,并在 Vcc 和 SDA 之间尝试一个较低的电阻。此外,他建议将 I2C 速度降低到最低设置(Uno 为 31KHz)。如果我在 Vcc/SCL 之间放置一个 10k 电阻器,在 Vcc/SDA 之间放置一个 4.7k 电阻器,就足够了——它们看起来很漂亮而且很方形。我还将速度从正常降低到 31KHz,但这产生的影响要小得多(如果有的话)。

不幸的是,我从来没有机会问为什么!我是电子产品的菜鸟,但我很好奇为什么像这样放置的电阻器会使它们看起来更好看方波?下面的这张照片是在使用电阻器之后,但在为最好看的方波选择“最佳”电阻器值之前。我认为它看起来好多了。

在此处输入图像描述

我在 Stack Exchange 上寻找解释,但无济于事。这些似乎(可能)与我的问题相似: I2C EEPROM 通信问题(他的波形看起来与我的相似,但答案没有解决我的问题) 两个芯片之间的 I2C 接口(这个看起来也很有希望,但没有不要深入研究“为什么”) 从 FPGA 发出的奇怪的 I2C 信号(这似乎与其他东西有关……尽管相似之处在于她的波看起来“丑陋”)

谢谢您的帮助!

2个回答

I2C 是使用开漏输出的总线。漏极开路就像连接在输出和地之间的开关。如果没有上拉电阻,它将无法工作,因为没有任何东西可以让它变高。

如果上拉电阻的值太高,它将无法工作(或无法可靠工作),因为该电阻不会对输入、输出、电线和示波器探头的电容充电足够快如果它们太低,那么输出将不足以将其拉低。

您注意到,在示波器测量中,输出很快变低,但缓慢上升到逻辑电平 1。

如果您的 Arduino 上的代码使用 ATMega 上的内部上拉电阻来对 I2C 接口进行 bit-bang,那么它们的值可能太高(几十 K 欧姆,并且没有很好地指定)而无法可靠地工作,所以他们需要与外部电阻并联。

就个人而言,我会编写不使用内部上拉电阻的代码(默认情况下)以避免总线“几乎”不工作的情况,并强制用户使用电阻器或故意选择使用内部电阻器。如果芯片非常靠近,使用低速(100K)并且没有连接示波器探头(特别是在 x1 中),它们可能是可以接受的。

我见过非常相似的情况,即意外安装了 47K 电阻网络而不是 4.7K。

如果没有上拉电阻, I2C根本不应该工作;它们是总线设计中明确要求的。

所以实际上,你的问题是没有实际意义的——做错了,就会发生坏事。

如果您真的想准确了解正在发生的事情,很可能您会从泄漏电流中获得某种弱上拉效应,甚至可能是内部上拉电阻器比 I2C 总线电阻器大 10 倍左右。这会导致指数 RC 上升波形 - 电容器通过电阻器充电的经典波形。使用适当值的上拉电阻,它仍然会发生,但速度足够快,以至于指数在示波器上看起来是垂直的。

在没有真正的上拉电阻的情况下,无论电流源使线路处于高电平状态,它都很弱(即电路具有非常高的阻抗),因此它也极易受到来自时钟线的电容耦合的影响,因此您会看到数据线波形的顶部显示时钟切换时的伪影。

使用所需的上拉电阻。在您的芯片上放置一个电源旁路电容器。保持布线尽可能短。遵守规则,你就可以避免因违反规则而产生的问题。