2024-09-16 01:54 PM
Hi, in my application I intend to use the LSM6DSV16X in order to store accelerometer, gyroscope, SFLP and QVar data, all at the same time.
I am able to get XL, G and SFLP data from the FIFO on INT1 correctly, and now I want to also record QVar data.
Based off of the example provided here: https://github.com/STMicroelectronics/STMems_Standard_C_drivers/blob/master/lsm6dsv16x_STdC/examples/lsm6dsv16x_qvar_read_data_polling.c , I was able to get QVar data alone by routing it to the INT2 pin, however when I also enable the FIFO, I don't receive the data ready interrupts anymore.
Is there an incompatibility between these functions that I missed by reading the datasheet ?
Here is the code that I am using to set up the sensor (the commented out section are the commands that prevent QVar data from getting output):
int lsm6dsv16x_start_acquisition(bool enable_gbias)
{
lsm6dsv16x_pin_int_route_t pin1_int;
lsm6dsv16x_pin_int_route_t pin2_int;
lsm6dsv16x_fifo_sflp_raw_t fifo_sflp;
lsm6dsv16x_filt_settling_mask_t filt_settling_mask;
int ret;
/* Enable Block Data Update */
ret = lsm6dsv16x_block_data_update_set(&sensor.dev_ctx, PROPERTY_ENABLE);
if (ret) {
LOG_ERR("lsm6dsv16x_block_data_update_set (%i)", ret);
}
/* Set full scale */
ret = lsm6dsv16x_xl_full_scale_set(&sensor.dev_ctx, LSM6DSV16X_2g);
if (ret) {
LOG_ERR("lsm6dsv16x_xl_full_scale_set (%i)", ret);
}
ret = lsm6dsv16x_gy_full_scale_set(&sensor.dev_ctx, LSM6DSV16X_2000dps);
if (ret) {
LOG_ERR("lsm6dsv16x_gy_full_scale_set (%i)", ret);
}
/*
* Set FIFO watermark (number of unread sensor data TAG + 6 bytes
* stored in FIFO) to FIFO_WATERMARK samples
*/
ret = lsm6dsv16x_fifo_watermark_set(&sensor.dev_ctx, FIFO_WATERMARK);
if (ret) {
LOG_ERR("lsm6dsv16x_fifo_watermark_set (%i)", ret);
}
/* Set FIFO batch XL/Gyro ODR to 60Hz */
ret = lsm6dsv16x_fifo_xl_batch_set(&sensor.dev_ctx, LSM6DSV16X_XL_BATCHED_AT_60Hz);
if (ret) {
LOG_ERR("lsm6dsv16x_fifo_xl_batch_set (%i)", ret);
}
ret = lsm6dsv16x_fifo_gy_batch_set(&sensor.dev_ctx, LSM6DSV16X_GY_BATCHED_AT_60Hz);
if (ret) {
LOG_ERR("lsm6dsv16x_fifo_gy_batch_set (%i)", ret);
}
/* Set FIFO mode to Stream mode (aka Continuous Mode) */
/*
ret = lsm6dsv16x_fifo_mode_set(&sensor.dev_ctx, LSM6DSV16X_STREAM_MODE);
if (ret) {
LOG_ERR("lsm6dsv16x_fifo_mode_set (%i)", ret);
}
pin1_int.fifo_th = PROPERTY_ENABLE;
ret = lsm6dsv16x_pin_int1_route_set(&sensor.dev_ctx, &pin1_int);
if (ret) {
LOG_ERR("lsm6dsv16x_pin_int1_route_set (%i)", ret);
}
*/
/* Set Output Data Rate */
ret = lsm6dsv16x_xl_data_rate_set(&sensor.dev_ctx, LSM6DSV16X_ODR_AT_960Hz);
if (ret) {
LOG_ERR("lsm6dsv16x_xl_data_rate_set (%i)", ret);
}
ret = lsm6dsv16x_gy_data_rate_set(&sensor.dev_ctx, LSM6DSV16X_ODR_AT_960Hz);
if (ret) {
LOG_ERR("lsm6dsv16x_gy_data_rate_set (%i)", ret);
}
/* Mask accelerometer and gyroscope data until the settling of the sensors filter is completed */
filt_settling_mask.drdy = PROPERTY_ENABLE;
filt_settling_mask.irq_xl = PROPERTY_ENABLE;
filt_settling_mask.irq_g = PROPERTY_ENABLE;
ret = lsm6dsv16x_filt_settling_mask_set(&sensor.dev_ctx, filt_settling_mask);
if (ret) {
LOG_ERR("lsm6dsv16x_filt_settling_mask_set (%i)", ret);
}
lsm6dsv16x_filt_xl_lp2_set(&sensor.dev_ctx, PROPERTY_ENABLE);
lsm6dsv16x_filt_xl_lp2_bandwidth_set(&sensor.dev_ctx, LSM6DSV16X_XL_STRONG);
qvar_mode.ah_qvar_en = 1;
ret = lsm6dsv16x_ah_qvar_mode_set(&sensor.dev_ctx, qvar_mode);
if (ret) {
LOG_ERR("lsm6dsv16x_ah_qvar_mode_set (%i)", ret);
}
pin2_int.drdy_ah_qvar = PROPERTY_ENABLE;
ret = lsm6dsv16x_pin_int2_route_set(&sensor.dev_ctx, &pin2_int);
if (ret) {
LOG_ERR("lsm6dsv16x_pin_int2_route_set (%i)", ret);
}
return 0;
}
As a side question, I saw that the LSM6DSV16BX sensor is capable of outputting the QVar data in FIFO. What are the differences between the two versions LSM6DSV16X/LSM6DSV16BX ? I will look into that component's datasheet to see if I can find some, but it would be a nice help :)
Thanks in advance for your help
Nicolas Goualard
Solved! Go to Solution.
2024-09-28 02:52 AM
The structures related to int1, int2, sflp and settling mask were not initialized, so random values could be present. When I initialized these structures to 0, it worked fine.
2024-09-28 02:52 AM
The structures related to int1, int2, sflp and settling mask were not initialized, so random values could be present. When I initialized these structures to 0, it worked fine.