I2Cは通信規格の1つで,主にマイコンとその周辺機器の通信に使われます.
この記事ではI2Cの通信の仕組みについて解説していきます.
目次
I2Cとは?
I2C(Inter-Integrated Circuit)は,Philips Semiconductors社(現在のNXP Semiconductors社)が開発した通信規格です.
IC間の通信を担い,マイコンとその周辺機器(EEPROMなど)の通信でよく使われます.
I2Cは「アイツーシー」や「アイスクエアドシー」などと読みます.
また,I2CはInter-ICと表記されることもあります.
I2Cの仕様は,NXP Semiconductors社がUM10204 I2C-bus specification and user manualという文書で公開しています(会員登録が必要です).
現在,I2CはSPIと並んで事実上の業界標準(デファクトスタンダード)となっています.
I2Cの概要
I2Cでは,SDAとSCLの2本の信号線を用いて通信を行います.
SDAはSerial Dataの略で,データ用の信号線です.
SCLはSerial Clockの略で,クロック用の信号線です.
また,それぞれの信号線にはプルアップ抵抗を接続します.
I2Cでは,デバイスはその役割によってマスタとスレーブに分けられます.
マスタは通信の開始,クロック信号の生成,通信の終了を行います.
マスタはスレーブが持つスレーブアドレスを指定することで特定のスレーブと通信します.
マスタとスレーブの動作の例:
マスタからスレーブにデータを送信するとき
- マスタが通信を開始する
- マスタがスレーブアドレスを指定する
- マスタからスレーブにデータを送信する
- マスタが通信を終了する
マスタがスレーブからデータを受信するとき
- マスタが通信を開始する
- マスタがスレーブアドレスを指定する
- マスタがスレーブからデータを受信する
- マスタが通信を終了する
I2Cの出力端子はオープンドレインになっています.
I2Cの仕組み
データ転送
I2Cでデータ転送を行うとき,SDAとSCLはそれぞれ次のように動作します.
SCL=HIGHのときのSDAの信号がデータになります.
この図のように,SCL=HIGHのときにSDAを変化させてはいけません.
START ConditionとSTOP Condition
通信開始の合図としてSTART Condition,通信終了の合図としてSTOP Conditionを使います.
SCL=HIGHのときに:
- SDAをHIGH→LOWとしたらSTART Condition
- SDAをLOW→HIGHとしたらSTOP Condition
となります.
通信はSTART Conditionで開始し,STOP Conditionで終了します.
アクノリッジ(ACK)とノットアクノリッジ(NACK)
受信側はデータの受信後,データが正常に受信できたことを送信側に伝えます.この信号がアクノリッジ(ACK)です.
受信側がデータを受信できなかった時は,ACKを送信しません.これをノット・アクノリッジ(NACK)と呼びます.
バイトフォーマット
I2Cでの通信は次のように行います.
- マスタがSTART Conditionを発行
- マスタがスレーブアドレス(7ビット)を送信
- マスタがR/Wを送信
- スレーブアドレスが一致したスレーブがACKを返す
R/W=0のとき(マスタが送信側)
- マスタがデータ(8ビット)を送信
- スレーブがACKを返す
- 5に戻る or マスタがSTOP Conditionを発行
R/W=1のとき(スレーブが送信側)
- スレーブがデータ(8ビット)を送信
- マスタがACKを返す
- 5に戻る or マスタがSTOP Conditionを発行
*スレーブアドレス,データともにMSBファースト(最上位ビットから最下位ビットの順)で送信します.
I2Cの使い方
ArduinoでI2Cを使う方法はこちらを参考にしてください。
EEPROMをI2Cで使う方法はこちらを参考にしてください.