温度、圧力、高度を測定するために MPL3115A2 (M3PR YI0C) を使用します。定期的に高度計モードを気圧計モードに、またその逆に変更します。次のような問題が発生しました: しばらく操作すると、STATUS レジスタ (0x00) の更新が停止し、常に 0x00 になります。高度/気圧と温度のレジスタ (0x01 - 0x05) はゼロに設定されます。構成レジスタを読み取ると、MPL3115A2 が正しく構成されていることが示されます。
以下はクラッシュ前の単一測定におけるレジスタの例です。
ステータス: 0x0e
出力P_MSB: 0x61
OUT_P_CSB: 0xa0
OUT_P_LSB: 0xd0
OUT_T_MSB: 0x1a
OUT_T_LSB: 0x50
SYSMOD: 0x01
INT_SOURCE: 0x00
PT_DATA_CFG: 0x07
CTRL_REG1: 0x39
CTRL_REG2: 0x00
CTRL_REG3: 0x00
CTRL_REG4: 0x00
CTRL_REG5: 0x00
最初に失敗した測定は次のとおりです。
ステータス: 0x00
出力P_MSB: 0x61
OUT_P_CSB: 0xa0
OUT_P_LSB: 0xd0
OUT_T_MSB: 0x1a
OUT_T_LSB: 0x50
SYSMOD: 0x01
INT_SOURCE: 0x00
PT_DATA_CFG: 0x07
CTRL_REG1: 0x39
CTRL_REG2: 0x00
CTRL_REG3: 0x00
CTRL_REG4: 0x00
CTRL_REG5: 0x00
以下は、モードの切り替えを試みたものの失敗した測定 10 件です。
ステータス: 0x00
出力P_MSB: 0x00
OUT_P_CSB: 0x00
OUT_P_LSB: 0x00
OUT_T_MSB: 0x00
OUT_T_LSB: 0x00
SYSMOD: 0x01
INT_SOURCE: 0x00
PT_DATA_CFG: 0x07
CTRL_REG1: 0xb9
CTRL_REG2: 0x00
CTRL_REG3: 0x00
CTRL_REG4: 0x00
CTRL_REG5: 0x00
この問題は、割り込みを使用する場合とポーリングを使用する場合の両方で発生します。MPL3115A2 を通常の動作に戻す唯一の方法は、ソフトウェアを再起動することです。何が問題なのでしょうか?
(翻訳してすみません)
私たちもこの問題に遭遇しました。徹底的なテストを行った結果、問題を解決することはできませんでしたが、回避策を見つけました。それは、初期化ルーチンでデバイスを「ソフトウェア リセット」(データシートで RST を検索)することでした。
mpl3115a2_write(MPL3115A2_CTRL_REG1,0b00000100);
これがお役に立てば幸いです。
TrackerSense サポート
こんにちは、アレクサンダー。
ソースコードを確認しましたが、あなたが言及している問題を引き起こす可能性のあるものは何も見つかりませんでした。
問題の原因が見つかったかどうか教えていただけますか?もしそうなら、シェアしていただけますか?
そうでない場合は、コミュニティで言及されている詳細情報があればお知らせください。
よろしくお願いいたします。
ホセ
シェアしてくれてありがとう、アレクサンダー。
あなたのソースコードをざっと見てみました。特に問題は見つかりませんでした。時間があれば詳しく確認してみます。誰かが答えを知っているなら、遠慮なく返信してください。
ありがとうございます
アンソニー
こんにちは、アンソニー!
回答ありがとうございます!
MPL3115A2 には独自のドライバを使用します。添付のドライバのソースコード。
それで私はそれを使います:
//
// ...
//
mpl3115a2_init( &mpl3115a2 );
mpl3115a2_set_pwrmode( &mpl3115a2, MPL3115A2_PWRMODE_STANDBY );
mpl3115a2_set_ready_mode(
&mpl3115a2,
MPL3115A2_READY_MODE_POLLING );
mpl3115a2_set_mode(
&mpl3115a2,
MPL3115A2_MODE_ALTIMETER、
MPL3115A2_OSR_128 );
mpl3115a2_set_pt(
&mpl3115a2,
MPL3115A2_PT_DREM |
MPL3115A2_PT_PDEFE |
MPL3115A2_PT_TDEFE );
mpl3115a2_set_pwrmode( &mpl3115a2, MPL3115A2_PWRMODE_ACTIVE );
//
// ...
//
(1)の間 {
//
// ...
//
dev_res = mpl3115a2_update( &mpl3115a2 );
dev_res = mpl3115a2_get_h( &mpl3115a2, &data->alt, NULL );
dev_res = mpl3115a2_get_t( &mpl3115a2, &data->temp, &data->temp_l );
dev_res = mpl3115a2_get_p( &mpl3115a2, &data->ph, &data->pl );
//
// ...
//
// ('mode_change' のタイマーカウンタ値の増分)
if ( mode_change >= 50 ) {
if ( mpl3115a2.mode == MPL3115A2_MODE_ALTIMETER ) {
mpl3115a2_set_pwrmode( &mpl3115a2, MPL3115A2_PWRMODE_STANDBY );
mpl3115a2_set_mode( &mpl3115a2, MPL3115A2_MODE_BAROMETER, MPL3115A2_OSR_128 );
mpl3115a2_set_pwrmode( &mpl3115a2, MPL3115A2_PWRMODE_ACTIVE );
}
それ以外 {
mpl3115a2_set_pwrmode( &mpl3115a2, MPL3115A2_PWRMODE_STANDBY );
mpl3115a2_set_mode( &mpl3115a2, MPL3115A2_MODE_ALTIMETER, MPL3115A2_OSR_128 );
mpl3115a2_set_pwrmode( &mpl3115a2, MPL3115A2_PWRMODE_ACTIVE );
}
モード変更 = 0;
}
//
// ...
//
// そして 1 - 2 秒でスリープします...
//
//...
//失敗後に復元
#MPL3115A2_DEBUGの場合
if ( mpl3115a2_get_fail_count( &mpl3115a2 ) > 11 ) {
mpl3115a2_reset(&mpl3115a2);
mpl3115a2_set_pt(
&mpl3115a2,
MPL3115A2_PT_DREM |
MPL3115A2_PT_PDEFE |
MPL3115A2_PT_TDEFE );
mpl3115a2_set_pwrmode( &mpl3115a2, MPL3115A2_PWRMODE_ACTIVE );
mpl3115a2_fail_count_clear(&mpl3115a2);
}
#endif
}
こんにちは、アレクサンダー。
質問に答えられるか分かりませんが、モードを切り替える前に MPL3115A2 をスタンバイ モードにしましたか?それは問題になるかもしれません。
コードを共有していただけますか?設定を確認したいと思います。
よろしくお願いします。
アンソニー