
本文概述
I2C是硬件设计中最常用的串行总线之一,开漏输出加上拉电阻的结构是其核心特征。上拉电阻的取值需要同时考虑两个边界:最小值由器件灌电流能力决定,太大了低电平抬升不满足Vol要求;最大值由总线电容和上升时间决定,太大了上升沿过慢导致时序违规。3.3V系统中常用4.7千欧到10千欧,5V系统常用2.2千欧到4.7千欧。除了上拉电阻,I2C硬件设计还要注意总线电容限制、电平兼容、地址冲突和上拉电源选择等问题。
核心要点速览
I2C是开漏输出,必须加上拉电阻才能输出高电平
上拉电阻最小值由灌电流决定,最大值由上升时间和总线电容决定
总线电容最大400pF,挂的器件越多、线越长,上拉电阻要越小
标准模式100kbps上升时间最大1微秒,快速模式400kbps最大300纳秒
3.3V系统常用4.7kΩ或10kΩ,5V系统常用2.2kΩ或4.7kΩ
一、面试官考察点
基础原理理解
是否知道I2C是开漏结构,理解为什么必须加上拉电阻,明白SCL和SDA两条线的作用。
参数计算能力
是否能说出上拉电阻的计算公式,知道哪些参数影响选型,而不是只会说"一般用4.7k"。
实际工程经验
是否了解总线电容、器件数量、线长、电平兼容等实际工程问题,有没有调试I2C问题的经历。
问题排查能力
遇到I2C通信失败时,能不能有条理地定位问题,比如量波形、查地址、看电平、测上拉。
二、回答思路
第一步:为什么要加用上拉电阻
I2C总线的SCL和SDA都是开漏输出结构,也就是说器件只能把线拉低,不能主动拉高。高电平完全靠上拉电阻把线拉到VCC。这样设计的好处是多个器件可以挂在同一条总线上,不会出现一个拉高一个拉低导致短路的问题,而且方便实现线与逻辑和时钟同步。但代价就是必须外接上拉电阻,而且上升沿是RC充电曲线,不如推挽输出那么陡。
第二步:上拉电阻怎么计算
上拉电阻的取值有一个范围,不是固定值。要分别算出最小值和最大值,然后在这个范围里选一个合适的标称值。
最小值计算:上拉电阻不能太小,否则低电平时从VCC经上拉电阻流进器件引脚的电流太大,超过器件的灌电流能力,导致低电平电压Vol抬升,超过规范要求。以3.3V系统、标准模式为例,Vcc=3.3V,Vol_max=0.4V,Iol_max=3mA,Rp_min=(3.3-0.4)/0.003≈967欧姆。
最大值计算:上拉电阻也不能太大,否则和总线电容组成的RC时间常数太大,信号上升沿太慢,超过规范要求的上升时间,导致时序问题。上升时间是从0.3Vcc上升到0.7Vcc的时间,对应的RC充电系数是0.8473。标准模式下tr_max是1000纳秒,总线电容100pF时,Rp_max=1000e-9/(0.8473×100e-12)≈11.8千欧。
不同场景的典型取值
| 应用场景 | Vcc | 速率 | 总线电容 | 推荐上拉电阻 |
|---|---|---|---|---|
| 5V系统 短距离 少器件 | 5V | 100kbps | 约50pF | 4.7kΩ |
| 5V系统 多器件 | 5V | 100kbps | 约200pF | 2.2kΩ |
| 3.3V系统 常规 | 3.3V | 100kbps | 约100pF | 4.7kΩ ~ 10kΩ |
| 3.3V系统 快速模式 | 3.3V | 400kbps | 约100pF | 2.2kΩ ~ 4.7kΩ |
| 1.8V系统 低功耗 | 1.8V | 100kbps | 约50pF | 10kΩ |
第三步:其他硬件设计要点
总线电容控制
I2C规范规定最大总线电容400pF,超过之后通信就不稳定了。每个器件的引脚电容大约5到10pF,PCB走线每厘米约0.5到1pF。所以一条总线上挂多少个器件,不是看地址够不够,而是看总电容超不超。实际应用中挂五六个器件、走线几十厘米长比较常见,再多就要考虑加I2C中继器或者分总线。
电平兼容问题
如果I2C总线上既有3.3V器件又有5V器件,要注意电平兼容性。如果5V器件的输入高电平阈值是2V以上,3.3V的高电平是能满足的。但反过来,3.3V器件能不能承受5V电压要看器件是否5V容忍。最稳妥的方法是把上拉电阻接到低电压侧,然后用双向电平转换芯片。或者两边都用同一个电源电压的器件,省得麻烦。
上拉电源选择
上拉电阻接的电源电压决定了I2C总线的高电平是多少。通常接主芯片的IO电源电压,比如3.3V就接3.3V。但如果总线上有不同电压的器件,要选一个大家都能接受的电压。还要注意上拉电源要稳定,最好和主芯片的IO电源是同一个电源域,不然可能出现上电时序问题。
地址冲突检查
I2C器件有固定地址也有可配置地址,设计前要确认所有器件的地址不冲突。有些器件的地址可以通过引脚配置,要留好上拉下拉电阻的位置。还有一些器件有保留地址或者广播地址,设计时要避开。地址冲突是I2C调试中很常见的问题,提前检查可以省很多事。
常见问题排查思路
遇到I2C通信失败,我的排查顺序一般是:先用示波器量SCL和SDA的波形,看有没有信号、电平对不对、上升下降沿好不好。如果波形都正常但就是通信不上,那就查地址对不对,用逻辑分析仪抓一下总线数据看ACK位有没有回应。如果波形不对,比如高电平上不去,那就查上拉电阻有没有焊、阻值对不对、有没有器件把总线拉死。如果上升沿很缓,那就要考虑总线电容是不是太大,或者上拉电阻是不是太大。
三、追问环节
追问1:I2C为什么是开漏输出而不是推挽输出?
主要有两个原因。第一是多主机和总线仲裁的需要,如果用推挽输出,两个主机同时控制总线,一个拉高一个拉低,就会出现电源到地的直接短路,烧坏器件。开漏输出就不会有这个问题,线与逻辑天然支持多主机仲裁。第二是电平兼容灵活,开漏输出的高电平由上拉电阻的电源决定,可以方便地实现不同电压器件之间的通信。当然开漏也有缺点,就是上升沿慢,功耗相对高一些,高速应用会受限制。
追问2:I2C快速模式和标准模式在上拉电阻上有什么区别?
主要区别在上升时间的要求不一样。标准模式100kbps时,上升时间最大是1000纳秒;快速模式400kbps时,上升时间最大是300纳秒。上升时间要求更严,意味着允许的最大上拉电阻更小。同样100pF总线电容,标准模式可以用到10k左右,快速模式就只能用到3k到4k左右。而且快速模式的器件灌电流能力通常也更强,最大可以到20毫安,所以最小值可以更小。快速模式下一般选2.2k到4.7k比较常见。
追问3:上拉电阻放在总线的哪一端有讲究吗?
位置上有一定讲究,但不是特别严格。最理想的位置是放在总线的末端,也就是离主控制器最远的那一端,这样反射和信号完整性最好。因为I2C速率不高,几十到几百kbps,信号上升沿在几百纳秒级别,所以位置的影响不像高速信号那么明显。实际应用中,放在主芯片旁边或者总线中间都可以,只要不是放在特别奇怪的位置就行。还有一点,如果有多个电源域,上拉电阻要放在正确的电源域那边。
追问4:I2C总线上可以有多个主机吗?怎么工作的?
I2C支持多主机模式,这也是开漏结构带来的好处。多个主机都可以发起通信,这时候就需要总线仲裁机制。仲裁的原理很简单,就是每个主机在发数据的时候,同时检测总线的电平。如果主机发的是高电平,但检测到总线是低电平,说明有别的主机在发低电平,自己就输掉仲裁,退出本次传输。因为开漏的线与特性,不会出现冲突和短路。仲裁过程是无损的,赢的那家继续发数据,不影响通信。当然实际应用中,单主机的情况占绝大多数,多主机用得比较少。
四、失分表达
"上拉电阻一般都是4.7k,直接用就行"
只会说经验值,不会计算,也不知道适用条件。面试官追问不同电压、不同速率下怎么选就答不上来了。
"I2C可以挂127个器件,因为地址是7位的"
只考虑地址空间不考虑总线电容,是典型的纸上谈兵。实际中总线电容才是器件数量的主要限制因素。
"上拉电阻越大越省电,越大越好"
忽略了上升时间的限制。上拉电阻太大,上升沿过慢,通信就不稳定了,不能只看功耗。
五、准备动作
亲手算一遍上拉电阻的最小和最大值
用3.3V和5V两种情况各算一遍,把数字记住,面试的时候能直接说出来。
用示波器实际量一下I2C波形
看看真实的上升沿是什么样的,不同阻值下有什么区别,有直观印象比背公式管用。
整理一个I2C常见问题排查清单
把地址冲突、上拉丢失、总线死锁、电平不兼容等常见问题和解决方法整理出来。
六、核心关键词
I2C上拉电阻 开漏输出 总线电容 上升时间 灌电流 电平兼容 总线仲裁 地址冲突

扫码关注





























