AN4070アプリケーションノートに従って自由落下検出を試みています。以下は私が設定したレジスタ設定です。
MMA8452_CTRL1_REG = 0x20; //デバイスを50 Hz ODR、スタンバイに設定
MMA8452_FF_MT_CFG= 0xA0; //自由落下検出を有効にする構成レジスタセット「AND」条件、OAE = 0、X、Y、Zおよびラッチを有効にする
MMA8452_FF_MT_THS = 0x03; //0.2g/0.063g= 3.17 カウント // 3 カウントに丸める
MMA8452_FF_MT_COUNT = 0x06; //120ms/20ms(ステップ)=6カウント
MMA8452_CTRL4_REG = 0x00; //システム内のモーション/自由落下割り込み機能を有効にする
MMA8452_CTRL5_REG= 0x00; //モーション/自由落下割り込み機能をINT2ハードウェアピンにルーティングします
IMMA8452_CTRL1_REG = MMA8452_CTRL1_REG | 0x01; //デバイスをアクティブモード(50 Hz)にする
この設定に続いて MMA8452_INT_SOURCE レジスタが読み取られ、結果は 0xFF になります。
続いて MMA8452_FF_MT_SRC レジスタを読み取りますが、このレジスタの結果も 0xFF です。
レジスタ MMA8452_FF_MT_SRC の読み取りにより、自由落下割り込みがクリアされるはずですが、割り込みは常にアクティブで、まったくクリアされません。何か見落としているものはありますか?(ハードウェア制限があるため、現在はハードウェアピンINT2を使用していません)
こんにちは、ジャスティン。
それは嬉しいですね。I2C通信でこのようなトラブルはよくあることなので、 WHO_AM_Iレジスタと、それ以前に書き込んだレジスタを最初に読み取ることを常にお勧めしています。ロジックアナライザやオシロスコープを使うと非常に役立ちます。
よろしくお願いいたします。
トーマス
こんにちは、トーマス。
MMA8452 は正常に動作しており、自由落下も検出しています。
書き込み操作のI2C通信モードを変更しました(書き込みを使用して次の読み取り用のレジスタを設定する場合)
停止せずに転送を完了します。
以前は、開始と停止を伴う完全転送を使用していました。
よろしくお願いします。
ジャスティン
こんにちは、トーマス。
ご協力ありがとうございます。
制御レジスタ 4 の値を 0x04 に修正しました。まだ成功していません。
WHO_AM_I レジスタ (0x0D) を読み取ろうとしましたが、結果も 0xFF でした。0x2A になるはずですよね?
I2C ラインに 0x1C デバイスが存在することを確認しましたが、正しく表示されています。
また、 0x01 から 0x06 までの 6 バイトのデータを連続して読み取ることも試みましたが、データを読み取ることができ、適切に認識されました。
ここでも、受信される最初のデータ バイトは常に 0xFF であり、残りの 5 つのデータ バイトも加速に応じて変化します。
一方、同じループには別の I2C ベースの 1 バイト メモリの書き込みと読み取りがあり、これは完全に正常に動作します。
ご意見がありましたらどうぞ!
こんにちは、ジャスティン。
まず、WHO_AM_I レジスタ (0x0D) とその他の以前に初期化されたレジスタを読み取ることができることをもう一度確認してください。
次に、MMA8452_CTRL4_REG = 0x00 をMMA8452_CTRL4_REG = 0x04 に変更してみてください。
よろしくお願いいたします。
トーマス