ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

IIC 上拉电阻计算:从开漏输出到 Rmin/Rmax 选型实测

IIC 上拉电阻计算:从开漏输出到 Rmin/Rmax 选型实测 上周帮朋友看一块板子IIC 死活不通示波器一挂上去SDA 的上升沿像一条懒洋洋的弧线从 0V 爬到 3.3V 花了将近 2 微秒。他用的 400kHz 速率按手册要求上升时间不能超过 300ns这一看就是上拉电阻给大了。把 10k 换成 2.2k总线立刻活了。这事让我觉得IIC 总线上拉电阻计算这个问题虽然老掉牙但每年都能在新板子上放倒一批人。很多人只知道 IIC 要上拉却不知道上拉电阻取多大更不知道这个值背后有两个边界一个由灌电流决定的下限一个由总线电容和上升时间决定的上限。这篇文章就把 IIC 总线上拉电阻计算这件事拆开从开漏输出为什么需要上拉到公式怎么推再到实际选型和踩坑排查争取让刚画板的新手也能直接抄作业也让调过几年总线的老手能再看一眼那些容易忽略的细节。1. IIC 总线上拉电阻到底在解决什么问题1.1 从开漏输出说起为什么 IIC 不能推挽IIC 的 SDA 和 SCL 都是双向线主从设备都可以拉低但没有任何一个设备会主动输出高电平。这不是设计者偷懒而是因为 IIC 是多主多从总线必须支持“线与”逻辑。所谓线与就是所有设备都通过开漏或者开集电极输出只要有一个设备把线拉低总线就是低只有所有设备都释放总线线才会被上拉电阻拉高。如果某个设备用推挽输出高另一个设备同时输出低那就成了电源对地的直接短路轻则波形畸变重则烧引脚。开漏输出只负责拉低不负责拉高所以必须有一个外部上拉电阻把总线拉到高电平。这个问题在热搜里经常被人问“i2c 为什么用开漏输出 上拉电阻”答案就是线与逻辑、双向通信、多设备仲裁和电平转换的便利性而不是为了省一个推挽管。上拉电阻在这里扮演的角色不只是“把线拉高”这么简单。它同时限制了低电平时从电源流进开漏管的电流这个电流就是灌电流。灌电流不能超过器件手册规定的 IOL 最大值否则开漏管的导通压降会升高VOL 变大严重时低电平会被识别成高电平通信直接失败。所以上拉电阻不是随便放一个就行它是在“拉高速度”和“低电平电流”之间做平衡。很多人把上拉电阻当成一个可有可无的默认值结果出了问题就抓瞎。我见过一块板子八个从机模块每个都焊了 4.7k 上拉并联之后等效只有 587Ω总线低电平时灌电流超过 5mA有些器件直接扛不住VOL 抬高到 1V 以上主控当然收不到正确的低电平。1.2 上拉电阻的两副面孔拉高与限流上拉电阻的第一副面孔是拉高。当总线释放时电源通过上拉电阻给总线电容充电电压从低电平向高电平爬升。这个爬升过程不是瞬间完成的它本质上是一个 RC 充电过程R 就是上拉电阻的等效阻值C 是总线上的总电容包括 PCB 走线电容、器件引脚电容、连接器电容、电缆电容甚至还包括你示波器探头的电容。R 越大充电越慢上升时间越长R 越小充电越快上升沿越陡。第二副面孔是限流。当总线被某个器件拉低时电源经过上拉电阻和开漏管到地形成电流。R 越小这个电流越大开漏管上的压降越大VOL 就越高。所以上拉电阻太大上升沿爬不上去上拉电阻太小低电平又压不下去。这个矛盾就是 IIC 总线上拉电阻计算的核心。很多人会问“iic 上拉电阻取多大”如果只给一个数4.7k 是最常见的答案但这个答案只在 100kHz、3.3V、总线电容不大的情况下比较稳妥。到了 400kHz 或者 1MHz4.7k 往往就太大了。同样如果总线电容很大比如长线或者多器件4.7k 也可能太大。反过来如果总线电压是 5V器件 IOL 又比较小4.7k 可能又偏小。所以“取多大”这个问题必须结合速率、电压、总线电容和器件手册来算。别迷信任何单一阻值包括 4.7k。1.3 上拉和下拉不是一回事在讲计算之前顺手把上拉电阻和下拉电阻的区别说清楚。上拉电阻是把节点在无驱动时拉到高电平下拉电阻是把节点在无驱动时拉到低电平。IIC 总线用的是上拉因为总线的空闲状态是高电平所有设备释放总线时总线必须保持高等待下一个起始条件。下拉电阻一般用在使能脚、片选脚、模式选择脚让这些脚在不驱动时有一个确定的低电平。IIC 总线上如果误加了下拉总线就永远起不来因为空闲状态应该是高。还有一些初学者把上拉和下拉同时放在一条线上那更是灾难等于电源对地一直有电流总线电平也被分压在一个中间值通信肯定不稳定。所以在 IIC 上只谈上拉不谈下拉下拉是另一个话题。2. 上拉电阻计算的两个边界Rmin 和 Rmax2.1 Rmin 怎么算灌电流与低电平上拉电阻的最小值由开漏输出低电平时允许的灌电流决定。器件手册里一般会给出两个参数VOL 和 IOL。VOL 是在指定灌电流下输出低电平的最大电压IOL 是这个引脚在 VOL 条件下能灌入的最大电流。我们要保证总线被拉低时实际灌电流不超过 IOL同时 VOL 不超过接收端的 VIL 最大值。对于 IICVIL 一般是 0.3VDD所以 VOL 必须小于 0.3VDD。计算最小上拉电阻的公式是Rmin (VDD - VOLmax) / IOLmax这个公式看起来简单但有几个细节容易错。第一VDD 是上拉电阻所接的电源电压不是器件供电电压如果总线上有电平转换两侧要分别算。第二VOLmax 和 IOLmax 要从手册里取最坏情况不要拿典型值。第三如果总线上有多个器件每个器件的 IOL 可能不同要取最严格的那个也就是 IOL 最小的那个。第四有些器件手册给的是 IOL 在 VOL0.4V 时的值但你的接收端 VIL 要求可能是 0.3VDD3.3V 下就是 0.99V0.4V 当然满足但如果是 5V 总线0.3VDD 是 1.5V0.4V 也满足。真正要小心的是如果上拉电阻太小灌电流超过 IOLVOL 会上升可能超过 0.3VDD这时低电平就不可靠了。举个例子3.3V 总线某个器件的 IOLmax3mAVOLmax0.4V。那么 Rmin(3.3-0.4)/0.003966.7Ω。也就是说上拉电阻不能小于约 967Ω。如果你用 1k刚好在边缘最好留一点余量用 1.2k 或 1.5k。如果你用 4.7kRmin 肯定满足因为 4.7k 比 967Ω 大得多。所以 Rmin 通常不是问题除非你为了提速把电阻降到几百欧。我见过有人为了 1MHz 高速直接上 680Ω结果灌电流超标低电平失败。高速模式虽然上升时间要求紧但也不是无脑减小电阻要先看器件能不能承受。2.2 Rmax 怎么算上升时间与总线电容上拉电阻的最大值由总线上升时间要求决定。IIC 规范对不同速率规定了最大上升时间 tr。标准模式 100kHztr 最大 1000ns快速模式 400kHztr 最大 300ns快速 模式 1MHztr 最大 120ns高速模式 3.4MHztr 最大 60ns 左右。总线释放后电压从低电平向高电平充电RC 充电到 VIH 阈值所需的时间就是上升时间。IIC 规范通常定义上升时间从 0.3VDD 到 0.7VDD。根据 RC 充电公式从 0.3VDD 充到 0.7VDD 所需时间是tr 0.8473 × Rp × Cb反过来上拉电阻最大值Rmax tr / (0.8473 × Cb)其中 Cb 是总线总电容单位法拉tr 是规范允许的最大上升时间单位秒Rp 是上拉电阻等效值单位欧姆。这个公式是 IIC 上拉电阻计算里最关键的一个。很多人只知道 4.7k却不知道这个 4.7k 对应的总线电容和上升时间是多少。如果 Cb 是 100pF400kHz 下 Rmax300ns/(0.8473×100pF)300e-9/(8.473e-11)3540Ω4.7k 就超了所以 400kHz 下 4.7k 可能太大。如果 Cb 是 200pFRmax1770Ω4.7k 更是远远超标。这就是为什么很多板子在 100kHz 下用 4.7k 没问题一升到 400kHz 就通信失败因为上升沿根本没在采样点之前到达 VIH。2.3 公式里的 0.8473 到底怎么来的这个 0.8473 不是拍脑袋来的它来自 RC 充电的指数曲线。假设电容从 0.3VDD 开始充电目标值是 VDD充电公式是V(t) VDD - (VDD - 0.3VDD) × e^(-t/RC)当电压达到 0.7VDD 时代入0.7VDD VDD - 0.7VDD × e^(-t/RC) 0.7VDD × e^(-t/RC) 0.3VDD e^(-t/RC) 0.3/0.7 0.4286 -t/RC ln(0.4286) -0.8473 t 0.8473 × RC所以 tr0.8473×Rp×Cb。这个推导假设低电平起始点是 0.3VDD高电平阈值是 0.7VDD。实际低电平可能更低比如 0.2VDD那么系数会稍有变化但 IIC 规范用 0.3VDD 到 0.7VDD 定义上升时间所以我们就用 0.8473。有些资料用 0.8 或者 0.85 近似差别不大。记住这个系数你就能自己推出 Rmax不用死记硬背。另外这个公式只考虑了上拉电阻给总线电容充电没有考虑器件输入漏电流和上拉电阻的容差。实际选型时要在算出来的 Rmax 上留 20% 到 30% 的余量因为电阻有 1% 到 5% 的容差电容也会随温度、电压和批次变化。2.4 电压、速率、Cb 一起放进去一个完整算例光看公式容易飘我们拿一个实际场景算一遍。假设主控是 3.3V总线速率 400kHz总线上挂了 6 个从机PCB 走线大约 15cm总线电容估算为 180pF。从机器件手册给出 IOLmax3mAVOLmax0.4V。先算 RminRmin (3.3 - 0.4) / 0.003 966.7Ω再算 Rmax。400kHz 快速模式tr 最大 300nsCb180pFRmax 300ns / (0.8473 × 180pF) 300e-9 / (1.525e-10) 1967Ω所以上拉电阻必须在 967Ω 到 1967Ω 之间。标准阻值里1.2k、1.5k、1.8k 都满足。如果选 1.8k接近上限余量不大选 1.5k 比较稳但功耗稍大选 1.2k 更快灌电流约 (3.3-0.4)/12002.4mA低于 3mA也安全。实际我会选 1.5k兼顾速度和余量。如果 Cb 不是 180pF而是 300pFRmax300ns/(0.8473×300pF)1180Ω这时 1.2k 刚好1.5k 就超了。所以总线电容的估算非常关键估小了上拉电阻选大通信失败估大了上拉电阻选小灌电流可能超标。后面我会讲怎么估 Cb。3. 从手册到选型一次完整的上拉电阻计算流程3.1 第一步先把总线速率和电压定死计算上拉电阻之前先明确三个参数总线速率、总线电压、器件的 IOL/VOL。总线速率决定了 tr 上限标准模式 100kHz 对应 1000ns快速模式 400kHz 对应 300ns快速 1MHz 对应 120ns高速模式 3.4MHz 对应更小的值。总线电压决定了 Rmin 公式里的 VDD也决定了 VOL 和 VIL 的绝对值。IIC 总线可以是 1.8V、2.5V、3.3V、5V但同一段总线的上拉电压必须一致不能有的上拉到 3.3V有的上拉到 5V否则高电平不一致器件可能损坏。如果主控是 3.3V从机是 5V不能直接把 5V 上拉接到 3.3V 引脚必须用电平转换器比如 MOS 管电平转换电路两侧各自上拉上拉电阻分别计算。这一步定错了后面算得再准也没用。3.2 第二步估总线电容 Cb别只信手册总线电容 Cb 是 Rmax 公式里最不确定的量。它由很多部分组成PCB 走线电容、器件引脚电容、连接器电容、电缆电容、探头电容。PCB 走线的电容大约是 1 到 3pF/cm取决于线宽、线距、层叠和介质。普通 FR4 上一条 10cm 的 IIC 走线大约 10 到 30pF。每个器件的 SDA/SCL 引脚大约 5 到 10pF6 个器件就是 30 到 60pF。连接器每个触点大约 1 到 5pF几个连接器加起来 10 到 20pF。如果是排线或者电缆每米大约 50 到 100pF1 米电缆就是 50 到 100pF。示波器探头 10:1 探头大约 10 到 15pF测量时会额外增加总线电容所以测量到的上升时间会比实际略慢。把这些加起来一条 15cm 走线、6 个器件、两个连接器的总线Cb 大概在 150 到 250pF 之间。如果走线更长或者有电缆Cb 可能超过 400pF这时标准模式也会吃力。IIC 规范对标准模式和快速模式的最大总线电容规定是 400pF快速 是 550pF高速模式是 100pF。超过这个值就要考虑缓冲器或者降低速率。3.3 第三步查器件的 IOL 与 VOL别拿典型值凑很多新手从手册里看到 VOL 典型值 0.1V就以为没问题其实要看最大值。IOL 也一样要看最大值但注意 IOLmax 是器件能承受的最大灌电流不是实际灌电流。实际灌电流由上拉电阻和电源电压决定必须小于 IOLmax。通常 IIC 器件的 IOLmax 在 3mA 左右有些低功耗器件只有 1mA 甚至更小比如某些传感器。如果总线上有 IOL 只有 1mA 的器件Rmin(3.3-0.4)/0.0012900Ω这时上拉电阻不能小于 2.9k否则那个器件拉低时 VOL 会超标。所以计算 Rmin 时要遍历总线上所有器件取最小的 IOLmax。同样VOLmax 也要取最差的值有些器件在 3mA 下 VOLmax0.4V有些在 1mA 下 VOLmax0.2V要按实际灌电流对应的 VOL 来判断。如果手册只给了曲线那就按最坏情况取点。3.4 第四步算 Rmin、Rmax选标准阻值有了 VDD、IOL、VOL、tr、Cb就可以算 Rmin 和 Rmax。计算出来的范围可能很窄比如 967Ω 到 1180Ω这时只能选 1k 或者 1.1k而且要考虑电阻容差和温度变化。如果范围很宽比如 967Ω 到 2950Ω那 1.5k、2.2k、2.7k 都可以优先选常见的 2.2k 或者 2.7k兼顾功耗和速度。选标准阻值时不要选刚好等于 Rmax 的值要留 20% 余量。比如 Rmax2950Ω选 2.2k 比 2.7k 更稳因为 2.7k 已经接近上限温度升高或者电容变大就可能超。也不要选刚好等于 Rmin 的值比如 Rmin967Ω选 1k 太边缘选 1.2k 或 1.5k 更安全。如果算出来 Rmin 大于 Rmax说明当前条件下无解必须降低总线速率、减小总线电容、更换 IOL 更大的器件或者使用 I2C 缓冲器。这种情况在长线、多器件、高速率同时出现时很常见。3.5 第五步上电实测上升时间别省这一步计算只是纸上谈兵实际板子上的电容、电阻容差、器件差异都会影响波形。算完选好电阻一定要上电用示波器测上升时间。测量点选在主控端或者总线一端探头用 10:1 低电容探头地线用弹簧地不要用长鳄鱼夹否则会引入额外电感和电容。触发方式设为上升沿触发时基调到 200ns/div 或者 500ns/div看 0.3VDD 到 0.7VDD 的时间。如果实测上升时间小于规格的 80%说明余量充足如果接近规格值就要考虑减小上拉或者降低速率如果超过规格通信肯定不稳定。同时也要看下降沿下降沿由开漏管拉低通常很快但如果出现振铃或者台阶可能是走线电感或者多器件同时拉低引起的。实测这一步不能省我见过太多“算出来没问题实际就是不通”的案例最后都是 Cb 估小了或者有隐藏的并联上拉。4. 踩坑实录上拉电阻小了不通信、大了也不通信4.1 上拉太小低电平被抬高VOL 超标上拉电阻太小最直接的后果是灌电流过大。比如 3.3V 总线用了 1k 上拉低电平时电流 (3.3-0.4)/10002.9mA如果器件 IOL 只有 2mA那 VOL 就会升高到可能超过 0.3VDD。接收端看到低电平不够低就会误判为高电平或者不确定通信失败。有些发热严重的板子上拉电阻用的是 470Ω甚至 220Ω低电平时电流十几毫安开漏管烫得厉害长期工作可能损坏。另外上拉电阻太小会让上升沿非常陡容易产生过冲和振铃尤其是走线较长时过冲可能超过电源电压导致器件闩锁或者误触发。热搜里“i2c 上拉电阻小了不通信”说的就是这种情况虽然不如上拉太大常见但确实存在。解决方法是增大上拉电阻或者降低总线电压或者换 IOL 更大的器件。4.2 上拉太大上升沿爬不上去误码和 NACK上拉电阻太大是更常见的问题。上升沿变缓电压还没到 VIH 就被采样主控读到的数据就是错的表现为随机 NACK、数据错位、设备偶尔掉线。尤其是在 400kHz 和 1MHz 下采样点靠近上升沿末端如果上升时间超过规格通信必然失败。我遇到过一块板子100kHz 下正常400kHz 下就不行示波器一看上升时间 800ns远超 300ns 上限。把 10k 换成 2.2k 后上升时间降到 180ns通信立刻稳定。上拉太大还会让总线对干扰更敏感因为高电平驱动能力弱一点点漏电流或者噪声就能把电平拉下来。如果总线上有多个器件它们的输入漏电流会在上拉电阻上产生压降进一步降低高电平。所以上拉电阻不能盲目取大低功耗应用也要在速率和功耗之间做权衡。4.3 多个模块并联上拉等效电阻变小这是最隐蔽的坑之一。很多从机模块出厂时自带 4.7k 上拉你插了 8 个模块就相当于 8 个 4.7k 并联等效 587Ω。这时灌电流可能超标低电平失败。更麻烦的是你如果只按单个模块算根本想不到总线上有这么多上拉。解决办法是检查每个模块的原理图把多余的上拉电阻去掉只保留一组通常放在主控端。如果模块上的上拉不能拆可以换成大阻值或者用 I2C 开关把模块分段避免所有上拉同时并联。还有一种情况是主控端已经有一个 4.7k你又在外围加了一个 4.7k并联后 2.35k虽然可能还能工作但已经偏离了原设计。所以画板时最好明确整条总线只有一组上拉放在主控端或者总线一端。4.4 常见问题速查表现象可能原因排查方法解决完全无应答上拉太大、总线电容过大、器件没供电示波器看 SCL/SDA 是否有波形测上拉电压减小上拉检查供电降低速率100kHz 正常400kHz 失败上升时间超规格测 0.3VDD 到 0.7VDD 上升时间减小上拉降低速率减小 Cb随机 NACK上拉偏大、干扰、多器件并联看波形是否有台阶、毛刺减小上拉增加滤波去掉多余上拉低电平偏高上拉太小、灌电流超标测 VOL算实际灌电流增大上拉换 IOL 更大的器件某个模块插上就失败模块自带上拉并联断电量等效电阻去掉模块上拉或用 I2C 开关长线通信不稳定总线电容大、反射测上升时间看振铃用缓冲器降低速率加终端上电偶尔失败上拉太小导致 VOL 高或电源时序多次上电测波形调整上拉加复位检查时序4.5 示波器测量的几个细节测 IIC 波形时探头电容会加载到总线上10:1 探头大约 10 到 15pF如果总线电容本来只有 100pF加上探头就变成 115pF上升时间会变慢 15%。所以测出来的上升时间比实际略大这是正常的但心里要有数。如果测出来刚好在规格边缘实际可能还有余量如果测出来超标实际肯定超标。地线要尽量短用探头自带的弹簧地不要用长鳄鱼夹否则高频振铃会掩盖真实波形。触发方式可以用 SCL 下降沿触发看 SDA 的建立时间也可以看起始条件的波形。如果总线出现台阶可能是多个上拉并联或者走线分支太长。测量点选在总线末端和最远端各测一次末端波形通常最差因为电容最大。如果只有一台示波器优先测最远端的从机引脚。5. 不同场景下的上拉策略速率、电压、长线和低功耗5.1 标准、快速、快速与高速模式不同速率下上拉电阻的取值范围差别很大。标准模式 100kHztr 上限 1000nsCb 400pF 时 Rmax1000ns/(0.8473×400pF)2950Ω所以 2.2k 到 2.7k 很常见4.7k 在 Cb 较小时也能用。快速模式 400kHztr 上限 300nsCb 200pF 时 Rmax1770Ω1.5k 到 2.2k 比较合适4.7k 通常太大。快速 模式 1MHztr 上限 120nsCb 100pF 时 Rmax1416Ω1k 到 1.2k 比较合适2.2k 就太大了。高速模式 3.4MHztr 上限更小Cb 要求 100pF 以内上拉电阻可能低到几百欧但这时灌电流也大必须确认器件的 IOL 足够。很多器件支持高速模式但需要主控先发高速模式命令并且上拉电阻和总线电容都要满足更严的要求。5.2 3.3V 与 5V 混压总线3.3V 和 5V 混压是常见场景。如果主控是 3.3V从机是 5V 开漏器件理论上可以把总线统一上拉到 3.3V因为 5V 开漏器件只负责拉低不输出高只要它的 VIL 能识别 3.3V 的低电平和高电平即可。很多 5V 器件的高电平输入阈值是 0.7×5V3.5V3.3V 高电平可能不够所以不能简单统一到 3.3V。这时需要电平转换或者把总线上拉到 5V但主控 3.3V 引脚不能承受 5V所以必须用电平转换器。常见的 MOS 管电平转换电路低压侧上拉到 3.3V高压侧上拉到 5V栅极接 3.3V源极接低压侧漏极接高压侧。两侧的上拉电阻要分别按各自的 VDD、Cb 和 tr 计算不能共用一个。如果使用专用 I2C 电平转换芯片手册通常会给出推荐上拉值按手册来即可。5.3 长线、多板卡与缓冲器当总线走线很长比如超过 30cm或者通过排线、连接器连接到多块板卡总线电容很容易超过 400pF。这时不管上拉电阻怎么选标准模式都可能失败因为 Rmax 会变得很小甚至小于 Rmin无解。解决办法是降低速率、使用 I2C 缓冲器、使用 I2C 开关或者差分延长芯片。I2C 缓冲器可以把总线分成两段每段各自有上拉电阻电容不累加上升时间容易满足。缓冲器还会重新驱动总线提高抗干扰能力。如果只是两块板卡也可以用 I2C 多路复用器按需切换。长线还要注意地线回流和串扰SCL 和 SDA 尽量靠近地线走或者用双绞线每根信号配一根地。上拉电阻在长线场景下通常取 1.5k 到 2.2k但具体还是要算。5.4 低功耗设备的上拉取舍电池供电的设备希望上拉电阻大一些因为总线低电平时电流 IVDD/RR 越大静态功耗越小。但 R 越大上升时间越长速率就上不去。所以低功耗设备通常跑 100kHz 甚至更低上拉电阻可以取 10k、22k 甚至 47k前提是总线电容小、器件漏电流小。如果 Cb 只有 50pF100kHz 下 Rmax1000ns/(0.8473×50pF)23600Ω47k 就太大了22k 可以。但如果 Cb 有 200pFRmax5900Ω10k 就超了只能用 4.7k。所以低功耗不是无脑加大电阻而是先满足上升时间再在范围内选大值。有些低功耗器件支持 1.8V 总线Rmin 会更小因为 VDD 低了Rmin(1.8-0.2)/0.002800Ω但 Rmax 不变所以范围可能更窄。低功耗设计还要考虑上拉电阻在总线空闲时没有电流只有通信时才有平均功耗取决于通信占空比。6. 个人常用参数表与最后几个提醒6.1 快速选型表3.3V/5V下面这张表是我在一般 PCB 走线、总线电容 100 到 200pF、器件 IOL 3mA 的情况下常用的上拉电阻参考值。注意这只是起点实际还要按公式算和实测。总线电压速率总线电容约 100pF总线电容约 200pF总线电容约 400pF3.3V100kHz4.7k 到 10k2.7k 到 4.7k1.5k 到 2.7k3.3V400kHz2.2k 到 3.3k1.5k 到 2.2k1.0k 到 1.5k3.3V1MHz1.0k 到 1.5k0.82k 到 1.2k不推荐5V100kHz4.7k 到 10k2.7k 到 4.7k2.2k 到 3.3k5V400kHz2.2k 到 3.3k1.8k 到 2.7k1.2k 到 1.8k5V1MHz1.2k 到 1.8k1.0k 到 1.5k不推荐这张表里的“不推荐”不是说完全不能用而是说 Cb 400pF 加 1MHz 时Rmax 会小到和 Rmin 冲突除非器件 IOL 很大、电压很低否则最好用缓冲器分段。表中的阻值是近似范围实际要按公式算。比如 3.3V、400kHz、Cb200pFRmax1770Ω所以 1.5k 到 1.8k 比较稳2.2k 已经接近上限3.3k 就超了。5V、400kHz、Cb200pFRmax 一样是 1770Ω但 Rmin(5-0.4)/0.0031533Ω所以范围只有 1533Ω 到 1770Ω非常窄只能选 1.6k 或 1.8k1.5k 会低于 Rmin。这就是 5V 总线的麻烦之处电压高灌电流大Rmin 抬高可选范围变窄。6.2 最后几个提醒第一个提醒上拉电阻只放一组不要每个器件都放。我拆过太多模块上面自带 4.7k插多了等效电阻小得离谱低电平直接失败。画板时最好在原理图上标注“IIC 上拉只此一处”避免后来的人重复添加。第二个提醒示波器测上升时间时一定要用低电容探头和短地线。探头电容会额外增加总线电容测出来的上升时间偏大但这是保守的可以接受。如果看到波形有台阶先怀疑多个上拉并联或者走线分支。第三个提醒降低速率永远是最快的临时手段。如果板子已经贴片没法换电阻先把 400kHz 降到 100kHz很多通信问题会立刻消失。这不是长久之计但可以帮你判断问题是不是出在上升时间上。第四个提醒不要忽略器件的 IOL 和 VOL。有些低功耗传感器 IOL 只有 1mA上拉电阻不能太小有些器件 VOL 在 3mA 下高达 0.6V如果 VIL 是 0.3VDD0.99V还能用但如果电源电压降到 2.5VVIL0.75V0.6V 就接近极限了。所以低压总线要特别小心。第五个提醒长线或者多板卡优先考虑 I2C 缓冲器不要硬算上拉电阻。缓冲器把电容分段每段独立上拉计算简单抗干扰也好。如果非要用长线速率降到 50kHz 以下上拉取小一点同时加 TVS 或者 RC 滤波。第六个提醒电阻封装功率也要看一眼。虽然大多数情况下功耗很小但 0402 电阻额定 0.063W如果上拉电阻取 220Ω、总线 5V低电平时电流 22mA功耗 0.11W已经超过 0402 的额定值电阻会发烫甚至失效。所以极小阻值只在高速、低 Cb 且短时间内使用或者换更大封装。写到这里IIC 上拉电阻计算这件事基本就拆完了。我自己的习惯是先按公式算出 Rmin 和 Rmax选一个中间偏小的标准阻值上电测上升时间再看通信是否稳定。如果稳定且余量够就定稿如果不稳优先减小上拉或者降低速率而不是盲目换大。上拉电阻不大但它决定的是总线能不能在正确的时间到达正确的电平这才是 IIC 通信的根基。
返回列表