一般的なプロトコル
I2C プロトコルは、複数のデバイス間の構造化された通信をサポートしているため、シリアル通信プロトコルよりも複雑です。どのように動作するのかを見てみましょう。
コントローラー → ターゲット
コントローラーがターゲットにデータを送信したい場合:
- コントローラー: START をブロードキャスト
- C: ターゲットアドレス(7 ビット)+ WRITE に設定された R/W(8 番目)ビットをブロードキャスト
- ターゲット: ACK(確認応答)を返す
- C: 1 バイト送信
- T: ACK を返す
- 手順 4 と 5 を 0 回以上繰り返す
- C: STOP をブロードキャストするか、新しい読み取りトランザクションを開始する
注記 ターゲットアドレスは、7 ビット長ではなく 10 ビット長であってもかまいません。それ以外は何も変わりません。
コントローラー ← ターゲット
コントローラーがターゲットからデータを読み取りたい場合:
- C: START をブロードキャスト
- C: ターゲットアドレス(7 ビット)+ READ に設定された R/W(8 番目)ビットをブロードキャスト
- T: ACK を返す
- T: 1 バイト送信
- C: ACK を返す
- 手順 4 と 5 を 0 回以上繰り返す
- C: STOP をブロードキャストするか、新しい書き込みトランザクションを開始する
注記 ターゲットアドレスは、7 ビット長ではなく 10 ビット長であってもかまいません。それ以外は何も変わりません。
「デバイスレジスタ」
多くの I2C ターゲットは、内部的に「デバイスレジスタ」を持つように構成されており、それぞれが 8 ビットのアドレスと 8 ビットの内容を持ちます。通常、デバイスレジスタは 2 バイトの書き込みで書き込まれます。1 バイト目がレジスタアドレスで、2 バイト目が新しいレジスタ値です。
いわゆる「combined」または「split」トランザクションは、上の図に示したように、ターゲットへの書き込みの直後にターゲットから読み戻す処理で構成されることがあります。通常、デバイスレジスタはこの方法で読み取られます。つまり、デバイスレジスタアドレスを書き込み、その直後に現在のデバイスレジスタ値を読み戻します。
一部の I2C ターゲットでは、何らかの「アドレス自動インクリメント」によって、隣接するアドレスを持つ複数のデバイスレジスタを読み書きできます。これにより、最初のデバイスレジスタアドレスだけを送信し、その後の読み取りまたは書き込みではデバイスがアドレスをインクリメントすることに任せられます。
I2C は複雑なプロトコルであり、さまざまなバリエーションや特別な機能が存在します。ターゲットと通信するために何をする必要があるかを確認するには、そのターゲットのマニュアルを注意深く読んでください。