426837_ja-JP

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

426837_ja-JP

426837_ja-JP

F_STATUSレジスタの異常な動作 FXOS8700C<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

こんにちは、

FXOS を FIFO モードで使用する場合、ウォーターマーク割り込みが設定されていると FIFO が読み取られます。私が見ている問題は、レジスタがウォーターマーク割り込み 0x54 を示しているものの、最初の 3 つのサンプル (0x01 - 0x06) を読み取った後、自動増分が 0x00 に戻り、今度は F_STATUS が 0xFF を読み取り、同じ読み取りで確認された他の値は 0x08、0x0D などであることです。

screenshot.pngデータの読み間違いでない限り、何かが間違っているようです。F_STATUS レジスタは最初の読み取り後には何も判読できず、XYZ 軸のデータは 0g、0g、1g になるはずですが、代わりに次のデータが表示されています。

X - 0x0000、0xF8FF...

Y - 0xFFBC、0xE40F...

Z - 0x0FA0、0xC400...

そのうち最初の値だけが意味を成します。この問題に関してご助力いただければ幸いです。

よろしくお願いします。

K

加速度センサ磁気センサRe: Odd behaviour with F_STATUS register FXOS8700C<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

こんにちは、カスさん。

別のThreadの私の回答を参照してください - FXOS8700データは非常にノイズが多いようです

よろしくお願いいたします。

トーマス

Re: Odd behaviour with F_STATUS register FXOS8700C<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

こんにちは、トーマス。

私は mbed を使用してコードを書いています。要求に応じて、すべてのコードを以下に含めました。

ありがたいことに

カス

#include "mbed.h"

#include "SDFileSystem.h"

//FXOS8700CQ

#FXOS_ADDRESS_W 0x3C を定義します

#FXOS_ADDRESS_R 0x3D を定義します

#FXOS_STATUS 0x00 を定義します

#FXOS_OUT_X_MSB 0x01 を定義する

#FXOS_F_SETUP 0x09 を定義します

#FXOS_TRIG_CFG 0x0A を定義します

#FXOS_SYS_MOD 0x0B を定義します

#FXOS_INT_SOURCE 0x0C を定義します

#FXOS_WHO_AM_I 0x0D を定義します

#FXOS_ID 0xC7 を定義する

#FXOS_XYZ_DATA_CFG 0x0E を定義します

#FXOS_TRANSIENT_CFG 0x1D を定義します

#FXOS_TRANSIENT_SRC 0x1E を定義します

#FXOS_ASLP_COUNT 0x29 を定義します

#FXOS_CTRL_REG_1 0x2A を定義します

#FXOS_CTRL_REG_2 0x2B を定義します

#FXOS_CTRL_REG_3 0x2C を定義します

#FXOS_CTRL_REG_4 0x2D を定義します

#FXOS_CTRL_REG_5 0x2E を定義します

#FXOS_OFF_X 0x2F を定義します

#FXOS_OFF_Y 0x30 を定義します

#定義 FXOS_OFF_Z 0x31

#FXOS_TEMP 0x51 を定義します

#FXOS_M_CTRL_REG_1 0x5B を定義します

#FXOS_M_CTRL_REG_2 0x5C を定義します

#FXOS_M_CTRL_REG_3 0x5D を定義します

//FXAS21002C

#FXAS_ADDRESS_W 0x40 を定義する

#FXAS_ADDRESS_R 0x41 を定義します

#FXAS_STATUS 0x00 を定義する

#FXAS_OUT_X_MSB 0x01 を定義する

#FXAS_F_SETUP 0x09 を定義します

#FXAS_F_EVENT 0x0A を定義します

#FXAS_INT_SRC_FLAG 0x0B を定義します

#FXAS_WHO_AM_I 0x0C を定義します

#FXAS_ID 0xD7 を定義する

#FXAS_CTRL_REG_0 0x0D を定義します

#FXAS_RT_CFG 0x0E を定義します

#FXAS_TEMP 0x12 を定義する

#FXAS_CTRL_REG_1 0x13 を定義します

#FXAS_CTRL_REG_2 0x14 を定義する

#FXAS_CTRL_REG_3 0x15 を定義する

//グローバル変数

FXAS_FIFO_FULL_FLAG を 0 に設定します。

FXOS_FIFO_FULL_FLAG を 0 に設定します。

