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 などであることです。 データの読み間違いでない限り、何かが間違っているようです。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をご覧になることをお勧めします。 よろしくお願いいたします。 トーマス
查看全文