I2Cバスは複数の機器をシリアル・クロックとシリアル・データの2本の信号で結んでデータのやり取りを行います。
転送速度としては
| ・標準モード | : 〜100Kbit/s |
| ・ファースト・モード | : 〜400Kbit/s |
| ・高速モード | : 〜3.4Mbit/s |
の3つがあり、速いモードの機器は遅いモードのバスに接続しても使える必要があります。
なお、高速モード・バスは標準モードやファースト・モードのバスとはブリッジを用いて分離する必要があります。
また、通信はシリアル・クロックに同期して行われますが、シリアル・クロックを出力し、
通信相手を指定して通信を制御する機器 (これをマスタと呼ぶ)
は1つのバスに複数存在することが許されています (マルチ・マスタ)。
このため、データのやり取りだけではなく、
アドレスの指定やバス・アービトレーション等プロトコルも含んで規定されています。
(1) 接続機器
I2Cバスに接続される機器には
| ・マスタ専用 | : マイコンは通常マスタとしての使い方が主です。 |
| ・スレーブ専用 | : EEPROMや A/D、D/A等があります。 |
| ・マスタ/スレーブ共用 | : マルチ・マスタ・システムで両方の機能を持たせる場合です。 |
があります。
通常マイコンで使用することが多いのはマスタ専用の機能で、この機能を使ってEEPROMと接続します。
アプリケーションによってはスレーブとして使用することもあります。
(2) インタフェース信号
インタフェース信号は複数の機器の出力を接続するためにオープン・ドレーン出力でドライブするようになっており、
ロウ・レベルは機器が出力しハイ・レベルはプルアップ抵抗で供給されます。
なお、高速モードに関しては立ち上がりの高速化のために機器の中で電流ソース・プルアップが内蔵されています。
以降、特に断らない限りは標準バス/ファースト・バスで話を進めて行きます。
バス信号の電圧レベルとしては2つが規定されています。
最近のマイコンの動作電源電圧は変更できますので、I2Cバスのプルアップ抵抗は VDDに接続し、
ハイ・レベル入力電圧は 0.7VDD(MIN)となります。
古いデバイスや電源電圧が固定されているデバイスを接続する場合には 5V±5% に接続し、
ハイ・レベル入力電圧は 3V(MIN)となります。
(a) シリアル・クロック(SCL)
通信は
SCLで同期を取りながら行います。
通常、
SCLはマスタが出力し、送信する機器は
SCLがロウの期間にシリアル・データを変更し、
SCLがハイの期間では保持することで通信を行います。
しかし、スレーブが通信準備できていないとき等に
SCLをロウにすることで待ち合わせを行い、
データの同期をとることができます。
(b) シリアル・データ(SDA)
SCLに同期してデータの転送に使用されます。
マスタとスレーブのどちらからも送信することがあります。
また、通信データに対してのアクノリッジ信号も
SDAを通じて送信されますので、
8ビットのデータとそれに対するアクノリッジでは転送方向が逆になります。
なお、通常の通信では必ず、
SCLがロウのときに
SDAは変化します。
SCLがハイの状態で
SDAが変化すると、
スタート・コンディションやストップ・コンディションのような制御信号となります。
(3)基本的な通信方法
[スタート・コンディション]
マスタが通信をスタートする時には最初にバスの使用権を獲得する必要があります。
このために、スタート・コンディションを発行します。
これは
SCLがハイの状態で
SDAをロウに落とすことで実現します。
このときに既に
SDAまたは
SCLがロウになっていると、これは他のマスタが既にバスを使っている状態ですので、
新たに通信を開始することができず、通信予約状態にします。
また、バスを使えなかったマスタがスレーブとしての機能をもっている場合にはスレーブとしての通信待ちにします。
ただし、同時に 2つ以上のマスタがスタート・コンディションを発行した場合にはこの段階ではどちらが優先かは区別できません。
なお、スタート・コンディションは通信の最初にバスを確保するために使用する以外に、
バスを確保したままでスレーブとの間のデータ送受信の方向を切り替えたりするためにも使用します。
この場合に使用するスタート・コンディションをリスタート・コンディションと呼びます。
具体的な例は後述の
[リスタート・コンディション] を参照してください。
[アドレスとアービトレーション]
スタート・コンディションに続いて、
スレーブを指定するために 7ビットのアドレスと転送方向を示す 1ビットの合計 8ビットを送信します。
同時に 2つ以上のマスタがスタート・コンディションを発行した場合には、各々がスレーブのアドレスを送信することになります。
I2Cバスとしてはロウが強いので、スレーブのアドレスの小さい方への通信 (
SDAをロウに保持していた方) が優先となります。
このようにして、バス使用権の調停が行われます。
アドレス及び転送方向の送信に対して、
SCLの 9クロック目で選択されたスレーブからアクノリッジ (ロウ) が戻されます
(このときに
SCLをロウに引くことで、ウエイトがっかりますが、ウエイトについては別途説明します)。
指定したスレーブが存在しなければバスをロウに引くものが存在しないので、
アクノリッジは戻らないことになります。
アクノリッジが戻らなかったら通信はそこで終わりとなり、
マスタはストップ・コンディションを発行してバスの使用を中止します。
[データ転送]
スレーブとの通信が確立したら、データの転送に移ります。
このとき、スレーブは
SCLをロウに引いてウエイトをかけた状態で、
アドレスの 8ビット目で指定された転送方向での通信準備を行い、
準備が完了したら
SCLをロウに引くのを止めます。
これにより、
SCLはマスタが制御できるようになり、マスタからの
SCLでデータ転送を行えるようになります。
以下のタイミングも参照してください。
[アクノリッジ]
データ転送は 8ビット単位で行われ、データの後にデータを受信したほうはアクノリッジを戻します。
マスタからスレーブにデータを送信する場合には、スレーブはデータを受け取ると必ずアクノリッジを戻します。
データを受け取れなかったときにはアクノリッジを戻さないことで、マスタに知らせます。
マスタが受信する場合には受信した最後のデータに対してはアクノリッジを戻さないことで、
スレーブに対して通信の終了を知らせます。
スレーブはアクノリッジがないことで通信の終了と判断し、以降の送信を中止し
SDAをハイにします。
このような処理を行わないと、スレーブが次のデータの送信を開始し、
SDAをロウに引っ張ってしまうと、
マスタがストップ・コンディションを発行できなくなってしまうことになります。
[ウエイト]
スレーブ(及びマスタ)は
SCLをロウに引くことで通信を停止 (ウエイト) させることができます。
通常、ウエイトは 8クロック目の後 (つまりデータの転送が終了してアクノリッジを戻す前) か
9クロック目の後 (アクノリッジの後で、次の転送の前) にかけます。
受信側でデータに対してアクノリッジを戻すかどうかを判断する場合には 8クロック目でウエイトをかけます。
送信側はアクノリッジの後つまり 9クロック目でウエイトをかけることになります
(これでアクノリッジを確認してその後の動作を決められます)。
[リスタート・コンディション]
EEPROMのようにデバイスのアドレス以外に内部にアドレス情報をもったデバイスの場合には
I2Cバスのアドレスではデバイスそのものを選択することしかできません。
デバイスの中のどのアドレスのメモリかを指定するためのアドレス情報はデータとして送る必要があります。
書き込みの場合には下記の例のようにメモリ・アドレスに引き続いて書き込みデータを送信すればいいのですが、
読出しでは途中でデータの転送方向を切り替える必要があります。

以下に読み出しの例を示します。
最初のスタート・コンディションでバスの使用を開始し、
デバイスのアドレスを指定します (このときはマスタからの送信を指定します)。
その後、デバイス内のアドレスをデータとして送信します。
このままでは読み出せませんので、再度スタート・コンディションを発行します。
この ST2と書いたところがリスタート・コンディションとなります。
その後、再度アドレスでデバイスを指定しますが、今度はスレーブの送信を指定します。
その後のデータはスレーブがマスタに送信するので、読み出しができるようになります。

[ストップ・コンディション]
データ転送が終了するとバスを開放します。
このために使用するのが、ストップ・コンディションです。
マスタは SCLがロウの状態で、SDAをロウにし、SCLをハイにします。
その状態で、SDAをハイに立ち上げるとストップ・コンディションとなります。
EEPROMへの書き込みではデバイス内の実際の書き込み動作はストップ・コンディションを検出してから行います。