こんにちは、
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 //モーション割り込みを有効にする
9) CTRL_REG1 = 0x01 // MMA アクティブ。
上記のコードを試してみましたが、コントローラの I2C ライブラリは正常に動作しています。しかし、MMAは反応しない。
誰か役に立つリンクまたはサンプルコードを提供してもらえますか。
ありがとうございます
シャリン
シャリン、
問題は読み取り機能にあるはずです。
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側のあなたの仕事だと思います。
読み取り機能を正しく動作させても、モーション検出/構成に問題がある場合は私に連絡してください。
アンソニー
シャリン、
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) の場合);
戻り値;
}
ありがとうございます
アンソニー
こんにちは、アンソニー。
上記のご助力に心より感謝いたします。
しかし、いくつかの問題に直面しています。
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);
}
助けてください。
シャリン
こんにちは、シャリンさん。
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;
}
}
}
お役に立てれば幸いです!
アンソニー
シャリン、
デバイスを構成するための特定の順序はありません。まず MMA をスタンバイ モードにして、すべてのレジスタを設定し、最後にアクティブ モードに切り替えるだけです。実際、レジスタの変更は、MMA がスタンバイ モードからアクティブ モードに移行したときに保存され、有効になります。
| ステップ | 注 | REG | 書き込む値 |
|---|---|---|---|
| 1 | MMA8653FCR1 スタンバイモード | CTRL_REG1 (0x2A) | 0bXXXXXXX0 |
| 2 | デバイスを構成する | .. | .. |
| 3 | MMA8653FCR1 アクティブモード | CTRL_REG1 (0x2A) | 0bXXXXXXX1 |
MMA8653 のモーション割り込みについては、確認する必要があります。私はMMA8652に慣れているので、ハイパスフィルタ機能付きの過渡検出を使えば簡単にモーション検出を有効にできます。残念ながら、MMA8653にはこの機能がないので、可能かどうか調べてみます。
モーション割り込みMMA8653の機能について見ていきます。あなたの側で進展があったら、私に知らせてください。
ありがとうございます
アンソニー
こんにちは、アンソニー。
早急な返信ありがとうございます。
配線が間違っていましたが、現在はMMA8653と通信できます。
モーション割り込みを設定する方法を教えてください。データシートを読んでレジスタの動作を理解しましたが、MMA をアドレス指定する特定の順序はありますか (スタンバイ モード --> しきい値の設定 --> 割り込みソースの設定... など)。
ありがとうございます
シャリン
こんにちは、シャリンさん。
I²C 通信が正常に動作していることを確認する必要があります。デバイス ID (0x5A) を含む WHO_AM_I レジスタ (0x0D) を読み取ることをお勧めします。0x5A が読み取れない場合は、I²C com (プルアップ抵抗がない、周波数が無効) または MMA に問題がある可能性があります。正しい値を読み取った場合、構成の問題である可能性があります。
デバイス ID を読み取って MMA と通信できるかどうかを教えてください。それを確かめたら、次のステップはモーション検出の設定を確認することです。
アンソニー