ElectroDesignForgeElectroDesignForge
信号とインターフェース電子部品PCB設計

I²Cバス:配線・アドレス・プルアップ抵抗

SDA/SCLの役割、7ビットアドレス、通信速度、バス容量、立ち上がり時間、プルアップ抵抗値を踏まえて、信頼性の高いI²Cバスを設計します。

執筆・技術レビューElectroDesignForge Engineering Team

編集方針を見る

要点:I²Cはデータ用のSDAとクロック用のSCLという二本の共通線で複数のICを接続します。出力は通常オープンドレインで、デバイスが線をLOWに引き下げ、プルアップ抵抗がHIGHに戻します。抵抗値はLOW時のシンク電流の上限と、通信速度およびバス全体の容量で決まる立ち上がり時間の両方を満たす必要があります。


早見表

モードSCLの最大周波数最大立ち上がり時間t_r(30–70%)各線の基準容量
標準モード(Sm)100 kHz1000 ns400 pF
高速モード(Fm)400 kHz300 ns400 pF
高速モードプラス(Fm+)1 MHz120 ns550 pF

これらはI²C仕様の上限です。最も低速な部品に合わせて速度を下げる必要があります。コントローラが対応しているだけでFm+を選ばず、すべてのターゲット、レベルシフタ、アイソレータの対応を確認してください。

SDAとSCL:共通の信号線

SDAはアドレス、読み書きビット、データバイト、応答を運びます。SCLは転送のタイミングを決めます。アイドル時は両方の線がHIGHです。SCLがHIGHの間にSDAが下降するとSTART、上昇するとSTOPです。

データ転送中は、SCLがHIGHの間にSDAを安定させます。コントローラは八ビットを送信して九番目のクロックでSDAを解放し、受信側はSDAをLOWにしてACKを返すか、HIGHのままにしてNACKを返します。

                 +3.3 V                         +3.3 V
                   |                              |
                  [Rp]                           [Rp]
                   |                              |
SDA  ──────────────+──── 制御側 ── 対象 A ── 対象 B
SCL  ──────────────+──── 制御側 ── 対象 A ── 対象 B
GND  ───────────────────── 全機器で共通

SDAとSCLにそれぞれ実効的なプルアップ抵抗を一つ設けます。複数のモジュールに内蔵抵抗があると並列接続になります。4.7 kΩを二個並列にすると2.35 kΩ、四個なら1.18 kΩです。抵抗を追加する前に各モジュールの回路図を確認してください。

オープンドレインを使う理由

デバイスはバスを積極的にHIGHへ駆動せず、線を解放するかLOWへ引き下げます。複数が同時に動作してもLOWが優先され、出力段同士が短絡しません。このワイヤードAND動作によって応答、複数コントローラ間の調停、クロックストレッチが可能になります。

クロックストレッチを行うターゲットがない単一コントローラ構成では、SCLをプッシュプルにできる場合もあります。その例外は明記してください。互換性を重視するI²Cバスでは、SCLもプルアップ付きのオープンドレインにします。

配線、グラウンド、電圧レベル

すべてのデバイスを並列につなぎます。SDA同士、SCL同士を接続し、グラウンドを共通にします。長い枝線を持つスター配線は避けてください。枝線は容量、反射、ノイズ感受性を増やします。PCB上では信号を短くし、連続したグラウンド面の上を通して高速スイッチング部から離します。

プルアップ先の電源がHIGHの電圧を決めます。電源が切れたマイコンも含め、すべてのI/Oに適合する必要があります。データシートで許可されていない限り、1.8 Vの部品を3.3 Vのプルアップに直結しないでください。必要ならI²C対応のレベルシフタを使い、その回路で要求される場合は両側にプルアップを設けます。

マイコン内蔵のプルアップは20 to 100 kΩ程度のことが多く、短い配線で非常に低速なら使える場合がありますが、負荷のある100/400 kHzのバスでは通常弱すぎます。実際の抵抗値を確認してください。

アドレスは7ビット形式(8ビット表記との違いに注意)

ほとんどのICは7-bitのターゲットアドレスを使います。バス上の最初のバイトは次の構成です。

[ A6 A5 A4 A3 A2 A1 A0 | R/W ]

R/Wビットはバス上で追加され、ライブラリに渡す7-bitアドレスの一部ではありません。アドレス0x68のターゲットは書き込み時に0xD0、読み出し時に0xD1として現れます。0xD0を要求するAPIは8-bit表記かもしれません。二重にシフトしないよう確認してください。

多くのセンサーではADDR、SA0、SDOピンでアドレスを選びます。確定した論理レベルにつなぎ、回路図にアドレスを記載します。固定アドレスが重複する場合はI²Cマルチプレクサ、別のコントローラ、別品種を使います。十ビットアドレスもありますが一般的ではありません。センサーの内部レジスタ番号はI²Cアドレスではありません。

通信速度、SCL、クロックストレッチ

