I2C の知識について話す

組み込み開発者にとって、I2C はもはやなじみのないものです。電子製品の分野では、広く使用されています。

序章

I2C 通信プロトコル (Inter-Integrated Circuit) は Philps によって開発されました. ピン数が少なく、ハードウェアの実装が簡単で、スケーラビリティが高いため、USART や CAN などの外部トランシーバ デバイスを必要としません. 現在、相互通信で広く使用されていますシステム内の複数の集積回路 (IC)。

I2C は主に SCL と SDA に分けられます。SCL はシリアル クロック ライン、SDA はシリアル データ ラインです。データの送信に使用されるため、そのレートに関する知識は不可欠です。

I2C速度

I2C レートは、標準、高速、高速の 3 つのモードに分けられ、3 つのレートは次のとおりです
標準レート: 100Kbits/s
高速レート: 400Kbits/s
高速モード 拡張: 1Mbit/s
高レート: 3.4Mbit/s

速度の話の後、I2C について話します.エディターは、プロジェクトでテストされた I2C のグループを紹介します.

I2C タイミング

ここに画像の説明を挿入

開始と終了

I2c のタイミングは開始と停止に分割され、これらはすべてマスターによって制御されます。
開始: SCL が高く、SDA が 1 から 0 に変化します。
終了: SCL が高く、SDA が 0 から 1 に変化します。
ここに画像の説明を挿入
反復開始条件: 開始条件と同様に、反復開始条件は停止条件の前に送信されます。マスターがスレーブにメッセージを送信し続けたい場合、バイト送信が完了した後、停止条件の代わりに繰り返し開始条件を送信できます。
ここに画像の説明を挿入

データのビット転送

データの送信はバイト(8 ビット)単位で行われ、1 バイトの送信には 9 クロックサイクルが必要です。

マスタ デバイスは、SCL ラインで生成された各クロック パルスの間に SDA ラインでデータ ビットを送信し、データ ビットは上位ビットから下位ビットの順に送信されます。SCL がハイレベルのときは SDA のデータが安定している必要があり、SCL がローレベルのときはデータのハイレベルとローレベルが反転します。


下の図から、SCL が Low のときに SDA のレベル変換が常に行われることがわかります。
SCL が High の場合、SDA レベルは変化しません。
ここに画像の説明を挿入
I2C では、多くの場合、最初の 8 ビットがマスターによって送信されます。このうち、最初の 7 ビットがアドレスビットです。8 番目のビットは、読み取りおよび書き込みビットです。

I2C アドレス ビットには、7 ビットと 10 ビットの 2 種類があります。7 ビットアドレスの場合、最大 127 個のデバイスのアドレス指定をサポートします (実際の状況では、負荷容量を考慮する必要があり、合計容量が 400PF を超えることはできません)。10 ビット アドレスの場合、最大 1023 デバイスがサポートされます。
ここに画像の説明を挿入
10 ビット アドレス プロトコルは、7 ビット アドレス プロトコルと互換性があります。現在使用されているアドレスのほとんどは 7 ビットで、8 ビット目は読み取りおよび書き込みビットです。8 ビット目が 0 の場合は書き込みを意味します。1 の場合は、読み取りを意味します。

一部のチップのデータシートでは、次のような
I2C スレーブ アドレスのような記述をよく見かけます。(W)OX58H、®OX59H
W は書き込み、R は読み取りを表します。
上の図は 0X58 を表しています。16 進数から 2 進数に変換します。
0X58=0101 1000
ここに画像の説明を挿入
最初の 8 桁が完全に一致していることに注意してください。

ACKとNACK

I2Cの最大の特徴は完全応答機構の存在で、スレーブがマスターからのデータを受信すると、マスターに「受信しました」と応答信号を返信します。

最初の 8 つのアドレス + 読み取り/書き込みはマスターによって送信されます。9 番目のクロック サイクルで、マスターはバスを解放し、バスの制御をスレーブに渡します.ただし、プルアップ ソースの動作の下で、この時点でバスはハイ レベルにあります.スレーブが受信した場合マスターによって送信されたデータが 0 である場合、SDA をローに引き下げて応答を示します。

簡単な説明は次のとおりです。
スレーブは動作します。ACK です。9 番目のビット レベルはロー レベルです。
スレーブは動作しません。NACK です。9 番目のビット レベルはハイ レベルです。

マスターは、スレーブが必要なスレーブであることを確認すると、8 ビット データ バイトの送信を開始します。ここで、8 ビット データの各送信の後に、ホストによって生成された応答信号が続きます。送信が最終的に終了状態になるまで、I2C はデータ送信を停止し、アイドル状態になります。

読み取りと書き込みに従って、I2C の送信を次の 2 つの状態に大まかに分けることができます。

