PIC AVR 工作室別館 arduinoの館->TopPage->各種ライブラリ->TWI(I2C)

TWI(I2C)表示ライブラリ Wire

TWI(I2C)は、データ線+クロック線の計2本の線でIC間の通信を行う方法で、arduinoのメインCPUであるAT-MEGA シリーズでは元々ハードウェアのユニットが内蔵されていて、比較的容易に使用できます。

しかし、よく引き合いに出されるUSARTやSPI通信と比較するとTWI(I2C)のプロトコルは元々少々複雑なので、 そのプロトコル自体をある程度理解していないと上手く使いこなせないかと思います。arduinoでも同様です。

このページでは、TWI(I2C)のプロトコルの概要だけ整理して、最も多用されるEEPROMの接続くらいは容易に 行えるようなお話をしていきたいと思います。それ以上詳しいことは、 山根さんの本に詳しく書かれているので、ご興味のある方はそちらをご参照ください。

なお、この2線式I/Fはもともとフィリップス社が提唱した「I2C」という呼び方が一般的なのですが、ライセンスの 都合かなにかがあるらしく、atmel社は「TWI」(Two Wire Interface)という名称を使用しています。 仕様的には互換性があるので、市販のI2C接続製品は普通に繋ぐことが出来ます。なお、このページでは以後TWIに統一します。

TWIの概要

TWIのバスについて…2本の通信線

TWIはデータ線(sda)とクロック線(scl)の計2本の線で構成されるバス上に、各ICがデータを送ったり受信したりすることで 通信を行います。

他の通信手段とちょっと比較してみます。

USARTは相対(あいたい)通信なので送受信が独立して行えますし、SPIなら別途SS信号(スレーブセレクト)信号を 使うことで通信元と通信先を「物理的に明示」することが出来ます。しかしTWIには2本の線しか無いので、物理的に通信相手を 明示することは出来ません。ではどうやって通信元、通信先をコントロールしているのでしょうか?

通信元と通信先の制御

イーサネットでは、例えばトークンリングLANではトークンを持った端末が唯一無二の通信元となります。そして通信元が通信先を 明示的に指定することになっています。そして、このトークンは次々と端末間を行き交うことになります。 TWIの制御方法はこれに少し似ています。

TWIでは、一般には1つのマスターICと、1個以上のスレーブICがバスに接続されています。(マスターが複数存在 する場合もあるのですが、複雑になるので説明は端折ります)

各スレーブICはバス内でユニークなアドレスを持っていて、マスターはそのアドレスを明示指定することによって特定のスレーブICと データを取り交わす事が出来ます。つまり、物理的に相手を指定するのではなく、通信文のデータ中にアドレスを織り込んで送信し、 受信側は自分宛のデータか否かを判断して動作したり無視したりするというわけです。

マスターが特定の通信相手にトークンを投げ、通信相手はマスターにトークンを返し…ということを繰り返すことで マスター・スレーブ間の双方向をデータが行ったり来たりすることができる、そんなイメージです。 (実際はもっと簡素化・濃縮化・形式化された情報のやり取りですが…)

ちなみに、マスターはアドレスを持ってません。スレーブ側から通信を投げかけることが無いためです。

周知のとおりトークンリングLANでは端末間に優先順位が無いのですが、TWIではマスターとスレーブとでは格の違いが 設けられています。マスターだけがバス上のデータの流れをコントロールする権利を持っていて、スレーブはマスターからの指示に 従ってデータを受け取ったり、リクエストされたデータを返したりといった動作を行います。

マスターとスレーブでやり取りされるデータの流れの制御方法やそのフォーマットについては後述するとして、 ひとまずは、TWIの通信は「マスターとスレーブの間を2本の線を使って双方向にデータが流れることで行われる」という ことだけ掴んでおいて下さい。

なお、トークンリングLANみたい…っていうのはあくまで私の感覚的な話なので、分かりにくいって言う方は その件について忘れちゃってください。

TWIの物理接続

TWIの配線

先ほどの図です。

TWIではデータをやり取りする「sda」、クロックをやり取りする「scl」という 2本の線を使用して接続します。そしてその2本の線は抵抗(約4.7kΩ)を介してVccに繋がっています。

マスター、スレーブの各ICは、この2本の線(TWIバス)に接続するだけで他のICとi/fを行う 事ができるようになります。

さて、前述のとおりTWI通信ではこのバス線上を色々な方向にデータが流れることになるわけですが、 その際に各ICから出力される信号が衝突することは無いのでしょうか? LOWとHIGHがショートして ICが壊れることにならないのでしょうか?

TWIバスとオープンドレイン接続(オープンコレクタ接続)

答を先に言うと、当然ショートしません。各ICからの出力がLOWとHIGHが混在してもショートしない ようになっています。(マスターが2つ以上…マルチバスマスターで複数のマスターからの信号が衝突する場合でも 壊れることは無く、それを検知、回避することができるようになっています。→CSMA/CDのコリジョン発生時と似てますね)

その信号衝突の際にショートして壊れるようなことが無いように、オープンドレイン接続(オープンコレクタ接続) という方式でTWIバスに接続をしています。

…  以下準備中です  …

ひとまずブログの記事の実験結果をご覧ください。