05-20-2022 03:17 PM - edited 05-21-2022 06:17 AM
I read BMI270 by ESP32 programmed in Arduino IDE so I cannot use the existing API directly, have to correct it substantially. By now reading accelerometer and gyro data directly, sample by sample is no problem but I need to use FIFO to shorten communication time to save the energy consumed.
I use API example file "fifo_full_headerless_mode.c" as a start point. For the beginning, having some difficulties with interrupts, I just want to read the FIFO content each 2 seconds, regardless of overflow. Using a part of the code from the said file which I understand is responsible for it. It reads 168 samples, but strange values (acc and gyro): first 45 samples are constant values , then some random values (not noise). But what puzzles me most is not the values, I understand something with ODR, etc., may be configured wrongly still, but the signals on the communication lines. I understand it should be packets about 2000 bytes long, right? But I observe 9 short bursts, about 2 bytes each, see attachment. But the code reports all bytes received (?!):
15:40:33.904 -> FIFO data bytes available : 2016
15:40:33.904 -> FIFO data bytes requested : 2016
15:40:33.904 -> FIFO accel frames requested : 170
15:40:33.904 -> FIFO accel frames extracted : 168
15:40:33.904 -> FIFO gyro frames requested : 170
15:40:33.938 -> FIFO gyro frames extracted : 168
But such amount of data does NOT go through the line! I have absolutely no clue, may be someone more experienced can give some ideas - where to investigate?
Here are values of registers I consider relevant, read at the end of setup():
15:55:27.068 -> Read 0x49 FIFO_CONFIG_1 HEX = C0 BIN = 11000000
15:55:27.068 -> Read 0x58 INT_MAP_DATA HEX = 41 BIN = 1000001
15:55:27.068 -> Read 0x53 INT1_IO_CTRL HEX = A BIN = 1010
15:55:27.101 -> Read 0x55 INT_LATCH HEX = 0 BIN = 0
- may some others need attention?
Attachment: SDA line of I2C interface. The same each 2 seconds.
Thanks
06-15-2022 07:58 AM
Hi Anatol,
As you set ODR to 50 Hz and run example file "fifo_full_headerless_mode.c", 1 frame of data contains 12 bytes(6 bytes accel, 6 bytes gyro). Read the FIFO content each 2 seconds, the theoretical length of FIFO should be 12*50*2=1200 bytes, accel and gyro frame should be 100 frames.
From your printed information, the actual length and the number of frames are larger than the theoretical value.
15:40:33.904 -> FIFO data bytes available : 2016
15:40:33.904 -> FIFO data bytes requested : 2016
15:40:33.904 -> FIFO accel frames requested : 170
15:40:33.904 -> FIFO accel frames extracted : 168
15:40:33.904 -> FIFO gyro frames requested : 170
15:40:33.938 -> FIFO gyro frames extracted : 168
If you confirm that you have configured the correct ODR and read the data in exactly 2 seconds. Then the sensor data is not read in time.
We don't have much experience in Arduino programming. You can consult the experts on the Arduino forum.
If your platform only supports reading the maximum 256 bytes of FIFO data, you can shorten the interval between reading FIFO data, such as reading FIFO data every 160ms.