I²C のプルアップ抵抗は、下限と上限の間で選ぶ
4.7kΩ は 5V・100kHz・小さなバスでの経験値で、3.3V・400kHz でモジュールを 5 つつなぎケーブルを 30cm 伸ばすと間に合いません。抵抗には下限と上限があり、どちらも計算で決められます。
オープンドレインだから、抵抗が立ち上がりを決める
I²C の SDA と SCL はオープンドレイン出力で、デバイスは線を Low に引くことしかできません。High に戻すのはプルアップ抵抗で、Rp がバス容量 Cb を充電するので、立ち上がりは時定数 Rp·Cb で決まります。抵抗が小さいほど立ち上がりは速く、Low に引く電流は増えます。
以下の主な計算例は、VDD=3.3V、VOL=0.4VでIOL=3mAを使うStandard/Fast-modeの抵抗プルアップです。30〜70%立ち上がり時間の上限はStandard-modeで1000ns、Fast-modeで300ns、Fast-mode Plusで120nsです。バス容量上限はStandard/Fastで400pF、Fast-mode Plusで550pFと異なり、各ICの電圧条件と駆動能力も確認します。
下限:3mA で 0.4V 以下に引けるか
デバイスが線を Low に引くとき、プルアップから流れ込む電流は (VDD − VOL) ÷ Rp です。これが規格のシンク電流 3mA を超えると、VOL を 0.4V 以下に保証できません。
Rp(min) = (VDD − 0.4V) ÷ 3mA。VDD = 3.3V なら 967Ω、5V なら 1.53kΩ で、これより小さい抵抗は使えません。Fast mode Plus 対応のデバイスは 20mA まで引けるので、3.3V で 145Ω まで下げられます。3mA 引けないデバイスがあれば、その IOL で計算し直します。
上限:立ち上がり時間に間に合うか
RC 充電で 30% から 70% まで上がる時間は tr = Rp · Cb · ln(0.7 ÷ 0.3) ≒ 0.847 · Rp · Cb です。規格の上限から、Rp(max) = tr(max) ÷ (0.847 · Cb)。
バス容量が 100pF なら、Standard mode(1000ns)で 11.8kΩ、Fast mode(300ns)で 3.5kΩ、Fast mode Plus(120ns)で 1.4kΩ が上限です。3.3V・Fast mode で 4.7kΩ を使うと、100pF で既に上限を超えています。4.7kΩ で間に合うのは、Standard mode で 250pF 程度、Fast mode で 75pF 程度までです。
バス容量の見積もりと、成立する範囲
バス容量は、デバイスのピン容量(規格上 10pF 以下、実際は 5〜10pF)、基板配線(0.5〜1pF/cm)、ケーブル(50〜100pF/m)の合計です。デバイス 5 個、配線 20cm、ケーブル 30cm なら 50 + 15 + 25 = 90pF 程度で、ESD 保護ダイオードは 1 個あたり数 pF です。
3.3V・Fast mode で成立する範囲は、100pF で 0.97k〜3.5kΩ、200pF で 0.97k〜1.8kΩ です。400pF は上限(0.9kΩ)が下限(0.97kΩ)を下回り、成立しません。200pF 以下に抑えるか、バスを分割するか、バッファ IC を入れます。 ここで400pFが成立しないという判断は、3.3V・3mA・300ns・単純な抵抗プルアップという仮定に限ります。
範囲の中でどこを選ぶか
上下限の間にあることは抵抗と容量の条件を満たすという意味で、通信全体の保証ではありません。電圧レベル、クロックのHigh/Low期間、変換回路、全デバイスの仕様も確認します。抵抗を小さくすると充電は速くなりますが、Low時の電流が増えるため、許容差を含めた下限を割らないことが条件です。
上限の一定割合を機械的に選ぶより、次の例のように抵抗最大・容量最大の立ち上がりと、抵抗最小・電源最大の電流を別々に検算します。余裕がなくなった側に応じて容量低減・抵抗変更・速度低下を選びます。
抵抗の許容差と、モジュールの並列抵抗を含める
Fast-mode、3.3V、100pF、IOL=3mA、VOL=0.4Vなら、公称計算の範囲は約967Ω〜3.54kΩです。2.2kΩ±5%を1本なら2.09〜2.31kΩで、最悪立ち上がりは0.8473 × 2.31kΩ × 100pF ≈ 196nsです。容量が150pFになると約294nsになり、300nsにほとんど余裕がありません。 200pFなら約391nsで、この抵抗では上限を超えます。
4.7kΩ±5%のプルアップが5枚のモジュールに付いていると、並列値は893〜987Ωです。最小値893Ωでは(3.3 − 0.4) ÷ 893 ≈ 3.25mAとなり、仮定した3mA条件を外れます。追加する抵抗だけでなく全抵抗の並列値を使い、最大電源・抵抗最小でLow側、抵抗最大・容量最大で立ち上がり側を確認します。
実機で引っかかるところ
- モジュールの内蔵プルアップ。多くは 4.7kΩ や 10kΩ を載せており、5 個つなぐと 4.7kΩ が 5 並列で 940Ω になり、下限を割ります。外すか、マイコン側を省きます。
- マイコンの内蔵プルアップ。20〜50kΩ では I²C に弱すぎ、400kHz では間に合いません。外付けにします。
- レベル変換。3.3V と 5V が混在する MOSFET 方式(NXP AN10441)は、両側にプルアップが要り、それぞれの電圧で下限・上限を計算します。
- SCL のストレッチ。スレーブがクロックを引き伸ばすなら SCL もオープンドレインにします。プッシュプルのマスタと衝突します。
よくある質問
結局、3.3V なら何 kΩ を使えばよいですか。
プルアップをどこに置くべきですか。
バス容量が 400pF を超えたらどうしますか。
参考にした規格・資料
- NXP UM10204, I²C-bus specification and user manual — Rev.7.0、Table 11と§7.1:モード別の容量・電流・タイミング条件と抵抗範囲。
- NXP AN10441, Level shifting techniques in I²C-bus design — MOSFET によるレベル変換回路
- TI SLVA689, I²C Bus Pullup Resistor Calculation — 下限・上限の計算例