Thursday, October 18, 2007

I2C はまりどころ

 PSOCEVAL1 を Master、 MINIPROG1 を Slave として、I2C によるデータ通信の実験をしてみた。

 I2CHW モジュールを、Master 側は Single Master Operation、Slave 側は Slave Operationで構成して配置。データシートのサンプルプログラムをそのまま使ったのでは面白くないし動きがないので、とりあえずSlave側は SleepTimer_lGetTickCntr で取得した値(経過時間)をMaster側 に渡し、Master 側ではこの値をLCDに表示するようにプログラムを書いたのだが、ここで Slave 側のプログラムでハマった。

 結論から言うと、Slave 用の API の関数名における "read" や "write" は、Master からの視点で命名されていることを理解していなかったことだ。つまり、
  • Slave 側で、Master に引き渡す(=Master が読み出す)データを書き込むためのバッファの設定のための関数名には "read" がつくし、逆に、
  • Slave 側で、 Master から渡される(=Master が書き込む)データを読み込むためのバッファ設定のための関数名には "write" がつく。
のである。Slave 側から見れば read と write が逆に思えるが、これも Master からの視点と思えば頷ける。データシートやサンプルプログラムのコメント文を良く読めば判ることなのだが、またしてもハマった。上述の理由で、Master へ渡すデータ用のバッファを I2CHW_InitWrite を使って初期化していても動くわけがなかったのだ。

Labels: ,