I2C 开漏输出与上拉电阻

开漏输出与上拉电阻

关于总线连接的物理特性,官方文档中还有这样的介绍:

SDA 和 SCL 都是双向线路都通过一个电流源或上拉电阻连接到正的电源电压。当总线空闲时,这两条线路都是高电平 连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能 。

注意到这样一句话:「连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能 」,这里就涉及到「漏极/集电极开路」、「上拉电阻」和「线与」两个概念,而这绝对可以算得上是实现 I2C 总线协议的关键所在

在芯片中,当一个输出级为漏极/集电极开路时(开漏输出),它只能输出低电平和高阻态,低电平我们了解,那「高阻态」又是个什么东西?高阻态可理解为通过很大的电阻把输出引脚与 MCU 芯片内部隔开,近似开路的状态(电阻非常大)。这时芯片无法控制输出的电平,引脚的电平不确定,可被外部电平轻松改变。开漏输出可以简单理解为输出处接一个开关,闭合时接低电平,断开时悬空(啥也不接)。下图的中间部分电路就很好地说明这种状态。

I2C 开漏输出与上拉电阻_第1张图片

资料来源:单片机I/O口推挽输出与开漏输出的区别(转) - xiaoweiboy的专栏 - 博客频道 - CSDN.NET

正是由于开漏输出的「要么拉低要么放手」的特性,使得总线只受输出端低电平的影响(同样,设备也只能通过输出低电平来使用总线),从而实现了「线与」的功能。和「逻辑与」一样,「线与」所表达的意思是 —— 当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这时候的总线被称为占用状态。

然而 I2C 总线电路的真正主角,是连接总线到 VCC 的两个上拉电阻。根据前面的分析我们知道,输出端只能输出低电平或高阻态,是不能把总线拉高的,自然而然就需要通过其他方式为总线提供高电平,上拉电阻就担负了这个重任 —— 当输出端输出高阻态时且没有其他设备拉低总线(占用总线)时,总线被外部的上拉电阻拉高、呈现出高电平状态,这不正是我们的「线与」功能么。

不仅如此,利用「线与」特性还可以实现总线的仲裁、时钟的同步,更牛逼的是,在整个过程中数据完全不会丢失。我甚至觉得 I2C 协议相对于其他串行通信协议最大的优势就是通过「开漏输出」和「上拉电阻」两个物理特性大大简化了协议整体的设计和实现

I2C 开漏输出与上拉电阻_第2张图片

上拉电阻阻值对 I2C 协议的影响

需要补充说明的一点是,两个上拉电阻的大小并不是随便用的,涉及到通信速率与功耗的取舍。协议层对电平的变化时间有着严格的要求与限制,而电平的变化受总线电气特性的影响。

对总线而言,上拉电阻越大,信号的上升时间就越长,通信速率就越低,反之亦然。但电阻也并不是越小越好,阻值过小的话,总线低电平时电阻上的大电流会增加电路的功耗。此外,电容也会影响信号的上升时间,于是就有了 I2C 总线总电容 400 pf 的限制,这直接关系到总线上可挂载设备的数目。

你可能感兴趣的:(电子)