I2C 書き込み処理

  1. マスターは I2C 7 ビット アドレスと書き込み操作ビットを送信し、ACK を待ちます。
  2. スレーブは ACK を送信します。
  3. マスタがレジスタ アドレス ビットを送信し、ACK を待機
  4. スレーブが ACK を送信
  5. マスターがデータを送信します。すなわち、レジスタデータの書き込み
  6. スレーブが ACK を送信
  7. 複数のレジスタデータを書き込むには、手順 5 と 6 を繰り返します。
  8. マスターが STOP を開始
    ここに画像の説明を挿入

I2C 読み取りプロセス

  1. マスターは I2C 7 ビット アドレスと書き込み操作ビットを送信し、ACK を待ちます。
  2. スレーブは ACK を送信します。
  3. マスタがレジスタ アドレス ビットを送信し、ACK を待機
  4. スレーブが ACK を送信
  5. マスターがスタートコンディションを再実行
  6. マスターは I2C 7 ビット アドレスと読み取り操作ビットを送信し、ACK を待ちます。
  7. スレーブが ACK を送信
  8. スレーブは、レジスタ内の値である 8 ビット データを送信します。
  9. マスターは ACK を送信し、手順 8 と 9 を繰り返します。マスターが最終的に NACK を送信して終了に入るまで、
    複数のレジスタを読み取ることができます。プロジェクトでキャプチャされた波形は次のように添付されます

    ここに画像の説明を挿入
    ここに画像の説明を挿入

    ここに画像の説明を挿入

ハードウェア回路設計

I2C のハードウェア回路設計は複雑ではありません。

I2C の IO ポートはオープンドレインのためハイレベル出力に対応しておらず、ハイレベルにするためには外部プルアップソースを設ける必要があります。

プルアップ抵抗の選択は、多くの場合 1K ~ 10K です。抵抗の選択は、多くの場合、信号の立ち上がりエッジに一定の影響を与えます。

通常、IO ポートの駆動電流は 2 ~ 4 mA です。プルアップ ソースは Vdd です。同時に、OC と OD のターンオン電圧は多くの場合、約 0.4V です。


したがって、 Rmin=(Vdd-0.4)/0.003A
Rmax=(T/0.874)*Cと計算できます
。ここで、I2C レートが 100Kbits/s の場合、T=1us です。レートが 400Kbits/s の場合、T=0.3us です。レートが 1Mbits/s の場合、T=0.12us です。
(注: 一部の回路では、MCU にプルアップが組み込まれています。最終的には、周辺回路にプルアップ ソースが必要ないことがわかります)

波形に関するよくある質問

Xiaobian の以前のプロジェクトにおける I2C の一般的な問題のいくつかのタイプについて

  1. SCL の立ち上がり時間 tr は
    データシート規格よりも大きく、立ち上がり時間が大きいということは、規格に比べて立ち上がりが比較的緩やかで駆動力が弱いことを意味します。この種の問題は、プルアップ抵抗の抵抗値の不当な選択によって引き起こされることがよくあります。負荷自体には容量があり、プルアップ抵抗が大きすぎるとRC遅延回路により立ち上がりが緩やかになります。
    解決策: プルアップ抵抗を減らし、ソフトウェアで駆動能力を調整します。

  2. SDAのSCL波形が全体的に少し持ち上がっており、ローレベルが0Vに近づきにくく、0.4Vを超えることすらありません.2
    つの可能性があります.
    A: テスト中、オシロスコープのプローブが校正されていなかったため、テスト中にこのような問題が発生しました。
    B: プルアップ抵抗の選択が小さすぎて、駆動電流が大きすぎます。
    解決策: オシロスコープを校正し、プルアップ抵抗の抵抗を適切に減らします。

  3. SDA 信号のグリッチ。
    編集者は以前のプロジェクトでそれに遭遇しました。このような問題には注意が必要です。I2Cのハイレベルとローレベルにはそれぞれ特別な意味があり、アドレスビットやライトビット、レスポンスビットのローレベルがグリッチなどでハイレベルと誤認識されると、スレーブの正常な動作に影響を与えます。

解決策: PCB トレースがグランドを覆い、SDA 信号の直列の小さな抵抗器。

  1. I2C アドレスの競合
    ハードウェア設計では、I2C のグループにデバイスの複数のグループを掛けることがよくあります。注意を怠ると、I2C の同じグループに同じアドレスを持つ 2 つのデバイスがぶら下がってしまうことがあります。

解決策: 一部のチップには AD ピン (スマート PA チップなど) があり、AD 接地または電源に応じてアドレスを変更できます。または、ボードに戻った後、手動で手直しします。

おすすめ

転載: blog.csdn.net/weixin_43772512/article/details/125965321