PSoC3でI2C通信

2011/06/04

PSoC3

作製している電装系の基板には、
を搭載しています。

これらのセンサのログは100spsで取得するように設定していたのですが、実際に動かしてみると65sps程度しか出ませんでした。
搭載しているマイコンPSoC3の行っている仕事は、センサからのデータ読み出しの他にも、ディスプレイ表示やSDカードへの記録がありますが、調べてみるとデータ読み出しの部分がサンプルレートを制限していることがわかりました。
そこで、データ取得プログラムのどこがボトルネックになっているか調べてみました。

先に挙げたセンサ類はすべてデジタル出力タイプで、PSoC3とは400kbpsでI2C通信しています。
一度に取得するデータは高々20バイト程度なので、正しく通信が行われていれば100spsでのサンプリングには十分に余裕があるはずです。
実際に通信の様子がどうなっているのかをロジックアナライザで調べてみたのが下の図です。
  
2バイトずつ読み込みを行ったときのI2C通信の様子
一番下が40ミリ秒間のデータですが、長いACK(青緑色)が送られているせいで、かなり通信に時間がかかっていることがわかります。
この原因が何なのかはわからなかったのですが、2バイト単位のセンサのデータを一度に読み込まず1バイトずつ読み込むことで、このような問題が起きないことがわかりました。
下の図に1バイトずつデータを読んだときの通信の様子を示します。
1バイトずつ読み込みを行ったときのI2C通信の様子
先ほどと同様に、一番下が30ミリ秒間のデータで、長いACKは姿を見せず、きちんと通信ができていることがわかります。
このときのサンプルレートは92spsになりました。
100spsに届かなかったのは主にSDカード書き込みの部分によるもので、SDカードによって個体差があることまではわかっています。
この部分の対策はなかなか難しそうなので、何枚かSDカードを比較して、一番よい結果が出たものを使うことで対応しようと考えています。