2024-03-26 12:21 AM - edited 2024-03-26 12:23 AM
Dear All,
I am using the LIS2DH12 accelerometer that is incorporated within a Decawave DWM1001-DEV board. I am attempting to write a C program using the dwm.h library functions to display the acceleration values for the X, Y and Z axes via I2C constantly.
However, after writing my program, I realised that the program only outputs a constant reading of -32640 for all axes as shown below even when I move the accelerometer.
My code mainly uses the dwm_i2c_write() and dwm_i2c_read() functions from the dwm.h library with the descriptions of the functions as shown:
The main file and header files for my program are attached below. I would appreciate any help on shedding some light on any errors I have made in my program which might have resulted in my problem.
Main function:
void app_thread_entry(uint32_t data)
{
uint8_t writeData[2];
// Enable X, Y, Z axes and set ODR (data rate) - for example, to 10 Hz
writeData[0] = 0x20;
writeData[1] = 0x27;
dwm_i2c_write(0x19, writeData, 2, false);
// Set full-scale to +/-2g
writeData[0] = 0x23;
writeData[1] = 0x08;
dwm_i2c_write(0x19, writeData, 2, false);
// Set FIFO enable
writeData[0] = 0x24;
writeData[1] = 0x40;
dwm_i2c_write(0x19, writeData, 2, false);
// Set accelerometer to stream mode
writeData[0] = 0x2e;
writeData[1] = 0x80;
dwm_i2c_write(0x19, writeData, 2, false);
while(1) {
uint8_t status;
uint8_t out_x_l, out_x_h, out_y_l, out_y_h, out_z_l, out_z_h; // To store X, Y, Z high and low bytes
int16_t x, y, z;
out_x_l = 0x28;
out_x_h = 0x29;
out_y_l = 0x2a;
out_y_h = 0x2b;
out_z_l = 0x2c;
out_z_h = 0x2d;
// Read FIFO_SRC_REG to check if data is available
dwm_i2c_read(0x2f, &status, 1);
// If FIFO is not empty, read acceleration data
if (!(status & 0x20)) {
// Read sequential data output registers from OUT_X_LO to OUT_Z_HI
dwm_i2c_read(0x19, &out_x_l, 1);
dwm_i2c_read(0x19, &out_x_h, 1);
dwm_i2c_read(0x19, &out_y_l, 1);
dwm_i2c_read(0x19, &out_y_h, 1);
dwm_i2c_read(0x19, &out_z_l, 1);
dwm_i2c_read(0x19, &out_z_h, 1);
// Combine high and low bytes
x = (int16_t)((out_x_h << 8 | out_x_l);
y = (int16_t)((out_y_h << 8 | out_y_l);
z = (int16_t)((out_z_h << 8 | out_z_l);
// Print acceleration values
printf("X: %d, Y: %d, Z: %d\n", x, y, z);
}
// Sleep or delay to match the read rate with the ODR of accelerometer
dwm_thread_delay(100); // For example, delay 100ms
}
}
Thank you all in advance.
2024-03-26 02:04 AM
Hi @GChan_02 ,
Welcome to ST Community!
I can't support you with that library is not provided by ST.
However, I suggest you to look at our official drivers on github.