1.はじめに
I2C(Inter-integrated Circuit)バスはデバイス間の近距離通信をサポートし、情報交換を完了するには2本の信号線が必要です(1本のSDA、シリアルデータ線、1本のSCL、シリアルクロック線)。I2Cは、1982年にフィリップスによって最初に開発および設計され、独自のチップで使用されました。当初、100kHz、7ビットの標準アドレスのみが許可されていました。1992年、I2Cの最初の公開仕様が発行され、400kHz高速モードと10ビット拡張アドレスが追加されました。I2Cに基づいて、Intelは1995年に低速デバイス通信用に「システム管理バス」(SMBus)を提案しました。SMBus はクロック周波数を10kHz 100kHzに制限しますが、I2Cは0kHz 5MHzデバイスをサポートできます:通常モード(100kHzは100kbpsです) )、高速モード(400kHz)、高速モード+(1MHz)、高速モード。
2、I2c合意
1.開始条件
送信の正式な開始を示すために、マスターデバイスはSCLをハイに設定し(バスがアイドルのとき、SDAとSCLはハイ状態)、SDAをローにして、すべてのスレーブデバイスが送信が開始されようとしていることを認識します。両方のマスターデバイスが同時にバスの所有権を取得したい場合は、SDAをLowにした方がバスの制御権を獲得します。通信期間全体で、新しい各通信シーケンスを開始するために複数の開始がある場合があります。
2.アドレスフレーム
メッセージが送信されるスレーブを示すためにマスターによって使用されます。
アドレスフレームは常に通信の最初に表示されます。最上位ビット(MSB)から7ビットのアドレスが送信されます。このアドレスの後には1ビットの演算子が続き、1は読み取り操作、0は書き込み操作です。
次のビットはNACK / ACKです。このフレームの最初の8ビットが送信された後、受信デバイスはSDA制御を取得します。このとき、受信デバイスは、9番目のクロックパルスの前にACK(SDAをローにプル)する必要があります。受信が正常であることを示します。受信デバイスがSDAをLowにプルしない場合、受信デバイスがデータを受信していない(アドレス指定されたデバイスが存在しない、デバイスがビジーであるなど)か、受信したメッセージを解析できません。そうである場合、マスターは何をすべきかを決定します(停止または繰り返し開始条件)。
3.データフレーム
マスターからスレーブ(またはスレーブからマスター)に送信されるデータ、各フレームは8ビットデータです。
アドレスフレームが送信された後、データ送信を開始できます。マスターは引き続きクロックパルスを生成し、データはマスター(書き込み操作)またはスレーブ(読み取り操作)によってSDAに配置されます。各データフレームは8ビットで、ストップコンディションが生成されるまで、データフレームの数は任意です。データ送信の各フレームの後(つまり、8ビットごと)に、レシーバーはACKまたはNACKで応答する必要があります(スレーブはデータの書き込み時にACKを送信し、マスターはデータの読み取り時にACKを送信します。マスターがデータの最後のバイトの読み取りを完了したことがわかった場合時間、NACKを送信してから条件を停止できます)。
4.停止条件
すべてのデータが送信されると、マスターは停止条件を生成します。ストップ条件は次のように定義されます。SDAがローにされると、SCLがハイに引き上げられてハイに保持され、その後SDAがハイに引き上げられます。
注:通常のデータ送信中、SCLが高レベルの場合、予期しない停止状態を防ぐためにSDAの値を変更しないでください。
5.繰り返し開始条件
SCLがローのときにSDAがハイになり、次にSCLがハイになります。次に、マスターは開始条件を生成して、新しいメッセージの送信を続行できます。
6.クロックストレッチ、クロック同期、バス調停
3、I2C読み取りおよび書き込みプロセス
1.レジスターを書き込むための標準プロセス
- マスターがSTARTを開始
- マスターはI2Cアドレス(7ビット)と操作0(1ビット)を送信し、ACKを待機しています
- スレーブがACKを送信
- マスターはreg addr(8ビット)を送信し、ACKを待機しています
- スレーブがACKを送信
- マスターはデータ(8ビット)を送信します。つまり、データはレジスタに書き込まれ、ACKを待機します。
- スレーブがACKを送信
- 手順6と7は複数回繰り返すことができます。つまり、複数のレジスタに順番に書き込みます
- マスターがSTOPを開始
2.レジスターを読み取るための標準プロセス
- マスターはI2Cアドレス(7ビット)と操作1(1ビット)を送信し、ACKを待機しています
- スレーブがACKを送信
- マスターはreg addr(8ビット)を送信し、ACKを待機しています
- スレーブがACKを送信
- マスターがSTARTを開始
- マスターがI2Cアドレス(7ビット)とr操作1(1ビット)を送信し、ACKを待機
- スレーブがACKを送信
- スレーブはデータ(8ビット)、レジスタの値を送信します
- マスターがACKを送信
- ステップ8と9は複数回繰り返すことができます。つまり、複数のレジスタを順番に読み取ります