|
STM32驱动LSM6DSL,读FIFO数据一直为0
[复制链接]
我用STM32 SPI驱动LSM6DSL读取加速度计和陀螺仪数据
如果不使用FIFO,用其输出源寄存器 OUTX_L_G OUTX_H_G等等 读取的数据没有问题的
配置如下
- uint8_t whoami,rst;
- memset(&md_cfg,0,sizeof(md_cfg));
- memset(&int1_ctrl,0,sizeof(int1_ctrl));
-
- lsm6dsl_ctx.read_reg = mt_Spi_Read;
- lsm6dsl_ctx.write_reg = mt_Spi_Write;
- lsm6dsl_device_id(&lsm6dsl_ctx, &whoami);
- if ( whoami != LSM6DSL_ID )
- {
- while(1)
- {
- printf("lsm6dsl not found\n");
- Delay_ms(500);
- }
- }
- printf("detect lsm6dsl success Device ID = %02x\n",whoami);
- lsm6dsl_reset_set(&lsm6dsl_ctx, PROPERTY_ENABLE);//复位--恢复默认配置
- do
- {
- lsm6dsl_reset_get(&lsm6dsl_ctx, &rst);
- } while (rst);
- //正常读配置
- lsm6dsl_xl_full_scale_set(&lsm6dsl_ctx, FS_8g);//配置加速度满量程
- lsm6dsl_gyro_full_scale_set(&lsm6dsl_ctx, FS_2000dps);//配置角速度满量程
- lsm6dsl_block_data_update_set(&lsm6dsl_ctx, PROPERTY_ENABLE);//使能BDU 即读完后才更新数据
- lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, XL_1kHz66Hz);//设置ODR 并开启加速度计
- lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, GY_1kHz66Hz);//设置ODR 并开启陀螺仪
复制代码
但是我用FIFO定时去读取,读出来的数据一直是零,包括FIFO_DIFF_[10:0] FIFO中未读数据的个数也是零
感觉就是FIFO没有起来,但是过了几秒钟。通过读FIFO_SMART_FULL FIFO就要满了,奇怪的是次数FIFO中的未读数据还是零
FIFO配置如下:
- uint8_t whoami,rst;
-
- memset(&md_cfg,0,sizeof(md_cfg));
- memset(&int1_ctrl,0,sizeof(int1_ctrl));
-
- lsm6dsl_ctx.read_reg = mt_Spi_Read;
- lsm6dsl_ctx.write_reg = mt_Spi_Write;
- lsm6dsl_device_id(&lsm6dsl_ctx, &whoami);
- if ( whoami != LSM6DSL_ID )
- {
- while(1)
- {
- printf("lsm6dsl not found\n");
- Delay_ms(500);
- }
- }
- printf("detect lsm6dsl success Device ID = %02x\n",whoami);
- lsm6dsl_reset_set(&lsm6dsl_ctx, PROPERTY_ENABLE);//复位--恢复默认配置
- do
- {
- lsm6dsl_reset_get(&lsm6dsl_ctx, &rst);
- } while (rst);
-
-
-
- //配置FIFO
- lsm6dsl_fifo_mode_set(&lsm6dsl_ctx,BYPASS);
-
- lsm6dsl_block_data_update_set(&lsm6dsl_ctx, PROPERTY_ENABLE);//使能BDU
-
- //IF_INC=1(CTRL3_C)
- lsm6dsl_auto_increment_set(&lsm6dsl_ctx,PROPERTY_ENABLE);//使能IF_INC
-
- //rounding gyro+xl
- lsm6dsl_rounding_mode_set(&lsm6dsl_ctx,GYRO_XL);
-
-
- //设置FIFO触发 FIFO ODR和DEC
- //1.有效数据信号用于写FIFO当XL/Gyro数据准备或者步数检测 DATA_VALID_SEL_FIFO=0
- lsm6dsl_fifo_data_valid_set(&lsm6dsl_ctx,XL_GY_DRDY_STEP_DETECT);
- //2.使能写FIFO基于XL/Gyro数据准备 TIMER_PEDO_FIFO_DRDY
- lsm6dsl_fifo_write_mode_set(&lsm6dsl_ctx,ON_DRDY);
-
-
- //2.设置FIFO ODR F(ODR) = min(max(ODR_XL,ODR_G),ODR_FIFO)
- lsm6dsl_fifo_data_rate_set(&lsm6dsl_ctx,FIFO_52Hz);
- //3.FIFO_CTRL3和FIFO_CTRL4--DEC 每一笔数据都将存储FIFO
- lsm6dsl_xl_decimation_set(&lsm6dsl_ctx,XL_NO_DEC);
- lsm6dsl_gyro_decimation_set(&lsm6dsl_ctx,GY_NO_DEC);
-
- //FIFO深度不受阈值影响
- lsm6dsl_fifo_stop_on_thr_set(&lsm6dsl_ctx,PROPERTY_DISABLE);
-
- //2.FIFO_CTRL5--FIFO_ODR 设置FIFO_ODR=52HZ
- lsm6dsl_xl_full_scale_set(&lsm6dsl_ctx, FS_8g);//配置加速度满量程
- lsm6dsl_gyro_full_scale_set(&lsm6dsl_ctx, FS_2000dps);//配置角速度满量程
- lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, XL_52Hz);//设置ODR 并开启加速度计
- lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, GY_52Hz);//设置ODR 并开启陀螺仪
-
- //3.FIFO_CTRL5--FIFO MODE 设置FIFO MODE 为当FIFO满时停止放入数据
- lsm6dsl_fifo_mode_set(&lsm6dsl_ctx,CONTINUOS);
复制代码
求大神指导下,为何FIFO起不来,看了ST的LSM6DSL应用笔记,试了很多次 不知道为何FIFO读出来的数据总是零,包括FIFO中的未读数据FIFO_DIFF[10:0]也是零 很奇怪。。。
|
|