SCL周波数はタイミング上の上限であり、保証されるペイロード速度ではありません。アドレス、レジスタ、ACK/NACKビット、START/STOP条件、内部遅延がスループットを下げます。したがって400 kHzの複数レジスタ転送に要する時間は、バイト数を400 kbit/sで割った値より長くなります。

コントローラがSCLを解放した後もターゲットがLOWに保つ動作をクロックストレッチといいます。コントローラは製品のタイムアウト方針の範囲でSCLを読み取り、HIGHになるまで待つ必要があります。対応が不十分なドライバもあるため確認してください。複数コントローラ構成では、SDAを解放してもLOWを読み取った側が調停に負け、転送を停止します。

バス容量と立ち上がり時間

各信号線はRC負荷です。IC入力、配線、ケーブル、プローブ、コネクタ、寄生容量が合算されます。どのデバイスもLOWへ引かない間、プルアップ抵抗がその容量を徐々に充電します。

VDDの30%から70%までを測定する場合:

t_r ≈ 0.8473 × R_p × C_bus
R_p,max ≈ t_r,max / (0.8473 × C_bus)

抵抗はオーム、容量はファラド、時間は秒で計算します。得られる値はプルアップ抵抗の最大値で、それを超えると立ち上がりが遅すぎます。400 kHzでC_bus = 100 pFの場合:

R_p,max ≈ 300 ns / (0.8473 × 100 pF) ≈ 3.54 kΩ

4.7 kΩは消費電流が小さいものの、300 nsを100 pFで満たすには大きすぎます。3.3 kΩが初期候補ですが、LOW時の電流上限と実測値も確認してください。完成した実装で容量を測るのが最善です。見積もる場合は入力容量、ケーブルの値(pF/m)、コネクタ、PCBの余裕分を加算します。プローブ自体にも容量があります。

プルアップ抵抗の選定:成立する範囲を求める

抵抗を小さくすると立ち上がりは速くなりますが、デバイスがLOWに駆動するときの電流は増えます。下限は次の式で求めます。

R_p,min ≈ (VDD − V_OL,max) / I_OL,max

VDD = 3.3 V、V_OL,max = 0.4 V、I_OL,max = 3 mAの場合:

R_p,min ≈ (3.3 − 0.4) / 3 mA ≈ 967 Ω
R_p,min ≤ R_p ≤ R_p,max

選んだ抵抗値はこの範囲内にある場合だけ有効です。範囲が成立しなければ、容量や速度を下げる、適切なI²Cバッファを使う、またはシンク電流の大きいFm+対応デバイスを使います。動作しているように見えてもR_p,min未満を選ばないでください。V_OLが不明確になり、損失も増えます。

状況初期候補確認事項
短いPCB配線、3.3 V、100 kHz4.7 to 10 kΩ容量と既存のプルアップ抵抗
短いPCB配線、3.3 V、400 kHz2.2 to 4.7 kΩt_rと各ターゲットのI_OL
ケーブルまたは多数のモジュール計算値。通常は低めシンク電流、EMC、ケーブル末端の波形

これらの目安は、実際の構成での計算の代わりにはなりません。

測定とトラブルシューティング

コントローラから最も遠い端点でSDAとSCLを観測します。VDDの30%から70%までのt_rを測り、V_OL、リンギング、SCLがHIGHの間のSDAの安定性を確認します。

症状考えられる原因対処
ターゲットが見つからないグラウンド未接続、アドレス違い、SDA/SCLの入れ替わり導通と電源を確認し、7-bitアドレスでスキャン
両線が常にHIGHプルアップ抵抗がない、または接続先電源が違う両抵抗と電源を確認
線がLOWに張り付くターゲットのリセット、配線不良、転送の中断モジュールを切り分け、区間をリセット
不規則なNACK遅い立ち上がり、ノイズ、過大な容量や速度t_rを測り、R_pを下げるかバスを遅くする
全モジュール接続時だけ失敗並列プルアップが強すぎる、または容量の累積合成抵抗と合計容量を計算

一般的な復旧方法はSDAを解放し、SCLを最大九回パルス動作させてからSTOPを発行するものです。すべてのデータシートで許可される場合に限って使ってください。区間全体をリセットする方が確実な場合もあります。

配線設計前のチェックリスト

  1. 全部品でグラウンドとバス電圧は共通または適合しているか。
  2. SDAとSCLにそれぞれ実効的なプルアップがあり、意図しない並列接続はないか。
  3. アドレスは一意で、7-bit形式で記録されているか。
  4. 全ターゲット、シフタ、アイソレータが通信速度に対応するか。
  5. 選定した抵抗値がR_p,minとR_p,maxの範囲内か。
  6. 実際の容量を持つ基板で立ち上がり時間を確認したか。

関連計算ツール

参考資料

  • NXP Semiconductors、UM10204 — I²C-bus specification and user manual:プロトコル、電圧レベル、Sm/Fm/Fm+のタイミング。
  • 使用するコントローラ、ターゲット、シフタ、バッファ、アイソレータのデータシート:I_OL、V_OL、入力容量、クロックストレッチの対応についてはこちらを優先してください。