I2Cとは

I2Cってなに?

I2C(Inter-Integrated Circuit)はフィリップス社(現NXP社)が提唱する通信インターフェースで,
クロックに同期させてデータの通信を行う同期式シリアル通信のひとつです。
I2CはSPIと並んで,E2PROMやセンサとのデータ通信によく使われています。
I2Cでは,クロック(SCL),データ入出力(SDA)の2本の信号線を用いて通信します。また,
それぞれの信号線にはプルアップ抵抗を接続します。
そして,通信をする場合には,マスタとスレーブというように役割を分け,マスタ側から
スレーブ側に対して送信や受信の指示をします。また,クロックは必ずマスタから出力され,
入力と出力はクロックに同期して行われます。
マスタ1つに対しスレーブは複数接続できます。
マスタとスレーブの接続は以下のようなイメージになります。」

通信手順

I2Cの場合,以下のような手順で通信を行います。
①マスタから通信開始の合図(スタートコンディション)を出す
②マスタからスレーブアドレスを送信する
③スレーブからマスタに受信完了の合図(アクノリッジ)を返す
④データの通信を行う(必要に応じて繰り返す)
⑤マスタから通信終了の合図(ストップコンディションを出す)
図で示すと、以下のようなイメージです。

もう少し踏み込んで,SDAとSCLの波形を見てみましょう。
スレーブアドレス0xA0,マスタからスレーブへ1バイトのデータ(0x5A)を送信する例を示します。

スレーブアドレスやデータはMSBファースト(最上位ビットから下位ビットの方向)でSCL(クロック)に同期して転送されているのが確認できます。
また,スレーブアドレスを転送した後,および8ビットのデータ転送ごとにアクノリッジ(=0)が受信側から出力されます。
特徴的なのは,スタートコンディションとストップコンディションの波形です。
SCLがHレベルのときにSDAの立ち下がりでスタートコンディション,SCLがHレベルのときにSDAの立ち上がりでストップコンディションとなります。
この信号で,通信の開始と終了をスレーブ側に知らせています。

スレーブアドレスの役割

先に述べたように,マスタ1つに対しスレーブは複数接続できるため,マスタはどのスレーブと通信するかをスレーブ側の
デバイスに知らせる必要があります。スレーブアドレスはこの役割を持っていて,スレーブ側のデバイスはそれぞれ固有の値を持っています。
通信開始の合図(スタートコンディション)を出した後、マスタは通信したいスレーブ側デバイスのスレーブアドレスを送信し,
スレーブ(複数)が受信します。このうち,アドレスが一致したスレーブがスタンバイ状態となり,マスタとの送受信が可能になります。
なお,スレーブアドレスが一致しなかったスレーブ側のデバイスは待機状態へ移行します。

以下の図は,マスタからスレーブへ1バイトのデータを送信する場合の,通信の様子を示したものです。
スレーブアドレス通信時に最下位ビットにW(=0)を指定すると,マスタはスレーブへデータを送信します。

以下の図は,スレーブから1バイトのデータをマスタが受信する場合の,通信の様子を示したものです。
スレーブアドレス通信時に最下位ビットにR(=1)を指定すると,マスタはスレーブからデータを受信します。

I2Cの概要は以上となります。I2Cの詳細については、NXP社へのホームページに公開されている
『I2Cバス仕様およびユーザーマニュアル』を参照してください。