加载中...

I2C总线为什么要接上拉电阻

I2C总线为什么要接上拉电阻

I2C为什么要接上拉电阻?因为它是开漏输出

开漏输出

为什么是开漏输出?

I2C协议支持多个主设备与多个从设备在一条总线上,如果不用开漏输出,而用推挽输出会出现主设备之间短路的情况所以总线一般会使用开漏输出

上拉电阻

1、为什么要接上拉电阻?

接上拉电阻是因为I2C通信需要输出高电平的能力一般开漏输出无法输出高电平,如果在漏极接上拉电阻,则可以进行电平转换

I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路都通过上拉电阻连接到电源,这样才能够实现“线与”功能。当总线空闲时,这两条线路都是高电平。

2、上拉电阻阻值怎么确定?

一般IO端口的驱动能力在2mA~4mA量级

阻值不能过小
功耗问题。如果上拉阻值过小,VDD灌入端口的电流将较大,功耗会很大,导致端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值为0.4V)。故通常上拉电阻应选取不低于1K的电阻(当VDD=3V时,灌入电流不超过3mA)。

阻值不能过大
速度问题。它取决于上拉电阻和线上电容形成的RC延时,RC延时越大,波形越偏离方波趋向于正弦波,数据读写正确的概率就越低,所以上拉电阻不能过大。

I2C总线上的负载电容不能超过400pF。当I2C总线上器件逐渐增多时,总线负载电容也相应增加。当总的负载电容大于400pF时,就不能可靠的工作。这也是I2C的局限性。

建议上拉电阻可选用1.5K,2.2K,4.7K。

I2C总线基本操作

根据I2C总线规范,总线空闲时两根线都必须为高。假设主设备A需要启动I2C,他需要在SCL高电平时,将SDA由高电平转换为低电平作为启动信号。

主设备A在把SDA拉高后,它需要再检查一下SDA的电平。为什么? 因为线与,如果主设备A拉高SDA时,已经有其他主设备将SDA拉低了,由于 1 & 0 = 0 那么主设备A在检查SDA电平时, 会发现不是高电平,而是低电平。说明其他主设备抢占总线的时间比它早,主设备A只能放弃占用总线。如果SDA是高电平,说明主设备A可以占用总线,然后主设备A将SDA拉低,开始通信。

因此,模拟I2C一定要将GPIO端口设置为开漏输出并加上拉电阻。

相关问题

1、I2C信号的上拉电阻一般是多少?如果要求上拉4.7K,实际上拉了10K,或者要求上拉10K,实际上拉了4.7K,会有什么影响吗?

I2C信号的上拉电阻一般推荐的值在1kΩ到10kΩ之间。对于标准速率为100kHz的I2C通信,通常选择4.7kΩ或10kΩ是比较合适的。

如果要求上拉4.7KΩ,实际上拉了10KΩ,或者要求上拉10KΩ,实际上拉了4.7KΩ,会有以下影响:

  • 上拉电阻过大:如果上拉电阻过大,会导致信号的上升时间变长,因为RC充电时间常数(即上拉电阻与总线电容的乘积变大,使得信号从低电平到高电平的变化变慢。这可能会导致信号上升沿变化缓慢达不到数据传输的要求,特别是在高速通信模式下。此外,上拉电阻过大还可能导致输出阻抗增大影响输出高电平的稳定性

  • 上拉电阻过小:如果上拉电阻过小,可能会导致VDD灌入端口的电流较大,这可能导致端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值为0.4V),并且如果电流过大,还可能损坏端口

因此,选择适当的上拉电阻对于保证I2C总线的稳定性和通信质量至关重要。在实际应用中,应根据总线电压、通信速率、总线长度、系统噪声、电源电压波动以及功耗考量等因素进行综合考虑,以选择最适合的阻值。

2、I2C都在主芯片端上拉,但是上拉电阻不一样,一个10K上拉,一个4.7K上拉,一个1.8K上拉,有什么影响吗?

电阻越大,电流越小,驱动能力越小;电阻越小,电流越大,驱动能力越大。

一般都用4.7K上拉。

posted @ 2024-09-07 15:55  bujidao1128  阅读(323)  评论(0编辑  收藏  举报