Tools + Simulatorsnanase.cc / tools

I2C

バス

0 / 0 クロック
速さ 速さ

クロック/秒

波形

全体

拡大

SCL クロックSDA データマスタスレーブ

結果
–
立ち上がり時間
–
Low の電圧
–
クロック
–
所要時間
–

操作

宛先
データ 1 データ 1

データ 2 データ 2

場面

速度

電源電圧

Rp プルアップ抵抗

Ω

Cb 配線の容量

F

  1. 1オープンドレイン

    1 台でも下げれば Low

  2. 2開始と終了

    SCL が High の間の SDA の変化

  3. 3ビット

    SCL が High の間に読む

  4. 4アドレス

    7 ビット+読み書き

  5. 5ACK と NACK

    9 ビット目は受け手の返事

  6. 6クロックストレッチ

    スレーブが SCL を Low に保持

  7. 7調停

    1 を送って Low なら負け

  8. 8プルアップ抵抗

    大きいほど立ち上がりが遅い

動作原理と式

線の電圧

機器の出力は線を Low に下げるか放すかだけです(オープンドレイン)。1 台でも下げていれば線は Low になり、誰も下げなければプルアップ抵抗 Rp を通して VDD へ戻ります。戻る速さは抵抗と配線の容量 Cb の積で決まります。

V(t)=VDD(1−e−t/RpCb)tr=ln0.70.3·RpCb≈0.8473RpCb

立ち上がり時間 tr は 0.3 VDD から 0.7 VDD までの時間です。機器は 0.3 VDD(VIL)より下を Low、0.7 VDD(VIH)より上を High と読み、その間では直前の値を保ちます。

プルアップ抵抗の範囲

下げている機器は Low の電圧 0.4 V で IOL(標準・ファストで 3 mA、ファストプラスで 20 mA)を流せます。抵抗が小さすぎると Low が下がりきらず、大きすぎると立ち上がりが上限(1000・300・120 ns)に間に合いません。

Rp(min)=VDD−VOL(max)IOLRp(max)=tr0.8473·Cb

Low の電圧は、下げている機器の出力を抵抗 Ron=0.4 V/IOL とみて、Rp との分圧で求めます。

通信の手順

  • 開始: SCL が High のまま SDA を Low へ
  • ビット: SDA は SCL が Low の間に変え、SCL が High の間に読む
  • 最初の 8 ビット: 宛先の 7 ビットのアドレスと読み書きの 1 ビット(0 が書き込み)
  • 9 ビット目: 受け手が SDA を Low にすれば ACK、High のままなら NACK
  • 読み出しでは、マスタが最後のバイトに NACK を返す
  • 終了: SCL が High のまま SDA を High へ
  • クロックストレッチ: スレーブが SCL を Low のまま保持し、マスタは High になるまで待つ
  • 調停: 1 を送ったのに SDA が Low なら、ほかのマスタが送っている。負けた側は送信をやめ、終了の後に送り直す

出典

  1. 開始と終了・ACK・クロックの同期・調停・クロックストレッチ(3.1 節)、入出力と線の特性(表 10・表 11)、プルアップ抵抗の範囲(7.1 節)NXP Semiconductors, UM10204 I2C-bus specification and user manual, Rev. 7.0, 2021

このツールで決めたこと

  • 仕様書の Rev. 7.0 はマスタ・スレーブをコントローラ・ターゲットと呼ぶ。画面では広く使われているマスタ・スレーブを使う
  • マスタの SCL の Low は周期の 53 %、データを変えるのは SCL の立ち下がりから周期の 12 % 後
  • スレーブは SCL の立ち下がりから周期の 10 % 後に SDA を変える
  • マスタは SCL を放したあと High になるまで待つ(クロックの同期)。立ち上がりが遅いとクロックが遅くなる
  • しきい値のヒステリシスは VIL と VIH の間とし、その間では直前の値を保つ
  • クロックストレッチは、宛先のスレーブがアドレスの ACK の後に 3.2 周期だけ保持する
  • 2 台目のマスタは同時に送り始め、1 台目と違う宛先へ書き込む
  • スレーブは 2 バイトを持ち、書き込むと置き換わり、読み出しで返す。アドレス 0x3C の機器はない
  • 時間刻みは周期の 1/200

関連ツール