I2Cの罠

I2C(アイ・スクエアド・シー/アイ・ツー・シー)とはInter-Integrated Circuitの略です。 太字で書きましたが、略などどうでもいいです。

基板上のIC間で使われるシリアル通信の規格の一つです。 通信にはデータ用、クロック用の2本の線を使います。 この2本の信号の出力は共にオープンドレインです。 オープンドレインについてはRA4の罠を参照して下さい。 オープンドレインということはプルアップ抵抗が必要です。

サイトによってはこのプルアップ抵抗をいれていないものがあります。 しかしこれは恐らくPICまたは接続先デバイスのの内部プルアップ機能などを用いているものと考えられます。 基本的には必ず入れなければならないものと考えてください。 意外と忘れがちなので注意してください。

C30にはI2C用の関数が用意されている・・・ことになっています。 しかし実は存在するのはヘッダファイルだけで中身がありません。 (全てのバージョンでないとは限りません。少なくともMPLAB C Compiler for P24 and dsPIC v3.23 in LITE modeでは中身がありません)。 ひどい詐欺です。 ただしC30のインストールフォルダ中にソースコードが格納されています。 デフォルトインストールでは格納場所は C:\Program Files\Microchip\MPLAB C30\src\peripheral_30F_24H_33F\src\pmc\i2c です。 I2C用の関数を使いたい時はこのフォルダの中のファイルをプロジェクトファイルに追加するか、 このフォルダの中のファイルをライブラリ化しておいてそのライブラリをプロジェクトファイルに追加する必要があります。 後者の方がスマートなのでオススメです。

ライブラリの作り方ですが、サイト/書籍によっては MPLABのインストールフォルダなかにあるmplib.exeを用いてオブジェクトファイルからライブラリファイルに変換できると書いてあります。 しかし、この方法はじつはC30では使えません。 (少なくとも上記のバージョンでは使えません。ちなみにC18では使えます。) なんという互換性の低さ・・・。 代わりの方法として、MPLAB IDEでソースコードをライブラリ化するという方法があります。 まずライブラリ化したいソースコードのみを含む新プロジェクトを作成します。 そのプロジェクトのプロパティのダイアログボックスのASM30/30 Suiteタブで Target Type を Build normal target から、 Builde library targetに変更します。 これでソースコードから拡張子「.a」のライブラリファイルを作成することができます。 ライブラリファイルを作成するプロジェクトにはmain()関数はいりません。

さて、こうやってようやく手に入れたI2C用の関数ですが、当然中身にも罠が隠されています。 IdleI2C()という関数があります。この関数の役割はI2Cの各動作に対応するビットがクリアされるのを待つことです。 つまり何かをしたときにそれらが全て終了するのを待つ・・・・ということになっています。 しかしRestartI2C()の動作に対応する I2CCONbit.RSEN というビットだけが抜けています。 もうこのコンパイラはどうなっているんでしょうか・・・。 RestartI2C()を使ったあとの待ち時間だけはIdleI2C()を使わず、
while (I2CCONbits.RSEN)
としなければなりません。

ここまでくるともう「そこまでして間違いだらけのコンパイラ付属関数を使わなくても常にビットを直接操作すればいいんじゃない?」 という意見も出てくるかと思います。 まったくもってその通りです。 筆者はそのことに気付くのが遅すぎました・・・。この間違い探しにどれだけの時間を費やしたかorz

Top