|
HOME >>(連載)シリアル・インターフェース >>1、2、3線シリアル・インターフェース (連載 第2回)
1、2、3線シリアル・インターフェース (連載 第2回)
I2C(Inter-Integrated Circuit)
今回はI2Cインターフェースについて、もう少し詳しく説明します。なお、I2Cにはアドレス・モードに10ビットと7ビットの2種類がありますが、ここでは7ビット・モードの場合に限定しています。また、I2Cでは複数のマスタがスレーブを共有したり、マスタがスレーブに切り替わるような接続形態(マルチ・マスタ)もありますが、そちらについては省略します。
I2Cに限らず、複数のスレーブ・デバイスがバス上に接続されている場合は、マスタには通信対象のスレーブを選択する機能が必要です。I2Cインターフェースでは、スレーブ・デバイスはそれぞれ固有のスレーブ・アドレスをもっています。
マスタはそのアドレスをバス上に送信して、通信対象のスレーブに通信の開始を知らせます。いったんスレーブが特定された後は、そのスレーブとだけデータを送受信します。送受信が終了するとマスタは通信の終了をスレーブへ通知します。
このような一連のシーケンス(手順)がI2C通信の基本です。次に、通信のシーケンスを動作ごとに順に説明します。
(1)通信の開始:スタート・コンディション
マスタは、通信を始める際に、スレーブに対して通信シーケンスの始まりを示すために、スタート・コンディションを発行します。これはシリアル・クロックSCLが“H”レベルのときにシリアル・データSDAを“H”レベルから"L"レベルに変化させることで成立します。スタート・コンディションはすべてのスレーブへ一斉に通知されます。
(2)スレーブの選択:コントロール・バイトのマスタ送信
次に、マスタは全スレーブへコントロール・バイト(以下CB)を送信します。
すべてのスレーブはスタート・コンディションを受信したあと、マスタが送信したCBを受信します。このCBには、通信対象のスレーブ・アドレスと送受信の向きを示すR/Wフラグが含まれています。
各スレーブはCBを受信すると、CB内のアドレスと自分のアドレスか一致しているかどうかを調べ、一致している場合はデータの送受信の処理に備えます。アドレスが不一致のときはアイドル状態へ戻り、再びスタート・コンディションが発行されるまで待機します。
(3)本文の通信:データの送受信
選択されたスレーブはCB内のR/Wフラグの値に応じてデータを送信または受信します。
(4)通信の終了:ストップ・コンディション通信が終わると、マスタはストップ・コンディションを発行して通信シーケンスの終わりをスレーブに知らせます。これはSCLが“H”レベルのときに、スタート・コンディションのときとは逆にSDAを“L”レベルから“H”レベルに変化させることで成立します。このあとスレーブは待機状態へ戻ります。

●コントロール・バイト(CB)、データの送受信とACK
受信側では、受信データはマスタが出力する8回のクロック(SCL)に合わせて1ビットずつ入力されます。9回目のクロックで、受信側はACK(SDA=“L”)またはNOACK(SDA=“H”)を送信元へ返します。
送信側では、送信データはマスタが出力する8回のクロック(SCL)に合わせて1ビットずつ出力されます。9回目のクロックで送信側は、受信側が出力するACKまたはNOACKを読み取ります。
このように、データ・ビットはSCLに同期した形でバス上に出力されます。これが同期式と言われる所以です。マスタは自分でクロックを出力しながら、データを送受信しています。それに対してスレーブは、マスタが出力するクロックに合わせてデータを送受信します。
ACK/NOACKはマスタ、スレーブの違いにかかわらず、受信した側が出力します。このACKビットの意味ですが、通常は通信が正常に完了したという意味で、送信元へACK(SDA=“L”)を返します。しかし、特定の意味をもたせてNOACK(SCL=“H”)を返す場合もありあす。たとえば、マスタが最終データを受信した後に、スレーブへ通信の終了を知らせるためにNOACKを返します。
●クロック・ストレッチ
スレーブは、マスタからデータを受信した後(またはマスタへデータを送信した後)に、内部処理に時間がかかるなどの理由で、マスタに対してWAITをかけることができます。その手段としてスレーブがクロック信号SCLを“L”レベルにします。この結果マスタはクロックが出せなくなるので通信を一時停止します。スレーブは準備が整うとSCLの“L”レベル出力を解除します。これを受けてマスタは通信を再開します。
このように、マスタを待たせるためにスレーブがSCLを強制的に“L”レベルにすることをクロック・ストレッチといいます。
●リピート・スタート・コンディション
通常、スタート・コンディションとストップ・コンディションの区間内での通信の向き(送/受)は、CBをのぞいて、CB内のR/Wフラグの値に応じた方向に固定されていますが、この区間の中で通信の方向を切り替えたい場合があります。たとえば、スレーブ・デバイスがEEPROMで、特定のROMアドレスからROMデータを読み出したい場合、アクセス対象のROMアドレスの設定はスレーブに対してW(書き込み)要求ですが、ROMデータの読み出しにはスレーブに対してR(読み出し)の要求を出さなければなりません。
このようなときは、ROMアドレスをスレーブへ送信(W)したあとに、通信の向きを読み出し(R)に切り替えるために、スタート・コンディションを再発行し、R要求のCBを送信します。このときに発行するスタート・コンディションをリピート・スタート・コンディションといいます。

●ジェネラル・コール・アドレス
スレーブ・アドレスの'0’は特別のアドレスとして定義されています。これはジェネラル・コール・アドレスといわれ、バス上のすべてのスレーブ・デバイスへ一斉にデータを送信するための特殊なアドレスです。ただし、スレーブ側ではこのアドレス・モードをサポートしている必要があります。当然ながら、データがぶつかるので、ジェネラル・コールでスレーブからデータを一斉に受信することはできません。
実際に送受信されるデータの内容は、スレーブ・デバイスによって決められているため、ここで説明した基本形のフォーマットとは異なる場合がほとんどだと思いますが、基本形を理解しておけばフォーマットが違っても理解できるでしょう。
次回はSPI通信について説明する予定です。
タグ:
I2C
投稿者: yoshida 日時: 2007年04月12日 16:46 | パーマリンク |TOPページへ ▲画面上へ
トラックバック
このエントリーのトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/205
|