※執筆中

I2Cバスの基本概念

I2Cバスはフィリップス社が提唱する、2線式双方向のシリアルバスです。マスターから、バスに並列に接続された複数のスレーブに対して、読み取りと書き込み操作を行うことができます。

マスター、スレーブともに、入力兼オープンドレイン出力のシリアルクロック(SCL)、シリアルデータ(SDA)の二つのポートをもち、これを並列に接続します。

スレーブは7ビットのスレーブアドレスによって一意に選択されます。
通常、この7ビットのスレーブアドレスに、後述のRead/Writeフラグを追加して、「Read用アドレス0xA3、Write用アドレス0xA2」のように表記されます。

I2Cバス信号の基本

シリアルクロック(SCL)は基本的に、マスターから出力されます。スレーブは、このマスターからのSCLに合わせて、SDAの入出力を行います。すなわち、SCLに合わせてSDAからデータを読み取り、あるいは逆に、SCLに合わせてSDAにデータを出力します。

バス上の通信は、マスター側からのSTARTコンディション(SCLが1の間にSDAが1→0に変化)で始まり、STOPコンディション(SCLが1の間にSDAが0→1に変化)で終了します。
データビットはSCLが1レベルの間に確定されます。立ち上がり・立ち下がりエッジではないので注意。データビットでは、SCLが1の間はSDAは変化してはいけません。SDAのレベルの変更、入出力の切り替えは、SCLが0の間に行います。

データの単位は1バイト(8ビット)で、上位ビットから順に転送されます。1バイトごとに受信側は送信側にACK(1ビットの0)を返します。

1バイト受信後にNAK(1ビットの1)を返すこともできます。通常これは、スレーブからマスターへのデータ転送において、マスターがデータ転送終了をスレーブに伝える時に使います。

通信の基本

一連の通信は必ずマスターからのSTARTコンディションで始まります。
STARTコンディションの直後の1バイトは、7ビットのスレーブアドレスと、1ビットのRead/Writeフラグです。Read/Writeフラグには、マスターからスレーブに転送する場合は0を、スレーブからマスターへ転送する場合は1を設定します。
スレーブアドレスを受領したスレーブが、マスターに対してACKを返すことで、マスター・スレーブ間の通信が確立されます。

マスターからスレーブへの転送(書き込み)では、スレーブがスレーブアドレスに対してACKを返した後、そのままマスターからスレーブへデータを送信していきます。1バイトごとにスレーブがACKを返し、本来ならここでWaitサイクルなどもあり得るのですが、ここでは省略します。
データを送り終わったら、マスターからSTOPコンディションを送り、通信を終了します。


スレーブからマスターへの転送(読み取り)では、スレーブがスレーブアドレスに対してACKを返した後、スレーブからマスターへデータが送信されます。マスターはこれに対してACKを返しますが、最後のバイトの場合のみ、NAKを返すことで、スレーブに対してデータ転送の終了を伝えます。


例えばEEPROMのように、読み取る前に読み取るROM上のアドレスを指定する必要があるような場合は、書き込みと読み取りを複合して行います。
この場合では、一旦書き込みで開始し、読み取りたいアドレスなどの情報をスレーブに送信した後、STOPコンディションを送らずに、再度STARTコンディションを送って、読み取りに移行します。

バスのタイミング

このページへのコメント

93lHgC I really enjoy the article post.Much thanks again. Really Great.

Posted by tips about seo 2013年12月20日(金) 11:04:45

Hey, good to find soemnoe who agrees with me. GMTA.

Posted by Keesha 2011年07月01日(金) 22:58:04
http://www.google.com/

余計なお世話かもですが、7bitアドレスモード以外にも10bitアドレスモードもあります。
スタートコンディション後の1byteでスレーブアドレスを指定するのは、7bitアドレスモードの話であって、10bitアドレスモードでは違うので、その辺りを明記されないと、知らない人は勘違いしてしまいますよ。

Posted by 通りすがり 2011年05月08日(日) 15:38:01

へえ、こんなのがあるんですか。USBの子分みたいな感じですね。どんなデバイスがつながるんだろう・・・。面白そう。

Posted by takeru 2006年07月28日(金) 11:29:16

ニュース

  • 2010年8月21日
    Arduinoピン互換のマイコンボードNetduinoの記事を書き始めました。

Wikiをはじめる

マイページ