こんにちは、
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
こんにちは、カスさん。
別のThreadの私の回答を参照してください - FXOS8700データは非常にノイズが多いようです
よろしくお願いいたします。
トーマス
こんにちは、トーマス。
私は 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;
}
}
こんにちは、カスさん。
ソースコード全体をここに投稿していただき、確認して設定を再現していただけますでしょうか?
その間、いくつかのコード例を含むAN4073をご覧になることをお勧めします。
よろしくお願いいたします。
トーマス