char fxos_data_1[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0、 ...

char fxas_data_1[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、 0、0、0、0、 0、 ...

//PCへのUARTの設定

シリアルPC(USBTX、USBRX)

//I2Cのセットアップ

I2Cセンサ(PTE0、PTE1)

//FXOS8700C 制御ピン

割り込みfxos_int1_8700(PTD4); //INT1-8700

割り込みfxos_int2_8700(PTA4); //INT2-8700

//FXAS21002C 制御ピン

割り込みfxas_int1_21002(PTA5); //INT1-21002

割り込みfxas_int2_21002(PTA13); //INT2-21002

//SDファイルシステム

SDファイルシステムsd(PTD2、PTD3、PTD1、PTD0、"sd");

////LEDセットアップ

DigitalOut led_1(LED1, 1); //赤

DigitalOut led_2(LED2, 1); //緑

//DigitalOut led_3(LED3, 1); //blue <- 注意!! SDFileSystem ではうまく動作しません

//********************************************************************//

//関数

int i2c_write(char アドレス, char デバイスレジスタ, char データ){

センサを起動します。

センサ.write((char)address);

センサ.write((char)device_register);

センサ.write((char)data);

センサ.stop();

0を返します。

}

int i2c_write(char アドレス, char デバイスレジスタ, int 停止){

センサを起動します。

センサ.write((char)address);

センサ.write((char)device_register);

if(stop == 1){

センサ.stop();

    }

0を返します。

}

char i2c_read(char アドレス, char デバイスレジスタ){

文字データ;

   

センサを起動します。

センサ.write(アドレス);

センサ.write(デバイスレジスタ);

センサを起動します。

センサ.write(アドレス| 0x01);

データ = (char)センサ.read(0);

センサ.stop();

データを返します。

}

int i2c_write_verify(char アドレス, char デバイスレジスタ, char データ){

char 戻りデータ;

戻り値:

   

センサを起動します。

センサ.write((char)address);

センサ.write((char)device_register);

センサ.write((char)data);

センサ.stop();

   

センサを起動します。

センサ.write(アドレス);

センサ.write(デバイスレジスタ);

センサを起動します。

センサ.write(アドレス| 0x01);

return_data = センサ.read(0);

センサ.stop();

   

if (return_data == data){

戻り値 = 0;

    }

それ以外{

戻り値 = -1;

    }

return_val を返します。

}

int fxas_init() {

戻り値 = 0;

整数センサーID = 0;


センサーID = i2c_read(FXAS_ADDRESS_W、FXAS_WHO_AM_I);

// pc.printf("期待されるFXAS21002C からの ID は 0xD7 です\n\r");

// pc.printf("返された値: %X\n\n\r", sensor_id);

   

(センサーID == FXAS_ID)の場合{

戻り値 = 0;

return_val += i2c_write_verify(FXAS_ADDRESS_W、FXAS_CTRL_REG_1、0x00);

return_val += i2c_write_verify(FXAS_ADDRESS_W、FXAS_F_SETUP、0x00);

return_val += i2c_write_verify(FXAS_ADDRESS_W、FXAS_F_SETUP、0x54);

return_val += i2c_write_verify(FXAS_ADDRESS_W、FXAS_CTRL_REG_0、0x03);

       

return_val += i2c_write_verify(FXAS_ADDRESS_W、FXAS_CTRL_REG_2、0xC2);

return_val += i2c_write_verify(FXAS_ADDRESS_W、FXAS_CTRL_REG_3、0x00);

return_val += i2c_write_verify(FXAS_ADDRESS_W、FXAS_CTRL_REG_1、0x13);

    }

それ以外{

戻り値 = -1;

}

return_val を返します。

}

   

int fxos_init() {

戻り値 = 0;

整数センサーID = 0;

    

センサーID = i2c_read(FXOS_ADDRESS_W、FXOS_WHO_AM_I);

// pc.printf("期待されるFXOS8700CQからのIDは0xC7です\n\r");

// pc.printf("返された値: %X\n\n\r", sensor_id);

   

(センサーID == FXOS_ID)の場合{

戻り値 = 0;

return_val += i2c_write_verify(FXOS_ADDRESS_W、FXOS_CTRL_REG_1、0x00);

return_val += i2c_write_verify(FXOS_ADDRESS_W、FXOS_F_SETUP、0x00);

return_val += i2c_write_verify(FXOS_ADDRESS_W、FXOS_F_SETUP、0x54);

return_val += i2c_write_verify(FXOS_ADDRESS_W、FXOS_ASLP_COUNT、0xFF);

return_val += i2c_write_verify(FXOS_ADDRESS_W、FXOS_XYZ_DATA_CFG、0x02);

return_val += i2c_write_verify(FXOS_ADDRESS_W、FXOS_CTRL_REG_2、0x00);

return_val += i2c_write_verify(FXOS_ADDRESS_W、FXOS_CTRL_REG_3、0x02);

return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_CTRL_REG_4, 0x41); //FIFOとDRDY割り込みを有効にする

return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_CTRL_REG_5, 0x40); //FIFO -> Int_1、DRDY -> Imt_2

return_val += i2c_write_verify(FXOS_ADDRESS_W、FXOS_M_CTRL_REG_1、0x00);

return_val += i2c_write_verify(FXOS_ADDRESS_W、FXOS_CTRL_REG_1、0x21);

    }

それ以外{

戻り値 = -1;

    }

return_val を返します。

}

//FXAS21002 INT_1 の割り込み

