I2Cインターフェースコントローラーのプロトコル解析

I2C バスはマルチマスター/スレーブ アーキテクチャを使用します。これは通常、データ量が少なく、伝送距離が短い状況で使用されます。

I2Cプロトコル解析

このインターフェイスには、SCL (シリアル クロック ライン) と SDA (シリアル データ ライン) の合計 2 つのバス ラインが必要です。I2C バスは半二重であるため、常に 1 つのホストのみが存在でき、各 I2C デバイスには 1 つのバス ラインが必要です。固有のデバイスアドレス。バス上ではマスタデバイスとスレーブデバイスの間でバイト単位で双方向のデータ伝送が行われます。

I2Cプロトコルの規制

  1. データ バス (SDA) は、SCL が High のときに安定した状態を維持する必要があるため、データ バス (SDA) は Low のときにのみ変更できます。以下に示すように
    ここに画像の説明を挿入します

  2. クロックが High の場合、データバスの High から Low への遷移がバススタート信号となり、データバスの Low から High への遷移がバスストップ信号となります。
    ここに画像の説明を挿入します

  3. 応答、I2C マスターが 8 ビットのデータまたはコマンドを送信すると、データ バス (SDA) を解放、つまり入力状態に設定し、スレーブの応答を待ちます。 0 は応答を意味し、ハイパワー フラット 1 は応答がないことを示しますが、この時点のクロックは依然としてホストによって提供されます。
    ここに画像の説明を挿入します
    データ フレームのフォーマット。I2C 通信中、最初に「スタート信号」が送信され、続いて 7 ビット周期のアドレスが送信されます。8 番目のビットはデータ転送方向ビットで、0 は書き込みを表し、1 は読み取りを表し、以下はスレーブの応答を待ちます。転送全体が完了すると、ホストによって終了信号が生成されます。さらに、データを送信するときは、上位ビットが最初に送信されることに注意してください。

I2Cデバイスアドレス

各 I2C デバイスにはデバイス アドレスがあります。一部のデバイス アドレスは工場で設定され、ユーザーが変更することはできません (たとえば、OV7670 デバイス アドレスは 0x42 に固定されています)。特定の数のアドレスを持つものと、残りの少数のアドレスが決定されるものがあります。ハードウェア決定による (たとえば、一般的な I2C インターフェイス EEPROM メモリには 3 つのアドレス制御ピンがあり、これらはハードウェア設計中にユーザーによって決定されます)。
厳密に言うと、マスターはスレーブに直接アドレスを送信するのではなく、マスターがバスにアドレスを送信し、すべてのスレーブはマスターから送信されたアドレスを受信し、各スレーブはマスターから送信されたアドレスと自分のスレーブのアドレスを比較します。アドレスが一致すると、スレーブはバスに応答信号を送信します。マスターは応答信号を受信した後、バスへのデータ送信を開始し、スレーブとの通信が確立されます。ホストが応答信号を受信しない場合は、アドレス指定が失敗したことを示します。
I2C プロトコルがデータを送信する場合、ホストはまずスレーブ デバイスのアドレスと読み取りおよび書き込み制御を含む制御コマンドをバスに送信し、スレーブの応答を待ちます。制御コマンド送信のデータフォーマットは以下のとおりです
ここに画像の説明を挿入します
I2C送信時は上位から下位のビット順に送信されます 制御バイトの最下位ビットはリード/ライト制御ビットです 0の場合は、このビットが 1 の場合、マスターがスレーブに対して読み取り操作を実行することを意味します。

I2Cメモリアドレス

I2C プロトコルをサポートするすべてのデバイスには、常に読み書きできる内部レジスタまたはメモリがいくつかあります。たとえば、EEPROM メモリは、一連の連続してアドレス指定されるストレージ ユニットです。CMOS カメラ モデル OV7670 (OV7670 のインターフェイスは SCCB と呼ばれます)インターフェイスは本質的に特別な I2C プロトコルであり、I2C プロトコルと直接互換性があります) その内部には、読み書きできる一連のアドレス指定可能なレジスタがあります。したがって、デバイス内の記憶部(レジスタやメモリ、以下記憶部)を読み書きしたい場合には、記憶部のアドレスを指定できなければなりません。

I2C書き込みタイミング

ここに画像の説明を挿入します
シングルバイト アドレスからシングルバイト データを書き込むプロセス:
1. ホストは SDA を出力として設定します;
2. ホストはスタート信号を送信します;
3. ホストはデバイス アドレス バイト (最下位ビットは 0) を送信します、書き込み動作を示します;
4. ホストは SDA を設定します これはトライステート ゲート入力であり、スレーブの応答信号を読み取ります;
5. 応答信号の読み取りが成功すると、ホストは SDA を出力として設定し、1 バイトのアドレス データを送信します。
6. ホストは SDA をスリーステート ゲート入力として設定し、スレーブ応答信号を読み取ります;
7. 応答信号を正常に読み取った後、ホストは SDA を出力として設定し、書き込むデータを送信します;
8. ホストは SDA を設定しますスリーステート ゲート入力として、スレーブ応答信号を読み取ります。
9. 応答信号が正常に読み取られた場合、ホストは STOP ビットを生成し、送信を終了します。
ここに画像の説明を挿入します
連続書き込みタイミング:
連続書き込み (ページ書き込みとも呼ばれます。I2C 連続書き込みタイミングは一部のデバイスでのみサポートされていることに注意してください) は、ホストが複数バイトのデータをスレーブに連続的に書き込むことを意味します。これは、シングルバイト書き込み操作に似ています。書き込み動作は、1 バイト アドレス セグメント デバイスと 2 バイト アドレス セグメント デバイスの書き込み動作にも分割されます。
ここに画像の説明を挿入します

I2C読み出しタイミング

ここに画像の説明を挿入します
シングルバイト アドレスからシングルバイト データを読み取るプロセス:
1. ホストは SDA を出力として設定します;
2. ホストはスタート信号を開始します;
3. ホストはデバイス アドレス バイトを送信します (その最下位ビットは 0) 、書き込み動作を示します;
4. ホストは SDA をスリーステート ゲート入力として設定し、スレーブ応答信号を読み取ります;
5. 応答信号が正常に読み取られ、ホストは SDA を出力として設定し、1 バイトのアドレス データを送信します。
6. ホストは SDA をスリーステート ゲート入力として設定し、読み取ります。 スレーブは信号に応答します。
7. 応答信号は正常に読み取られ、ホストは開始信号を開始します。
8. ホストは、デバイス アドレス バイトを送信します。最下位ビットは 1 で、読み取り動作を示します
9. SDA をスリーステート ゲート入力として設定し、読み取ります スレーブ マシンは信号に応答します
10. 応答信号は正常に読み取られ、ホストは SDA を 3 ステート ゲート入力に設定します-state ゲート入力と SDA バス上の 1 バイトのデータの読み取り;
11. 無応答信号、つまりハイ レベルを生成します (バスは自動的にハイにプルされるため、出力をハイ レベルに設定する必要はありません)。
11. ホストは送信を終了するためのストップ ビットを生成します;
ここに画像の説明を挿入します
連続読み取りタイミング
. 連続読み取りとは、ホストがスレーブから複数バイトのデータを連続的に読み取ることを意味します. これはシングルバイト読み取り操作に似ています. 連続マルチバイト読み取り操作また、1 バイト アドレス セグメント デバイスと 2 バイト アドレス セグメント デバイスの読み取り操作にも分割されます。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_45614076/article/details/126472442