I²C のプルアップ抵抗は、下限と上限の間で選ぶ
4.7kΩ は 5V・100kHz・小さなバスでの経験値です。3.3V の 400kHz で、モジュールを 5 つつないでケーブルを 30cm 伸ばすと、4.7kΩ では立ち上がりが間に合いません。抵抗には下限と上限があり、その両方を計算できます。
オープンドレインだから、抵抗が立ち上がりを決める
I²C の SDA と SCL はオープンドレイン出力で、デバイスは線を Low に引くことしかできません。High に戻すのはプルアップ抵抗の仕事です。線を Low から High にするとき、抵抗 Rp がバスの容量 Cb を充電するので、立ち上がりは時定数 Rp·Cb で決まります。
抵抗が小さいほど立ち上がりは速くなりますが、Low に引くときにデバイスが流す電流が増えます。抵抗が大きいほど電流は減りますが、立ち上がりが遅くなります。下限は電流で、上限は立ち上がり時間で決まります。
I²C 規格は、Low レベルの出力電圧 VOL = 0.4V のときのシンク電流 IOL を 3mA(Standard / Fast mode)、立ち上がり時間 tr(30%→70%)の最大を Standard mode で 1000ns、Fast mode で 300ns、Fast mode Plus で 120ns と決めています。バス容量の上限は 400pF です。
下限: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 です。規格の tr 上限から、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 で既に上限を超えています。
バス容量は、各デバイスのピン容量(規格上 10pF 以下、実際は 5〜10pF)、基板配線(0.5〜1pF/cm)、ケーブル(50〜100pF/m)の合計です。デバイス 5 個、配線 20cm、ケーブル 30cm なら 50 + 15 + 25 = 90pF 程度。ESD 保護ダイオードを入れると 1 個あたり数 pF 加わります。
| バス容量 | Standard 100kHz | Fast 400kHz | Fast+ 1MHz |
|---|---|---|---|
| 50pF | 0.97k〜23.6kΩ | 0.97k〜7.1kΩ | 0.15k〜2.8kΩ |
| 100pF | 0.97k〜11.8kΩ | 0.97k〜3.5kΩ | 0.15k〜1.4kΩ |
| 200pF | 0.97k〜5.9kΩ | 0.97k〜1.8kΩ | 0.15k〜0.7kΩ |
| 400pF | 0.97k〜3.0kΩ | 不可* | 0.15k〜0.35kΩ |
* 上限(0.9kΩ)が下限(0.97kΩ)を下回り、成立しません。規格上の最大容量 400pF は、Fast mode では 3mA のシンク電流で立ち上がりを間に合わせられない領域です。実際には 200pF 以下に抑えるか、バスを分割するか、バッファ IC を入れます。
範囲の中でどこを選ぶか
下限と上限の間なら動きますが、どちらに寄せるかで消費電力とノイズ耐性が変わります。
小さい抵抗(下限寄り)。立ち上がりが速く、外来ノイズに強い。Low のときに流れる電流が増えます。3.3V で 1kΩ なら 2.9mA、SDA と SCL の両方で最大 6mA。クロックはデューティ 50% で Low なので、SCL だけで平均 1.5mA。電池駆動では無視できません。
大きい抵抗(上限寄り)。消費電力は減りますが、立ち上がりが規格ぎりぎりになり、温度やデバイスの追加で外れやすくなります。ハイインピーダンスなのでノイズも拾います。
実務的には、上限の 1/2〜1/3 を選ぶと、バス容量の見積もり誤差やデバイスの追加に対して余裕が持てます。3.3V・Fast mode・100pF なら 1.5〜2.2kΩ、Standard mode なら 4.7kΩ が妥当、という結論になります。
実機で引っかかるところ
- モジュールに内蔵されたプルアップ。市販のセンサモジュールの多くは基板上に 4.7kΩ や 10kΩ のプルアップを持っています。5 個つなぐと 4.7kΩ が 5 並列で 940Ω になり、下限を割ります。モジュールのプルアップを外すか、マイコン側のプルアップを省きます。
- マイコンの内蔵プルアップ。GPIO の内蔵プルアップは 20〜50kΩ で、I²C には弱すぎます。400kHz では確実に立ち上がりが間に合いません。外付けにしてください。
- レベル変換。3.3V と 5V のデバイスを混在させる場合、MOSFET のレベル変換回路(NXP AN10441 の方式)は、両側にそれぞれプルアップが要ります。それぞれの電圧で下限・上限を計算します。
- 立ち上がりの実測。オシロスコープで SCL の立ち上がりを見て、30%→70% の時間が規格の上限に対して余裕があるか確認します。波形が丸まって High レベルに届く前に次の Low が来ているなら、抵抗を下げるか容量を減らします。
- SCL のストレッチ。スレーブがクロックを引き伸ばす機能を使う場合、SCL も双方向になり、マスタ側で SCL をプッシュプルで駆動していると衝突します。SCL もオープンドレインにします。
よくある質問
結局、3.3V なら何 kΩ を使えばよいですか。
SDA と SCL で違う抵抗値にしてもよいですか。
プルアップをどこに置くべきですか。
バス容量が 400pF を超えたらどうしますか。
参考にした規格・資料
- NXP UM10204, I²C-bus specification and user manual — VOL / IOL、tr、Cb の規定値、プルアップ抵抗の計算式(Section 7.1)
- NXP AN10441, Level shifting techniques in I²C-bus design — MOSFET によるレベル変換回路
- TI SLVA689, I²C Bus Pullup Resistor Calculation — 下限・上限の計算例