I2Cとは
I2C(Inter-Integrated Circuit)は、Philips Semiconductors(現NXP Semiconductors)社の開発したシリアル通信規格です。アイ・スクエアド・シーというのが正規の読み方ですが、一般的にはアイ・ツー・シーと呼ばれることが多いと思います。呼びやすいので。またそれに合わせて、I2Cと表記されることもあります。
I2CはUARTとは違い、基板上のチップ間という極短距離の通信に用いられるのが一般的です。I2Cバスの最大の特徴は、完全な2線式であることです。よく比較対象としてあげられるSPIと違い、バス上に接続する機器の数によりません。SCL(シリアルクロックライン)とSDA(シリアルデータライン)の2線のみで、複数の機器間での通信を可能とします。その接続例は下図のようになります。
IT業界では古くから、「master / slave」や「whitelist / blacklist」などの用語を使用してきました。これらは差別的であるとして、中立的な用語を使用する活動が広まっています。これを受けてI2Cでは、2021年の仕様書改訂で「controller / target」に用語を変更しています。
本ページではマスターを「コントローラー」、スレーブを「ターゲット」と表記します。
I2Cバスの特徴
- 2線式のため配線数が少なく、基板上の専有面積も小さく済みます。このため機器の小型化に向いています。
- バスには複数のコントローラーを接続できます。(マルチコントローラー)
- コントローラーが生成するクロック信号にしたがって通信を行う同期式です。
- バスラインは送受信共用の半二重通信です。バスはオープンドレインまたはオープンコレクタによるハイインピーダンスであり、プルアップ抵抗は必須です。信号はプルアップ抵抗によりなまるため、比較的低速の通信に使用されます。
- バスに接続されている各機器には固有のアドレスが割り振られており、それによって通信相手を指定します。
- バスへの機器の追加・除去が容易です。
- マルチコントローラー構成とするためには、マルチコントローラーに対応した機器をコントローラーに採用してください。複数のコントローラーから同時にデータ送信することによる、衝突回避処理が必要となります。
- プルアップ抵抗の選定が重要です。バス上の信号波形をオシロスコープなどでモニターし、波形がなまっていないこと確認してください。
またI2Cの始まりは1982年と歴史が古く、時代の流れ、技術の進歩に伴いいくつかのモードが存在します。接続する機器のモードに合わせた制御が必要になります。
モード | 略称 | 仕様 |
---|---|---|
スタンダードモード | Sm | 最大100kbps |
ファーストモード | Fm | 最大400kbps |
ファーストモードプラス | Fm+ | 最大1Mbps |
ハイスピードモード | Hs-mode | 最大3.4Mbps |
ウルトラファーストモード | UFm | 最大5Mbps、片方向通信のみ可能 |
- 実際に最大速度で通信できることは稀です。接続する機器の組み合わせや周囲温度でも波形の状態は変わるため、最大でも70%程度の速度で通信すると良いでしょう。
通信プロトコル
開始と終了
I2C通信はスタートコンディション(S)で始まり、ストップコンディション(P)で終わります。スタート/ストップコンディションはコントローラーが生成します。スタートコンディション生成後のバスはビジー状態をとり、送受信が終わりストップコンディション生成後に一定時間経過するとバスを開放します。
項目 | 内容 |
---|---|
スタート | SCLがHighの状態のときに、SDAをHighからLowに変化させるとスタートコンディションを生成します。 |
ストップ | SCLがHighの状態のときに、SDAをLowからHighに変化させるとストップコンディションを生成します。 |
ストップコンディションを生成してバスを開放すると、他のコントローラーからの割り込みが入る可能性があります。これを避けるため、ストップコンディションではなく再度スタートコンディションを生成することで、バスはビジー状態を保ちます。これをリピートスタートコンディションといい、生成方法はスタートコンディションと同じです。
データ
1バイトは8ビットであり、データ送信はMSB(Most Significant Bit)ファーストです。またSDAのHigh / Lowの切り替えは、SCLがLowの間にのみ許可されます。
ターゲットアドレス
(リピート)スタートコンディションに続いて、最初にコントローラーからターゲットアドレスが送信されます。このターゲットアドレスは一般的には7ビットですが、一部の機器では10ビットのものもあります。したがって27または210がバスへのターゲット最大接続数となります。ただし「0000XXX」「1111XXX」の計16個は、下記表のとおり予約済みアドレスのため使用できません。
ターゲットアドレス | R/W | 内容 |
---|---|---|
0000 000 | 0 | ジェネラルコールアドレス |
0000 000 | 1 | スタートバイト |
0000 001 | X | CBUSアドレス |
0000 010 | X | 異なるバス形式用に予約されています |
0000 011 | X | 将来の目的のために予約されています |
0000 1XX | X | Hs-modeのコントロールコード |
1111 1XXX | X | デバイスID |
1111 0XXX | X | 10ビットターゲットアドレス用 |
※ 0=Low / 1=High / X=0でも1でも良い
- 7ビットアドレスの機器と10ビットアドレスの機器は、同一のバスに共存できます。
ACKとNACK
アクノリッジ(ACK:Acknowledge)とノット・アクノリッジ(NACK:Not Acknowledge)は各バイトの後に付きます。ACKとNACKは受信側が発信するもので、コントローラーからのデータ送信時はターゲットが、ターゲットからのデータ送信時はコントローラーが発信します。
項目 | 内容 |
---|---|
ACK | 一般的には成功を表し、次のような状況を指します。 ターゲットがコントローラーからの送信データの受信に成功した。 コントローラーがターゲットからの追加データを要求する。 |
NACK | 一般的には失敗を表し、次のような状況を指します。 指定したアドレスのターゲットが存在しない。 受信側が応答できるような状態にない。 受信したデータが異常である。 コントローラーが受信中で、それ以上のデータが不要であると示すとき。 |
通信例
記号 | 内容 | 信号レベル |
---|---|---|
S | スタートコンディション | - |
Sr | リピートスタートコンディション | - |
P | ストップコンディション | - |
A | アクノリッジ | Low |
NA | ノット・アクノリッジ | High |
R | 読み出しモード | High |
W | 書き込みモード | Low |
AX | ターゲットアドレス | - |
ターゲットへ書き込み
7ビットアドレス例
- コントローラーはスタートコンディションを生成し、通信を開始します。
- コントローラーはターゲットアドレスを書き込みモードで送信します。
- 自身のアドレスと一致するターゲットは、ACKを返信します。
- コントローラーは1バイトのデータを送信します。
- ターゲットはACKを返信します。(必要な分だけ④⑤を繰り返します)
- コントローラーはストップコンディションを生成し、通信を終了します。
10ビットアドレス例
- コントローラーはスタートコンディションを生成し、通信を開始します。
- コントローラーはターゲットアドレスの上位2ビットを書き込みモードで送信します。
- 自身のアドレス上位2ビットと一致するターゲットは、ACKを返信します。
- コントローラーはターゲットアドレスの下位8ビットを送信します。
- 自身のアドレス(10ビット)と一致するターゲットは、ACKを返信します。
- コントローラーは1バイトのデータを送信します。
- ターゲットはACKを返信します。(必要な分だけ⑥⑦を繰り返します)
- コントローラーはストップコンディションを生成し、通信を終了します。
ターゲットから読み出し
7ビットアドレス例
- コントローラーはスタートコンディションを生成し、通信を開始します。
- コントローラーはターゲットアドレスを読み出しモードで送信します。
- 自身のアドレスと一致するターゲットは、ACKを返信します。
- ターゲットは1バイトのデータを送信します。
- コントローラーはACKを返信します。(最後の1バイトになるまで④⑤を繰り返します)
- ターゲットは最後のデータを送信します。
- コントローラーはNACKを返信し、読み出しの終了をターゲットに伝えます。
- コントローラーはストップコンディションを生成し、通信を終了します。
またEEPROMなどでは、読み出し開始アドレスを指定したい場合があります。このような場合はリピートスタートコンディションを用いて、次のように通信を行います。
- コントローラーはスタートコンディションを生成し、通信を開始します。
- コントローラーはターゲットアドレスを書き込みモードで送信します。
- 自身のアドレスと一致するターゲットは、ACKを返信します。
- コントローラーは読み出し開始アドレスを送信します。
- コントローラーはACKを返信します。
- コントローラーはリピートスタートコンディションを生成し、通信を再開します。
- コントローラーは読み出し開始アドレスを送信します。
- コントローラーはACKを返信します。
- ターゲットは1バイトのデータを送信します。
- コントローラーはNACKを返信します。(続けて読み出したい場合はACKを返信します)
- コントローラーはストップコンディションを生成し、通信を終了します。
10ビットアドレス例
- コントローラーはスタートコンディションを生成し、通信を開始します。
- コントローラーはターゲットアドレスの上位2ビットを書き込みモードで送信します。
- 自身のアドレス上位2ビットと一致するターゲットは、ACKを返信します。
- コントローラーはターゲットアドレスの下位8ビットを送信します。
- 自身のアドレス(10ビット)と一致するターゲットは、ACKを返信します。
- コントローラーはリピートスタートコンディションを生成し、通信を再開します。
- コントローラーはターゲットアドレス上位2ビットを読み出しモードで送信します。
- 自身のアドレスと一致するターゲットは、ACKを返信します。
- ターゲットは1バイトのデータを送信します。
- コントローラーはNACKを返信します。(続けて読み出したい場合はACKを返信します)
- コントローラーはストップコンディションを生成し、通信を終了します。
参考文献
本家本元のサイトで公開している、I2C仕様書の日英PDFファイルです。日本語版はかなり古いものなので、最新仕様は英語版で確認してください。