MMA8653FCR1とのインターフェース <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
こんにちは、 MMA8653FCR1 を I2C 経由でインターフェースしようとしています。モーション割り込みを検出し、INT1 にパルスを出すように MMA を構成する必要があります。同じものの擬似コードは次のとおりです。 1) CTRL_REG1 = 0x00 // MMAをスタンバイモードにする 2) INT_SOURCE = 0x04 // モーション割り込みをアクティブにする 3) XYZ_DATA_CFG = 0x00 // 2gモード 4) FF_MT_CFG = 0xf8 // 3軸すべてのモーション 5) FF_MT_THS = 0x1f //モーションしきい値 6) CTRL_REG3 = 0x0a // アクティブハイでモーションによりコントローラを起動可能 7) CTRL_REG4 = 0x04 //モーション割り込みを有効にする 😎 CTRL_REG5 = 0x02 // INT1の割り込み 9) CTRL_REG1 = 0x01 // MMA アクティブ。 上記のコードを試してみましたが、コントローラの I2C ライブラリは正常に動作しています。しかし、MMAは反応しない。 誰か役に立つリンクまたはサンプルコードを提供してもらえますか。 ありがとうございます シャリン 加速度センサ Re: Interfacing MMA8653FCR1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
シャリン、 問題は読み取り機能にあるはずです。 FXOS8700 データシートに記載されているように、I²C 通信は次のルールに従う必要があります。 残念ながら、書き込み操作の最後に停止条件を追加する I2C_MODE_COMPLETE_XFER を使用しています... 最初の転送 (読み取り操作) にはおそらく I2C_MODE_NO_STOP を使用する必要があります。それは次のようになるはずです: uint8_t MMA8653_SingleRead(uint8_t レジスタ) { uint8_t 値; // レジスタアドレスを書き込む I2C_I2CMasterWriteBuf(MMA_ADDR、&レジスタ、1、I2C_MODE_NO_STOP); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT) の場合); // 返された値を読み取る I2C_I2CMasterReadBuf(MMA_ADDR、&value、1、I2C_I2C_MODE_COMPLETE_XFER); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_RD_CMPLT) の場合); 戻り値; } でも、それはMCU側のあなたの仕事だと思います。 読み取り機能を正しく動作させても、モーション検出/構成に問題がある場合は私に連絡してください。 アンソニー Re: Interfacing MMA8653FCR1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
シャリン、 WHO_AM_I 値を読み取ることができない場合は、センサの設定を中止してください。MMA が正常に動作していることを確認するには、この値を読み取る必要があります。ハードウェアに問題があるのかもしれません....おそらく、I²C 通信が機能しないのでしょう... 回路図を共有して、I²C が正常に動作しているかどうか確認してもらえますか? ちなみに、I2C_Read 関数と I2C_Write 関数を記述することをお勧めします。コードが読みやすくなり、デバッグしやすくなります... void MMA8653_SingleWrite(uint8_t レジスタ、uint8_t 値) { uint8 buffer_i2c2[] = {レジスタ,値}; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_COMPLETE_XFER); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT) の場合); } uint8_t MMA8653_SingleRead(uint8_t レジスタ) { uint8_t 値; // レジスタアドレスを書き込む I2C_I2CMasterWriteBuf(MMA_ADDR、&レジスタ、1、I2C_I2C_MODE_COMPLETE_XFER); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT) の場合); // 返された値を読み取る I2C_I2CMasterReadBuf(MMA_ADDR、&value、1、I2C_I2C_MODE_COMPLETE_XFER); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_RD_CMPLT) の場合); 戻り値; } ありがとうございます アンソニー Re: Interfacing MMA8653FCR1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
こんにちは、アンソニー。 上記のご助力に心より感謝いたします。 しかし、いくつかの問題に直面しています。 WHO_AM_I レジスタを読み取ることができません。値は 0x00 になります。 最初に構成されると、MMA8653 はデフォルトで割り込みを発生します (モーションなし)。以下に同じコードを示します。 void MMA8653_init(void) { uint8 buffer_i2c2[2] = {0}; uint8 値 = 0; サイディレイ(3); 整数 i 、 j; buffer_i2c2[0] = M_WHO_AM_I; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、1、I2C_I2C_MODE_COMPLETE_XFER); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} (void) I2C_I2CMasterReadBuf(MMA_ADDR,&value, 1, \ I2C_I2C_MODE_COMPLETE_XFER); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_RD_CMPLT) の場合); value = value; //ここで表示される値は 0x00 です buffer_i2c2[0]=M_CTRL_REG1; buffer_i2c2[1] = 0x00; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_COMPLETE_XFER); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} buffer_i2c2[0]=M_CTRL_REG2; buffer_i2c2[1] = 0x07; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_REPEAT_START); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} buffer_i2c2[0]=M_CTRL_REG3; buffer_i2c2[1] = 0x08; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_REPEAT_START); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} buffer_i2c2[0]=M_CTRL_REG4; buffer_i2c2[1] = 0x04; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_REPEAT_START); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} buffer_i2c2[0]=M_CTRL_REG5; buffer_i2c2[1] = 0x04; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_REPEAT_START); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} buffer_i2c2[0]=M_FF_MT_CFG; buffer_i2c2[1] = 0x71; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_REPEAT_START); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} buffer_i2c2[0]=M_FF_MT_THS; buffer_i2c2[1] = 0x12; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_REPEAT_START); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} buffer_i2c2[0]=M_FF_MT_COUNT; buffer_i2c2[1] = 0x00; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_REPEAT_START); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} buffer_i2c2[0] = M_FF_MT_SRC; I2C_I2CMasterWriteBuf(MMA_ADDR、バッファデータ、1、I2C_I2C_MODE_REPEAT_START); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT) の場合); (void) I2C_I2CMasterReadBuf(MMA_ADDR, buffer_data, 1, \ I2C_I2C_MODE_COMPLETE_XFER); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_RD_CMPLT) の場合); buffer_i2c2[0]=M_CTRL_REG1; buffer_i2c2[1] = 0x21; I2C_I2CMasterWriteBuf(MMA_ADDR、buffer_i2c2、2、I2C_I2C_MODE_REPEAT_START); (0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT)) の場合 {} } 私はメインの割り込みもクリアしています。 MMA_intr == 1 の場合 { バッファデータ[0] = M_FF_MT_SRC; I2C_I2CMasterWriteBuf(MMA_ADDR、バッファデータ、1、I2C_I2C_MODE_COMPLETE_XFER); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_WR_CMPLT) の場合); (void) I2C_I2CMasterReadBuf(MMA_ADDR, buffer_data, 1, \ I2C_I2C_MODE_COMPLETE_XFER); 0u == (I2C_I2CMasterStatus() & I2C_I2C_MSTAT_RD_CMPLT) の場合); adxl_intr = 0; LED_YELLOW_書き込み(0u); } 助けてください。 シャリン Re: Interfacing MMA8653FCR1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
こんにちは、シャリンさん。 MMA565x モーション検出構成用のコード サンプルをいくつか用意しました。 //////////////////////////////////////////////////////////////////////////////// //! 定義する //////////////////////////////////////////////////////////////////////////////// #MMA8653FC_CTRL_REG1 0x2A を定義します #MMA8653FC_CTRL_REG2 0x2B を定義します #MMA8653FC_CTRL_REG3 0x2C を定義します #MMA8653FC_CTRL_REG4 0x2D を定義します #MMA8653FC_CTRL_REG5 0x2E を定義します #MMA8653FC_FF_MT_CFG 0x15 を定義します #MMA8653FC_FF_MT_SRC 0x16 を定義します #define MMA8653FC_FF_MT_THS 0x17 #MMA8653FC_FF_MT_COUNT 0x18 を定義します #MMA8653FC_WHO_AM_I 0x0D を定義します #MMA8653FC_WHO_AM_I_VAL 0x5A を定義します //////////////////////////////////////////////////////////////////////////////// //! パブリック方法 //////////////////////////////////////////////////////////////////////////////// ブール型 MMA8653FC::init() { ブール __b_result = false; uint8_t __u8_temp; if(bRead(MMA8653FC_WHO_AM_I,&__u8_temp,1)) //センサの存在を確認する if(__u8_temp == MMA8653FC_WHO_AM_I_VAL) //センサIDの回答を確認する if(bWrite(MMA8653FC_CTRL_REG1,0x00)) //スタンバイモード if(bWrite(MMA8653FC_CTRL_REG2,0x07)) //自動スリープ有効/低電力 if(bWrite(MMA8653FC_CTRL_REG3,0x08)) //モーション割り込みからのウェイク / アクティブロー / プッシュプル if(bWrite(MMA8653FC_CTRL_REG4,0x04)) //モーション割り込みを有効にする if(bWrite(MMA8653FC_CTRL_REG5,0x04)) //INT1で割り込み if(bWrite(MMA8653FC_FF_MT_CFG,0x71)) //イベントはラッチされていない/モーション/INT1でX/Y/Z検出を有効にする if(bWrite(MMA8653FC_FF_MT_THS,0x12)) //閾値を1.134gに設定する if(bWrite(MMA8653FC_FF_MT_COUNT,0x00)) //デバウンス回数を設定する if(bWrite(MMA8653FC_CTRL_REG1,0x21)) //ODRを200Hzに設定し、アクティブモードにする { __b_result = 真; } __b_result を返します。 } ブール型 MMA8653FC::clearINTflag() { uint8_t __u8_result; bRead(MMA8652FC_FF_MT_SRC,&__u8_result,1) を返します。 } ここで、モーションしきい値は 3 軸で 1.134g です。この値は変更できますが、注意してください: 地球の重力は 1g です。感度をさらに高めたい場合は、軸を無効にするか (MR_CFG レジスタ)、Transient&HighPassFilter 機能を備えた MMA8652 を使用する必要があります。 割り込み関数でモーションをキャッチするときは、必ず「clearINTflag()」関数を呼び出して INT フラグをクリアしてください。 例: void OnMotionDetected() { _t_led2 = 0; printf("動きが検出されました!\n"); 待機(0.1); _t_accelerometer.clearINTflag(); _t_led2 = 1; } int メイン() { _t_pc.ボー(115200); _t_it.fall(&OnMotionDetected); _t_pc.printf("こんにちは"); _t_it.enable_irq(); if(_t_accelerometer.init()) { while(true) { 寝る(); } } それ以外 { while(true) { 待つ(0.05); _t_led = !_t_led; 待つ(0.05); _t_led = !_t_led; 待つ(0.05); _t_led = !_t_led; 待つ(1); _t_led = !_t_led; } } } お役に立てれば幸いです! アンソニー Re: Interfacing MMA8653FCR1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
シャリン、 デバイスを構成するための特定の順序はありません。まず MMA をスタンバイ モードにして、すべてのレジスタを設定し、最後にアクティブ モードに切り替えるだけです。実際、レジスタの変更は、MMA がスタンバイ モードからアクティブ モードに移行したときに保存され、有効になります。 ステップ 注 REG 書き込む値 1 MMA8653FCR1 スタンバイモード CTRL_REG1 (0x2A) 0bXXXXXXX0 2 デバイスを構成する .. .. 3 MMA8653FCR1 アクティブモード CTRL_REG1 (0x2A) 0bXXXXXXX1 MMA8653 のモーション割り込みについては、確認する必要があります。私はMMA8652に慣れているので、ハイパスフィルタ機能付きの過渡検出を使えば簡単にモーション検出を有効にできます。残念ながら、MMA8653にはこの機能がないので、可能かどうか調べてみます。 モーション割り込みMMA8653の機能について見ていきます。あなたの側で進展があったら、私に知らせてください。 ありがとうございます アンソニー Re: Interfacing MMA8653FCR1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
こんにちは、アンソニー。 早急な返信ありがとうございます。 配線が間違っていましたが、現在はMMA8653と通信できます。 モーション割り込みを設定する方法を教えてください。データシートを読んでレジスタの動作を理解しましたが、MMA をアドレス指定する特定の順序はありますか (スタンバイ モード --> しきい値の設定 --> 割り込みソースの設定... など)。 ありがとうございます シャリン Re: Interfacing MMA8653FCR1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
こんにちは、シャリンさん。 I²C 通信が正常に動作していることを確認する必要があります。デバイス ID (0x5A) を含む WHO_AM_I レジスタ (0x0D) を読み取ることをお勧めします。0x5A が読み取れない場合は、I²C com (プルアップ抵抗がない、周波数が無効) または MMA に問題がある可能性があります。正しい値を読み取った場合、構成の問題である可能性があります。 デバイス ID を読み取って MMA と通信できるかどうかを教えてください。それを確かめたら、次のステップはモーション検出の設定を確認することです。 アンソニー
查看全文