USIとTWIの説明に入る前に、まず、I2Cについて簡単に説明しておきます。なお、I2Cに関しては1、2、3線シリアル・インターフェースでも説明していますので、そちらも参照してください。
(1)I2Cとは
●概要
I2CとはInter-Integrated Circuitの略で、シリアル・クロック信号SCLとシリアル・データ信号SDAの2本の信号線で通信することから2線式シリアル通信とも呼ばれます。また、このインターフェースは同期用のクロックがあるため、同期式のシリアル通信ということになります。
基本的には、一つのI2Cマスタ・デバイスに対して一つまたは複数のI2Cスレーブ・デバイスが接続されるという機器構成です。複数のマスタが一つのI2Cバスに接続されるマルチ・マスタという接続形態もありますが、本連載では省略します。
スレーブはそれぞれ固有のスレーブ・アドレスをもっていて、個体が識別できるようになっています。マスタは通信に先立って、I2Cバスにコントロール・バイトを送信します。このコントロール・バイトにはスレーブ・アドレスとリードまたはライトを指示するフラグが含まれています。このコントロール・バイトにより、マスタは複数の中から特定のスレーブを選択し、そのスレーブに対してのみデータを送受信します。通信の主導権はマスタがもっていて、マスタが出力するSCLに同期してスレーブはデータを送受信します。
一つの通信シーケンスはマスタがスタート・コンディションを発行することにより始まり、コントロール・バイトの送信、データ・バイトの送受信のあと、マスタがストップ・コンディションを発行して終わります。
●スタート・コンディション
マスタが通信シーケンスの始まりをスレーブに知らせるために発生させる状態で、SCLが"H"レベルのときにSDAを"H"レベルから"L"レベルに変化させることで発行することができます。この後コントロール・バイトでスレーブを選択した後は、ストップ・コンディションを発行するまで、選択されたスレーブとだけ通信することになります。
●コントロール・バイト
コントロール・バイトはマスタが送信するデータ・バイトの一種で、スタート・コンディションの直後に送られる8ビットのデータです(7ビット・アドレス・モードの場合)。それ以降に送受信されるものはデータ・バイトとみなされます。このコントロール・バイトの上位7ビットには通信対象のスレーブ・アドレスが収納されていて、最下位ビットにはリード、ライトを示すR/Wフラグが格納されています。なお、コントロール・バイトを送信(出力)するのは、マスタに限られ、R/Wフラグのリード、ライトの意味はマスタ側から見たものになります。

●ACKビット
ACKビットは8ビットのデータ・ビットの後に送受信される9ビット目の1ビット・データで、SDAが"L"レベルのときがACK、"H"レベルのときがNOACKという意味になります。ACKを出力(SDA信号を"L"レベルにドライブ)するのは、マスタ、スレーブに限らず、データを受信した側です。通常は正常応答という意味で、データを受信した側がACK(SDA="L")を送信しますが、最終データという意味でNOACK(SDA="H")を送信する場合もあります。
●ストップ・コンディション
マスタが通信シーケンスの終わりをスレーブに知らせるために発生させる状態で、SCLが"H"レベルのときにSDAを"L"レベルから"H"レベルに変化させることにより発行することができます。これ以降、スレーブはマスタから解放され、I2Cバスはアイドル状態に戻ります。
(2)AVRのI2C用インターフェース・モジュール
AVRにはデバイスによって、USIまたはTWIのハードウェア・モジュールを内蔵しているものがあります。ATtiny2313などにはUSI(ユニバーサル・シリアル・インターフェース)、ATmega168などにはTWI(ツー・ワイヤ・シリアル・インターフェース)が内蔵されています。次に、それぞれのモジュールの特徴などについて簡単に説明します。
●USI(Universal Serial Interface)
USIはI2Cのほか、SPIや半二重式の非同期シリアル通信の制御などにも流用できますが、ここではI2Cに限って説明します。
USIモジュールはI2C制御用のモジュールというよりは、シフトレジスタを拡張したものと考えるのがよいでしょう。I2Cの通信手順を実現するためのハードウェア・ロジックを内蔵しているわけではなく、大部分をソフトウェアで制御する必要があるため、後に述べるTWIモジュールよりも制御ソフトウェアは複雑になります。ただし、ソフトウェアでは意外と面倒で時間がかかるビット単位の入出力の処理が、シフトレジスタと4ビット・カウンタを利用することで効率よく処理できます。
USIのハードウェアは、大きく分けると次のようなものになります。
- SCL、SDAポートのオープン・ドレイン出力
- 8ビットのシリアル-パラレル相互変換用のシフトレジスタ
- SCLのクロック・エッジをカウントする4ビットのカウンタ
- スタート・コンディションの検出回路
SCL、SDA両ポートのAVR内臓プルアップ抵抗は、USI使用時は無効になるため、外部に必ずプルアップ抵抗器を取り付ける必要があります。
その他詳細はUSIのプログラムの説明のときに説明します。
●TWI(Two-wire Serial Interface)
USIと違い、TWIはI2C専用のハードウェア・モジュールです。ハードウェア・ロジックにより通信処理は半自動的に実行されます。そのため、制御ソフトウェアは比較的単純で、指示を出したら、後は処理が完了するのを待つというようなプログラムになります。
マスタ時はスタート・コンディション、ストップ・コンディションを発行する機能や、自動的にSCL(シリアル・クロック)を出力しながらバイト・データやACKビットを1ビットずつ入出力する機能もあります。
スレーブ動作時はスレーブ・アドレスを比較する機能があり、マスタから送られてきたスレーブ・アドレスと自分のアドレスを自動的に比較して、アドレスが一致しているときだけ通信処理を継続させます。この機能はハードウェアで自立的に実行されるため、自分宛てでない通信に関しては制御ソフトウェアではまったく関知する必要はありません。
データ送受信の際は、マスタから送信されるSCLクロックにあわせて自動的にバイト・データやACKビットを入出力します。
SCL、SDA両入力ポートにはひげ(ハザード)を除去するためのフィルタ回路が内蔵されていて、ノイズ耐性を向上させています。また、同ポートは、AVRデバイス内蔵の入力ポート用プルアップ抵抗も利用できますが、通常はバス負荷に応じて外部にプルアップ抵抗器を取り付けます。
今回はUSIとTWIの概要について説明しましたが、次回からは具体的な処理の内容やプログラムなどについて説明していく予定です。次回から何回かに分けてTWI使用のI2Cマスタ制御プログラムについて説明します。

