

01
有些芯片的引脚,是开漏输出或者开集电极输出。也就是无法直接输出高电平。它内部有个开关,打开的时候引脚接地,输出低电平。开关关掉的时候,引脚就悬空了,处于高阻态。

所以需要一个电阻,把引脚连到电源上。开关关掉的时候,电阻把电平拉上去。这就是上拉电阻的作用。

HDMI的DDC通道就是典型的开漏结构,必须加上拉电阻才能正常工作。
常见用到上拉电阻的地方还有:I2C总线(包括HDMI的DDC),单片机的开漏IO口,比较器的输出,按键检测等等。
电阻选多大,是个问题。选小了有麻烦,选大了也有麻烦。下面分开说。
02
电阻越小,上拉能力越强,但代价也大。
03
电阻选大了,主要问题是速度上不去。
总线上的导线、芯片引脚、PCB走线都会有寄生电容,上拉电阻和这个电容组成了RC充电回路。电阻越大,充电越慢,信号上升越慢,用示波器看就是上升沿变成斜坡,不是陡峭的方波。
I2C通信对上升沿时间有明确要求:
100kHz标准模式下,上升沿不能超过1000ns;
400kHz快速模式下,不能超过300ns;
1000kHz快速模式+下,不能超过120ns。

算一下:10k电阻加上200pF寄生电容(假设),RC常数是2us,充满电需要好几倍RC时间,上升沿大概1us出头。400kHz模式下,1us的上升沿已经超标了。换成2.2k电阻,RC常数是0.44us,上升沿大概0.24us,合格。
这就是HDMI的EDID读不出来的原因。DDC通道的I2C跑的是100kHz到400kHz,10k电阻上升沿太慢,EDID芯片不认。换成2.2k,问题解决。另外,电阻大了还容易被 干扰,外部噪声耦合进来,上拉电阻拉不动,电平就会乱跳。
04
没有万能值,给大家三个计算步骤,作为参考。
第一步:算最小能选多大。
最小电阻由IO口的最大灌电流决定,公式:R_min = 供电电压 / 最大灌电流。比如供电3.3V,最大灌电流20mA:3.3 / 0.02 = 165Ω。也就是说电阻不能小于165Ω,比这个再小电流就超了。

第二步:算最大能选多大。
最大电阻由通信速度决定,公式:R_max = 上升沿时间要求 / (总线电容 × 2.2) [ I2C 上升时间近似估算的一种工程简化表达]。
比如400kHz I2C,上升沿要求300ns,总线电容算200pF:0.0000003 / (0.0000000002 × 2.2) ≈ 681Ω,算出来最大只能到680Ω左右。但实际中没这么严格,很多人在400kHz下用1k、2.2k也能跑。常用的经验值:100kHz I2C用4.7k到10k,400kHz I2C用1k到2.2k,1MHz以上用470Ω到1k。
第三步:在范围内挑一个常用值。
比如你算出来最小500Ω,最大5k,那1k、2.2k、4.7k都可以。怎么选?电池供电想省电就选大一点,比如4.7k;高速通信要快就选小一点,比如1k;啥都不敏感就选4.7k,这是最常用的值。
今天的分享就到这里了,你有没有因为上拉电阻翻过车?评论区聊聊。