打印
[MM32软件]

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

[复制链接]
401|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
juliestephen|  楼主 | 2023-11-20 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2C由一条时钟线和一条数据线组成,我们先看两张图。


I2C的波形

I2C协议基本形式
I2C的输入输出结构采用的是开漏的结构 。 开漏结构 不能够自主得到高电平,所以需要通过外部上拉电阻 来的实现 I2C 通信过程中的高电平。上拉电阻 的大小取决于 I2C 不同模式时的灌电流大小。这种结构作为逻辑输出时候,必须要有外部上拉,一般是通过电阻加到VCC电源,平时保持高电平,当输入低电平时也可被拉低,也就是说此时的开漏输出的可以作为外部的输入I/O口。
因为多个设备共用一条I2C总线,如果 I2C 使用的是推挽输出,假设在某个时间,A设备和B设备刚好在不同的电平输出,则会引起短路。


下图是I2C 获得高低电平的情景。

如果我们不接上拉电阻,设备的I2C SCL SDA引脚是浮空状态,浮空的意思是没有确定的电平,可能是高,也可能是低。而根据I2C的协议,在总线空闲期间,SDA和SCL都是高电平,当SDA出现下降沿时信号传输开始,如果没有确定的电平,一旦有外部的干扰,则可能会误启动I2C。
上拉电阻取值
上面我们已经说到,由于I2C开漏输出需要输出高电平我们就需要加上拉电阻。那上拉电阻该如何取值呢?通常情况下我们使用4.7kΩ,就能适用于大多数应用场景。如果需要更精确的电阻值,我们可以使用以下公式:
Rmin = (Vcc - Vol) / Iol
Rmax=Tr / (0.8473 * Cb)
R 是所需的上拉电阻值(Ω);
Vcc 是供电电压(伏特,V);
Vol 是I2C总线上的输出电平电压(通常是0.4V);
Iol 是I2C总线上的输出电流(通常是3mA);
Tr是上升沿时间,Cb是总线电容,0.8473是标准上升沿时间;
通过上面这个公式可以计算出合适的取值。由上可知,供电电压决定上拉电阻的最小值,总线负载电容决定上拉电阻的最大值。
常见的上拉电阻阻值有1k、1.5k、2.2k、4.7k、5.1k、10k等。

使用特权

评论回复
沙发
stormwind123| | 2023-11-20 11:50 | 只看该作者
确保通信时总线处于高电平状态,使总线的电平变化以及数据传输更加稳定可靠。

使用特权

评论回复
板凳
chenqianqian| | 2023-11-21 08:20 | 只看该作者
IIC管脚都是采用开漏输出结构,必须要加上拉电阻。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

1075

帖子

2

粉丝