製作した計器に搭載している加速度センサLIS3LV02DLにはかなり癖があることがわかったので、調べたことをまとめておきます。
このセンサはCSピンの論理によってI2C/SPIモードの切り替えができるため、2つのモードについて分けて書きます。
1. I2Cモード
I2Cモードでの動作には非常に癖があります。
下の図はUSB-I2Cブリッジを使い、I2Cのアドレスを表示させたものです。
データシートによると、このデバイスのアドレスは3A(8bit)ですが、ほかのアドレスも表示されています。
問題がこれだけならばよいのですが、100Hz程度の読み出しを行うとI2Cバスが途中で停止してしまいました。
これらの挙動には電圧依存があるらしく、3.3V動作と2.5V動作を比べると、2.5Vの場合のほうがうまく動いているようでした。
以前に、長いACKが出力されるという問題をレポートしましたが、その原因もこのセンサにあったようです。
I2Cモードではこのような動作をするので、読み出す頻度が低い場合やテスト以外にはI2Cモードは使うべきではありません。
2. SPIモード
SPIモードではこのセンサは特に癖もなく、問題なく動きます。
下の図は10msごとに3軸分の加速度を読んだ様子をロジックアナライザで調べたものですが、読み出しはI2Cに比べ高速で挙動も安定しています。
製作した計器では何とかごまかしながら加速度を測定していますが、近いうちに使っているジャイロセンサIMU-3000とピン互換のある6軸センサMPU-60X0が出るはずなので、そちらに切り替える予定です。
また、9軸分のセンサと行っているI2C通信にかかる時間がかなりシステムの足を引っ張っていることがわかったので、次に基板を作製する時にはMPU-6000からSPI通信で6軸分のデータを取得しようと考えています。
このセンサはCSピンの論理によってI2C/SPIモードの切り替えができるため、2つのモードについて分けて書きます。
1. I2Cモード
I2Cモードでの動作には非常に癖があります。
下の図はUSB-I2Cブリッジを使い、I2Cのアドレスを表示させたものです。
USB-I2Cブリッジを使って調べたI2Cのアドレス |
問題がこれだけならばよいのですが、100Hz程度の読み出しを行うとI2Cバスが途中で停止してしまいました。
これらの挙動には電圧依存があるらしく、3.3V動作と2.5V動作を比べると、2.5Vの場合のほうがうまく動いているようでした。
以前に、長いACKが出力されるという問題をレポートしましたが、その原因もこのセンサにあったようです。
I2Cモードではこのような動作をするので、読み出す頻度が低い場合やテスト以外にはI2Cモードは使うべきではありません。
2. SPIモード
SPIモードではこのセンサは特に癖もなく、問題なく動きます。
下の図は10msごとに3軸分の加速度を読んだ様子をロジックアナライザで調べたものですが、読み出しはI2Cに比べ高速で挙動も安定しています。
SPIモードで3軸を同時に読み出している様子 |
製作した計器では何とかごまかしながら加速度を測定していますが、近いうちに使っているジャイロセンサIMU-3000とピン互換のある6軸センサMPU-60X0が出るはずなので、そちらに切り替える予定です。
また、9軸分のセンサと行っているI2C通信にかかる時間がかなりシステムの足を引っ張っていることがわかったので、次に基板を作製する時にはMPU-6000からSPI通信で6軸分のデータを取得しようと考えています。
Hiraku_TOIDA さん、こんにちは
返信削除I2Cでご苦労されたようで、すこしコメントさせてください
端的にI2Cにはプロトコルがあり、SPIはエラーフリーの範囲で
プロトコルなしで通信するという違いでしょうか
ここでプロトコルがあるというのは、エラー検出で再送したりすることを言っています
同様の現象は当方もたくさん経験しました、PSoC1の場合は色々やって
うまくいったのは、I2CmとEzI2Csのテーブル転送くらいでしょうか
線路のプルアップ抵抗値を5Kから20Kくらいまで替えても結果が違ってきます、特に相手方がAVRになったり、個別ICとか変わってきますから微妙ですね。
ですからきっちりシステム設計をやって、ロジアナかなんかでしっかり通信BITを把握してやらなければなかなか動かないことが多いですね。
SPIはうってかわって雨だれ的速度から超高速までしっかり動作してくれます、マスター側で1文字毎にループバック値をチェックしてやれば
許容速度以内では無敵です。
気をつけることは複数接続の場合に、マスター/スレーブ共に通信終了後にはSSだけでなくMOSI,MISOならびに必要に応じてSCLKも3-STATEに戻しておく必要があります。これをやってないと良い結果は得られません(当たり前のはなしですが)
など、きありきたりの話だったかもしれませんが
よろしくお願いいたします。
psoc73でした
こんにちは。
返信削除この実験では、I2C/SPIともにエラー検出での再送などのプロコトルは実装しておらず、センサのデータを読み出しているだけです。
プルアップ抵抗の値を変える、センサにつなぐデバイスを変えるなどしてもI2Cバスが止まってしまう現象がロジアナで確認できたので、デバイス側の問題ではないかと考えています。
I2Cバスに他のセンサを2つ追加したものも試してみましたが、LIS3LV02DLがある場合のみ通信がおかしくなるようです。
SPIはこのセンサ単独でしか実験していませんが、複数をつなぐ場合にはご指摘の注意点を守って実装したいと思います。
アドバイスありがとうございました。
このコメントは投稿者によって削除されました。
返信削除