1、I2Cとは
I2Cはフィリップス社が提唱するシリアルバス(通信インターフェイス)です。
日本語の読み方は 「アイ・アイ・シー」「アイスクエアド・シー」が正しいそうですが、表記上「I2C」と表記されることが多く「アイ・ツー・シー」とも呼ばれていますのでここでは「I2C」と表記します。
I2Cは同じ基板内での近い距離で直結したデバイスと100kbpsまたは400kbpsの速度でシリアル通信を行うのが主で、離れた装置間の通信には向いていません。
主な用途として、パソコンのマザーボード、組み込みシステム、携帯電話などで使われています。
I2Cは1つのマスターで複数のスレーブデバイスと通信することが可能な為、省配線や省スペース化が容易に実現可能です。
最近はあまり使われなくなったRS232Cもシリアル通信ですがこちらは非同期方式で、I2Cはシリアル・データライン(SDA)とシリアル・クロックライン(SCL)の2本のバスラインの構成のクロック同期型でのIC間通信で用いられ、マイコンとマイコン周辺機器(EEPROMや各種センサーなど)の通信でよく使用されSPIと並んで業界では標準的な通信方式です。
RS232Cの様な非同期式はお互いのプロトコルを事前に決めて行うのでお互いのプロトコルに相違があると全く通信が出来ません。その点同期式はそのような事は無く、クロックに同期してデータ等をやり取りするので、RS232Cの非同期より高速で確実な(エラーの少ない)通信を行う事が出来ます。
※SPI(Serial Peripheral Interface):Motorola社(現在のNXP Semiconductors社)が提唱した、同期式・全二重方式をもつ通信仕様で、I2Cと同様のマスターとスレーブの構成です。
2、I2Cの概略
I2Cの使用例として、図1の様な構成で1個のマスターと1個のスレーブ又は複数のスレーブを、SCLとSDAという2本の信号線で接続し、常にマスターからスレーブに対してクロック信号(SCL)を基準にしたデータ信号(SDA)で信号(データ)をやり取りします。
図1の様に複数のスレーブを使用する場合、それぞれのスレーブにはアドレスを割り付けて識別して使用します。 例えば図1の様にスレーブ1(温度センサ)をアドレス01 スレーブ2(湿度センサ)をアドレス02の様に割り付けます。I2Cの場合SCL・SDAの2本の信号線で全ての通信を行います。すなわちSCL・SDAともに複数のスレーブと接続する事になるので各スレーブは自分のアドレスに対しての通信(信号)のみに応答し自分以外のアドレスの通信(信号)には応答しない仕様により、正しくデータのやり取りを行っています。
I2Cの出力端子はオープンドレインとなっているので、図1の様にプルアップ抵抗を取り付けています。
マスタとスレーブの動作の事例です。
〇マスタからスレーブにデータを送信するとき
・マスタが通信を開始する
・マスタがスレーブアドレスを指定する
・マスタからスレーブにデータを送信する
・マスタが通信を終了する
〇マスタがスレーブからデータを受信するとき
・マスタが通信を開始する
・マスタがスレーブアドレスを指定する
・マスタがスレーブからデータを受信する
・マスタが通信を終了する
※プルアップ抵抗について:
プッシュプルタイプの出力回路であれば、接続するだけでよいのですが、I2Cの出力端子はオープンドレインなのでプルアップ抵抗が必要になります。
Low(0)の場合は出力回路がGNDと同電位になるので接続されていればLow(0)になりますが。
Hi(1)の時は出力回路がオープンになるだけですので、オープンドレインの場合はHi(1)レベルにするためにはプルアップ抵抗を取り付けます。
この時あまり大きな抵抗値を選定すると、Low(0)からHi(1)になる時に悪影響が発生する事があります。それは、回路構成によっては回路の浮遊インピーダンス(この場合コンデンサ成分)の影響でLow(0)からHi(1)へ変化する時のエネルギー充電に時間を要します。
プルアップ抵抗を小さくすればLow(0)からHi(1)への充電時間は早くなりますが、Hi(1)からLow(0)のときオープンドレインへの電流が多くなりすぎ故障してしまうがありますので適切な値を選定する必要がありますが、一般的には数kΩ~10kΩ程度を使用すれば良い様です。
データシートを良く確認しデバイスのIol(max)を超えない値で選定し、最終的には波形を確認することをお勧めします。
※Iol(max)とは I:電流 o:出力 l:Low max:最大 の頭文字でそのデバイスの引き込み電流の最大電流値の事です。
3、I2Cの仕組み
3-1データ転送
I2Cでデータ転送を行う場合、SDA(データ)と信号(SCL)は各々の動作の例です。
上の図は2進表記で10011010(16進で9A)のデータ(SDA)通信の状態を表しています。
SCL=Hi(1)のときのSDAの状態をデータとなります。
SDA(データ)を用意してからSCLをHi(1)にセットします、SCL=Hi(1)の時にSDA(データ)の状態(値)を変化させてはいけません。
3-2 START ConditionとSTOP Condition
通信の開始時の合図START Condition と 通信終了時の合図STOP Conditionを用います。
信号(SCL)がHi(1)の時に
SDA(データ)をHi(1)からLow(0)にするとSTART Condition
SDA(データ)をLow(0)からHi(1)にするとSTOP Condition
となります。
通信はSTART Condition で始まり、STOP Condition で終わります。
これはマスタ側が出力しスレーブ側はこの状態を読み込む事で動作します。
3-3 アクノリッジ(ACK)とノットアクノロジ(NACK)
受信側はデータ受信後にデータが正常に受信出来たことを送信側に伝える信号をアクノリッジ(ACK)といい、受信側がデータを正常に受信できなかった時は、ACK信号を送信しません。この状態をノットアクノロジ(NACK)と言います。
データの送受信状態を送信側がわかる仕組みになっています。
このように通常はアクノリッジ(ACK)を確認して STOP Condition として一連のシーケンスが終了します。
4.I2Cの使用方法
I2C通信の基本的な通信のデータフォーマットには、アドレスフォーマットとデータフォーマットがあります。
4-1 アドレスフォーマット
まずアドレスフォーマットは下図のようになります。アドレスには7ビットモードと10ビットモードがあり、図中の(1)(2)がそれぞれに対応します。
図中のACKビットは受信側から自動返信されるビットです。
I2Cを実際使用する際、使用するMPU(CPUやPIC)がI2Cに対応してるデバイスであれば、部品同士を正しく接続してMPU側で(モード)設定を行えば容易に使用することができますが、上記のI2Cのシーケンスは理解している方がよりよいと思われます。
I2Cに対応していないデバイスでも使用するMPU等の汎用I/O端子を用いてソフトウエアで対応する事も可能です。
それほど難しいことではないし、ネットを検索すれば参考となるC言語のサンプルソースも有りますがその際はI2Cの仕様内容をよく理解して使用しないと、うまく動作しないとき原因究明(解析)に時間を要しますので注意が必要です。