430623_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

430623_ja-JP

430623_ja-JP

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 通信は次のルールに従う必要があります。

i2c2.PNG

残念ながら、書き込み操作の最後に停止条件を追加する I2C_MODE_COMPLETE_XFER を使用しています...

i2c.PNG

最初の転送 (読み取り操作) にはおそらく 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 がスタンバイ モードからアクティブ モードに移行したときに保存され、有効になります。

Capture.PNG

ステップREG書き込む値
1MMA8653FCR1 スタンバイモードCTRL_REG1 (0x2A) 0bXXXXXXX0
2デバイスを構成する ....
3MMA8653FCR1 アクティブモードCTRL_REG1 (0x2A)0bXXXXXXX1

MMA8653 のモーション割り込みについては、確認する必要があります。私はMMA8652に慣れているので、ハイパスフィルタ機能付きの過渡検出を使えば簡単にモーション検出を有効にできます。残念ながら、MMA8653にはこの機能がないので、可能かどうか調べてみます。

differences.PNG

モーション割り込み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 と通信できるかどうかを教えてください。それを確かめたら、次のステップはモーション検出の設定を確認することです。

アンソニー

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎02-04-2026 08:56 AM
更新者: