プロトコルの概要

複数デバイス間の通信をサポートするため、I2Cはシリアル通信よりも複雑なプロトコルとなっています。実際にどう動くのか、例を使って見てみましょう。

Master -> Slave

マスター -> スレーブ

マスターがスレーブにデータを送りたいとき、次のようになります。

  1. M(マスター):STARTをブロードキャストする
  2. M:スレーブアドレス(上位7ビット)と、WRITEに設定したR/Wビット(第8ビット)をブロードキャストする
  3. S(スレーブ):ACK(ACKnowledgement)を返信する
  4. M:1バイト送信する
  5. S:ACKを返信する
  6. 必要なだけ4と5を繰り返す
  7. M:STOPをブロードキャストする(または、RESTARTをブロードキャストして2へ戻る)

スレーブアドレスが7ビット長でなく10ビット長のときもありますが、他はなにも変わりません。

マスター <- スレーブ

マスターがスレーブからデータを読み取りたいときはこうなります。

  1. M:STARTをブロードキャストする
  2. M:スレーブアドレス(上位7ビット)と、READに設定したR/Wビット(第8ビット)をブロードキャストする
  3. S:ACK(ACKnowledgement)を返信する
  4. S:1バイト送信する
  5. M:ACKを返答する
  6. 必要なだけ4と5を繰り返す
  7. M:STOPをブロードキャストする(または、RESTARTをブロードキャストして2へ戻る)

スレーブアドレスが7ビット長でなく10ビット長のときもありますが、他はなにも変わりません。