void read_fxas_data(){

// //FXAS21002センサからデータを読み取る

FXAS_FIFO_FULL_FLAG != 2 の場合{

FXAS_FIFO_FULL_FLAG = 1;

    }

}

//FXOS8700S INT_1の割り込み

void read_fxos_data(){

//FXOS8700Cセンサからデータを読み取る

FXOS_FIFO_FULL_FLAG != 2 の場合{

FXOS_FIFO_FULL_FLAG = 1;

    }

}

int main() {

int 初期化 = 0;

整数インデックス = 0;

整数テストインデックス = 0;

int fxos_data_flag_1 = 0;

int fxas_data_flag_1 = 0;

   

//割り込みを設定する

fxas_int1_21002.rise(&read_fxas_data);//FIFO -> Int_1

// fxas_int2_21002.rise(&read_fxas_data);//DRDY -> Int_2

fxos_int1_8700.rise(&read_fxos_data);//FIFO -> Int_1

// fxos_int2_8700.rise(&read_fxos_data);//DRDY-> 整数2

   

センサ.周波数(450000);

pc.ボー(115200);

mkdir("/sd/sensor_data", 0777);

ファイル *fp = fopen("/sd/sensor_data/data.txt","w");

if(fp == NULL) {

error("書き込み用にファイルを開けませんでした\n");

    }

fprintf(fp, "ジャイロ X,\tジャイロ Y,\tジャイロ Z,\t\tAcc X,\tACC Y,\tACC Z\n\r\n\r\n\r\n\r");

fclose(fp);

   

//FXOS8700CQ加速度計とFXAS21002Cジャイロスコープを初期化する

初期化 = fxas_init() & fxos_init();

// pc.printf("返された値: %d\n\n\r", 初期化済み);


while(1) {

(FXOS_FIFO_FULL_FLAG == 1)の場合{//0.976mg* (fxos_data >> 2) = 合計g力(8gスケール)

FXOS_FIFO_FULL_FLAG = 0;

i2c_write(FXOS_ADDRESS_W, FXOS_STATUS, 0);

センサ.read(FXOS_ADDRESS_R, fxos_data_1, 139, false);// パスごとにステータスレジスタを読み取ります 0x06 -> 0x00

fxos_data_flag_1 = 1;

        }

       

(FXAS_FIFO_FULL_FLAG == 1)の場合{//7.8125mdps* fxas_data = 1秒あたりの総度数(250dpsスケール)

FXAS_FIFO_FULL_FLAG = 0;

i2c_write(FXAS_ADDRESS_W, FXAS_STATUS, 0);

センサ.read(FXAS_ADDRESS_R, fxas_data_1, 139, false);// ステータスレジスタを最初に読み取ります。それ以外の場合は 0x06 -> 0x01 です。

fxas_data_flag_1 = 1;

        }

       

       

if ((fxos_data_flag_1 == 1) && (fxas_data_flag_1 == 1)){

//SDカードにデータを保存する

if (test_index == 0){// <--------- 適切なファイルクローズシステムが実装されるまで

fp = fopen("/sd/sensor_data/data.txt",「あ」);

if(fp == NULL) {

error("書き込み用にファイルを開けませんでした\n");

}

            }

           

(インデックス = 0; インデックス < 139; インデックス += 7){

//データをSDカードに移動する

fprintf(fp, " %d\t% d\t%d\t\t", ((int16_t)((fxos_data_1[(インデックス + 1)] << | fxos_data_1[(インデックス + 2)]) >> 2),

((int16_t)((fxos_data_1[(インデックス + 3)] << | fxos_data_1[(インデックス + 4)]) >> 2)、

((int16_t)((fxos_data_1[(インデックス + 5)] << | fxos_data_1[(インデックス + 6)]) >> 2));

                   

fprintf(fp, " %d\t% d\t%d\n\r\n\r", ((int16_t)((fxas_data_1[(インデックス + 1)] << | fxas_data_1[(インデックス + 2)])),

((int16_t)((fxas_data_1[(インデックス + 3)] << | fxas_data_1[(インデックス + 4)])),

((int16_t)((fxas_data_1[(インデックス + 5)] << | fxas_data_1[(インデックス + 6)])));

            }

           

fxos_data_flag_1 = 0;

fxas_data_flag_1 = 0;

テストインデックス++;

// fprintf(fp, "\n\r\n\r\n\r\n\r\n\r\n\r");

if (test_index == 30){// <--------- 適切なファイルクローズシステムが実装されるまで

fclose(fp);

テストインデックス = 0;;

            }

(int i = 0; i < 139; i++){

fxos_data_1[i] = 0;

fxas_data_1[i] = 0;

            }

}

Re: Odd behaviour with F_STATUS register FXOS8700C<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

こんにちは、カスさん。

ソースコード全体をここに投稿していただき、確認して設定を再現していただけますでしょうか?

その間、いくつかのコード例を含むAN4073をご覧になることをお勧めします。

よろしくお願いいたします。

トーマス

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