2023-12-10 10:43 AM
Greetings
I am trying to read from the FIFO of the LIS2DW12. What confuses me, is that reading through the datasheet, there are only registers which indicate the number of unread samples in the FIFO (FIFO_SAMPLES (2Fh)), and a control register FIFO_CTRL (2Eh). What I am expecting, are dedicated registers from the conventional OUTPUT registers which a device like the LSM6DSOX has.
The LIS2DW12 does not possess such registers, thus what address do I do a read from, that will be able to provide the 32 samples it is able to hold in its FIFO? Will it be the conventional OUTPUT registers?
Any help would be appreciated.
Thank you.
Solved! Go to Solution.
2023-12-14 06:27 AM
Hi @ZAIDS-S23 ,
Welcome to st community :)
You need to configure the FIFO settings using the FIFO_CTRL (2Eh) register, then use the FIFO_SAMPLES (2Fh) register to know the number of unread samples and finally perform sequential reads from the accelerometer's output registers to access FIFO data. There aren't specific registers for direct FIFO data access; you'll read data continuously from the output registers to retrieve FIFO data.
You can also have a look at our PID examples on github where you can find an example that shows how to read data from FIFO.
Hope this helps.
2023-12-14 06:27 AM
Hi @ZAIDS-S23 ,
Welcome to st community :)
You need to configure the FIFO settings using the FIFO_CTRL (2Eh) register, then use the FIFO_SAMPLES (2Fh) register to know the number of unread samples and finally perform sequential reads from the accelerometer's output registers to access FIFO data. There aren't specific registers for direct FIFO data access; you'll read data continuously from the output registers to retrieve FIFO data.
You can also have a look at our PID examples on github where you can find an example that shows how to read data from FIFO.
Hope this helps.
2023-12-27 01:36 PM - edited 2023-12-27 11:42 PM
Apologies for following up to this question after accepting an answer, however, I am struggling to understand the read-process of the chip. I have found an application note for the chip, that details the following process to read from the FIFO:
read_reg(0x2f, &fifo); /* Get number of unread samples */
fifo &= 0x3f;
while (fifo != 0x00) /* Print axes till FIFO is empty */
{
printAxes();
read_reg(0x2f, &fifo); /* Get number of unread samples */
fifo &= 0x3f;
}
While I understand what's happening, which is and correct me if I'm wrong, the value of unread samples is being read and the value of "fifo" will start at 31 (at line 2) and decrease as a read operation is performed on the output registers til it hits zero, and it will exit the while loop. Thus, I'm thinking, it's safe to place a read-operation on line 9 and then close the while-loop. However, when I do this, I obtain zeroes for all values for each data set.
I have also tried checking for the FIFO_FTH flag, as suggested by the examples on GITHUB. This would mean, instead of the while-loop condition checking if the value of "fifo" is equal to zero, I merely remove the code from lines 1 and 2, and check if the FTH bit is set in "fifo" value. This introduces issues into my system where I cannot even read the WhoAMI value.
Currently, I am confused on when to read from the output registers. Please may you assist.
Regards
2024-01-03 12:20 AM
Hi Federica
Any response to my most recent question below?
Regards
2024-01-03 01:38 AM
Hi @ZAIDS-S23 ,
The steps you need to do are the following:
- set BDU, FS, filters
- configure the fifo
- set the power mode and the ODR you want
- read samples in polling mode (using the fifo wtm flag)
- read the acceleration data
Hope this helps.
2024-01-03 04:55 AM
Hi Federica
Thank you for responding.
I am starting the sampling by setting SLP_ MODE_SEL to 1, in CTRL3.
After that, I am polling the FIFO_SAMPLES register, to check for the wtm flag, as such:
while(!isbitSet(ui8Data,7)){
IDS_LIS2DW12_Mem_read(_hi2c, IDS_LIS2DW12_FIFO_SAMPLES_REG, &ui8Data);
}
Where isbitSet(), checks whether the 7th bit (FIFO_FTH) is not set and continuously polls til it does. The flag is never set in this instance, thus my code doesn't ever get to read the acceleration data.