トップページ > dsPIC入門 > dsPICでI2C(2)

I2Cの通信規格

I2C通信の規格について

I2Cはお手軽にネットワークを組めるので便利なのですが、そのためには通信の規格をある程度 知っておく必要があります。“スタートコンディション”や“ストップコンディション”、 “アクノリッジ”について触れておきます。また、複数のデバイスがI2Cバス上にあっても 、通信相手を特定するためのアドレス指定の方法も押さえておきたいところです。

dsPIC内にはこれらの信号処理をハードウェア的に自動でやっていくれるモジュールが あるので、細かいところまで気にしなくても動作させることはできます。また、 C30コンパイラで用意されているライブラリの関数を使えば プログラムを書くのも難しい作業ではありません。 しかし、それでもI2Cのバス・タイミングを意識しないとコーディングの際にイメージできない 点がいくつか出てきてしまいます。デバッグの助けにもなりますので、最低限の知識だけでも 書き留めておくことにします。

通信速度

I2Cの通信速度は100[kbps]の“標準モード”と400[kbps]の“ファースト・モード”があります。 また、3.4[Mbps]まで使える高速モードというのもあったりします。(「ファーストモード」よりも「高速モード」 の方が速いんですね・・・名前の付け方が不思議ですね 汗)

何らかのモジュールとI2C通信する際には、そのモジュールに定められている通信速度に合わせる必要があります。 また、dsPIC同士で通信する場合はお互いの通信速度を合わせれば通信できてしまうので、そのあたりはテキトーで 良いと思います(爆)

通信のタイミング

I2C通信のデータバス(dsPICでいうSDAピン)は、必ずプルアップして使います。よって、dsPIC側から“0”を出力して わざとデータバスの電位を下げない限り、常にSDAピンの電位は“1”となっています。同期クロック(SCLピン)も 通信していない場合は“1”となっていて、通信中はクロックとして“0”と“1”を交互に出力することになります。 ここでI2Cデータバスの約束として、クロックであるSCLが“1”を出力している間はデータバスであるSDAピンの出力を 変化させてはいけない・・・というものがあります。確実に通信するためには、データバスの出力がフラフラしていたら 困るからです。

ただし、例外として通信の開始と終了の時だけはクロックが“1”の時にデータバスの電圧を変化させる必要があります。 クロックが“1”の時にデータバスを“1”→“0”と変化させることで、I2C接続されているデバイスに「通信開始」を 知らせることができます。これは「スタート・コンディション」と呼ばれています。スタート・コンディションを発行できるのは マスター側だけです。I2Cのデータバスはプルアップされているので初期状態で“1”なので、最初に“0”が来たところから 通信が始まる・・・という感じでしょうか。

通信を終了するときには、クロックが“1”の時にデータバスを“1”→“0”と変化させます。これを「ストップ・コンディション」 と呼びます。スタート・コンディションとは逆の操作になります。ストップ・コンディションを発行できるのも、 マスター側だけとなります。通信を開始したマスター側のデバイスは、通信終了時にストップ・コンディションを発行する 必要があります。

・・・とはいえ、dsPICでI2C通信をする際にはC30コンパイラのライブラリ関数に“スタートコンディション発行関数” のようなものがあり、これを呼び出すだけで終わりです。ストップコンディションについても同様です。便利ですね。

アクノリッジについて

I2C通信ではマスターが通信を開始してから、どんどんデータ転送をすることになります。しかし、マスターが勝手にデータの 送受信を続けるわけではなく、スレーブ側から応答が返ってきていることを確認した上でデータのやり取りをする仕組みに なっています。

最初の例として、マスターからスレーブへデータを送信する状況を考えます。
データの送受信の単位は8ビットとなっています。マスターが8ビット分のデータを送信すると、マスターはデータバスを “1”に戻して受信待機状態となります。ここで、スレーブ側が正しくデータ受信されていた場合は、今度はスレーブが送信 側となり、1ビットだけ“0”を送信します。このスレーブ側から送られてくる1ビットの“0”をアクノリッジ信号 (Acknowledge)と言います。マスターは8ビット送信後アクノリッジが来るまで待っていることで、 常に正しく通信することができます。

次に、マスターが受信でスレーブが送信の場合を考えます。
やはり、最初はマスターからスレーブへ送信要求を出します。(これについては次の項参照です) その後、スレーブからアクノリッジが返ってきて、続けてデータが送られてきます。マスターはこれを受信し、 8ビットの区切りでアクノリッジを返す必要があります。スレーブ側では8ビット送信した後マスターからの アクノリッジが返ってくるまで待機しているので、マスターがアクノリッジを返さないと通信が進まなくなってしまいます。

2種類のアドレス送信方式

I2C通信では、1つのデータバスへ複数のデバイスをどんどんつないでいくことが可能です。 このことから、I2Cの通信規格では、スタートコンディションを発行して最初に送るデータは「通信する相手のアドレス」 となっています。さらに、そのアドレスで指定されたデバイスへ「データを送信」したいのか、 逆にそのデバイスから「データを受信」したいのか・・・ということも含めて指定する必要があります。

I2Cのアドレス指定方法は2種類で、“10ビットアドレスモード”と“7ビットアドレスモード”があります。 いずれにせよ、I2Cのデータ送受信の単位は8ビットですので、無理やり(?)8ビットのデータ幅に収めて 送信することになります。
7ビットアドレスモードの場合は、“7ビットのアドレス+送信・受信指定ビット”で1つのアドレス指定データとなります。 送信・受信指定ビットが“0”なら送信(Write)、“1”なら受信(Read)となります。
10ビットアドレスモードの場合は、最初の8ビットのうち上位5ビットは固定された“11110”で、残り3ビットで “アドレスの上位2ビット+送信・受信判定ビット”を送信します。次の8ビットは全てアドレスのデータを送信します。




前へ   次へ