pass FIFO data

This commit is contained in:
William Clark 2023-12-23 10:28:43 +00:00
parent 57740b2e92
commit e9472ed1f0
4 changed files with 41 additions and 53 deletions

View File

@ -1,7 +1,8 @@
CC=gcc
CFLAGS=-O2 -std=c99 -W -Werror -Wall -Wextra -I.
CFLAGS=-O2 -std=gnu99 -W -Werror -Wall -Wextra -I.
LFLAGS=-lm
all:
$(CC) $(CFLAGS) main.c i2c.c lis3dh.c -o lis3dh -lm
$(CC) $(CFLAGS) main.c i2c.c lis3dh.c -o lis3dh $(LFLAGS)
clean:
rm -rf lis3dh

View File

@ -58,7 +58,7 @@ int lis3dh_init(lis3dh_t *lis3dh) {
lis3dh->cfg.mode = 0;
lis3dh->cfg.fifo.mode = 0xFF; /* in use if neq 0xFF */
lis3dh->cfg.fifo.trig = 0;
lis3dh->cfg.fifo.fth = 0;
lis3dh->cfg.fifo.fth = 32; /* default watermark level. */
lis3dh->cfg.filter.mode = 0xFF; /* in use if neq 0xFF */
lis3dh->cfg.filter.cutoff = 0;
lis3dh->cfg.filter.fds = 0;
@ -248,45 +248,34 @@ int lis3dh_read(lis3dh_t *lis3dh) {
return err;
}
static double mag(double x, double y, double z) {
return sqrt( powf(x, 2) + powf(y, 2) + powf(z, 2) );
}
int lis3dh_read_fifo(lis3dh_t *lis3dh) {
int lis3dh_read_fifo(lis3dh_t *lis3dh, struct lis3dh_fifo_data *fifo) {
int16_t x, y, z;
uint8_t scale, sens;
uint8_t data[192];
uint8_t data[192]; /* max size */
int err = 0;
int i, idx;
scale = acc_shift(lis3dh);
sens = acc_sensitivity(lis3dh);
fifo->size = lis3dh->cfg.fifo.fth;
/* must set MSbit of the address to multi-read and
have the device auto-increment the address.
see 5.1.5 in datasheet. */
err |= lis3dh->dev.read(REG_OUT_X_L | 0x80, data, 192);
puts("FIFO =>");
for(int i=0; i<192; i+=6) {
for(i=0, idx=0; i<lis3dh->cfg.fifo.fth * 6; i+=6, idx++) {
x = (((int16_t)((data[i + 0] << 8) | data[i + 1])) >> scale) * sens;
y = (((int16_t)((data[i + 2] << 8) | data[i + 3])) >> scale) * sens;
z = (((int16_t)((data[i + 4] << 8) | data[i + 5])) >> scale) * sens;
double dx = ((double)x) / 1000.0;
double dy = ((double)y) / 1000.0;
double dz = ((double)z) / 1000.0;
printf("x: %04.04f, y: %04.04f, z: %04.04f mag:%f\n",
dx,
dy,
dz,
mag(dx, dy, dz));
fifo->x[idx] = ((float)x) / 1000.0;
fifo->y[idx] = ((float)y) / 1000.0;
fifo->z[idx] = ((float)z) / 1000.0;
}
puts("<= FIFO");
return err;
}

View File

@ -100,12 +100,22 @@ struct lis3dh {
typedef struct lis3dh lis3dh_t;
/* struct for containing the FIFO data */
struct lis3dh_fifo_data {
uint8_t size; /* up to 32 */
float x[32];
float y[32];
float z[32];
};
int lis3dh_init(lis3dh_t *lis3dh);
int lis3dh_deinit(lis3dh_t *lis3dh);
int lis3dh_configure(lis3dh_t *lis3dh);
int lis3dh_poll(lis3dh_t *lis3dh);
int lis3dh_read(lis3dh_t *lis3dh);
int lis3dh_poll_fifo(lis3dh_t *lis3dh);
int lis3dh_read_fifo(lis3dh_t *lis3dh);
int lis3dh_read_fifo(lis3dh_t *lis3dh, struct lis3dh_fifo_data *fifo);
#endif

38
main.c
View File

@ -5,16 +5,14 @@
#include "lis3dh.h"
#include "i2c.h"
double accel_mag(lis3dh_t *lis) {
double d = 0.0;
d = sqrt( powf(lis->acc.x, 2) + powf(lis->acc.y, 2) + powf(lis->acc.z, 2));
return d;
float mag(float x, float y, float z) {
return sqrt( powf(x, 2) + powf(y, 2) + powf(z, 2) );
}
int main() {
lis3dh_t lis;
struct lis3dh_fifo_data fifo;
lis.dev.init = i2c_init;
lis.dev.read = i2c_read;
@ -29,41 +27,31 @@ int main() {
}
lis.cfg.mode = LIS3DH_MODE_HR;
lis.cfg.range = LIS3DH_FS_4G;
lis.cfg.rate = LIS3DH_ODR_25_HZ;
lis.cfg.range = LIS3DH_FS_2G;
lis.cfg.rate = LIS3DH_ODR_100_HZ;
lis.cfg.fifo.mode = LIS3DH_FIFO_MODE_STREAM;
//lis.cfg.filter.mode = LIS3DH_FILTER_MODE_AUTORESET;
lis.cfg.filter.cutoff = LIS3DH_FILTER_CUTOFF_8;
lis.cfg.filter.fds = 1;
if (lis3dh_configure(&lis)) {
puts("configure ERR");
}
/*
for(int i=0; i<100; i++) {
if (lis3dh_poll(&lis)) {
puts("poll ERR");
}
if (lis3dh_read(&lis)) {
puts("read ERR");
}
printf("x: % 04.04f g, y: % 04.04f g, z: % 04.04f g, mag:% 04.04f\n",
lis.acc.x, lis.acc.y, lis.acc.z, accel_mag(&lis));
}
*/
/* FIFO test */
if (lis3dh_poll_fifo(&lis)) {
puts("poll_fifo ERR");
}
if (lis3dh_read_fifo(&lis)) {
if (lis3dh_read_fifo(&lis, &fifo)) {
puts("read_fifo ERR");
}
for(int k=0; k<fifo.size; k++) {
printf("x: %04.04f, y: %04.04f, z: %04.04f mag: %04.04f\n",
fifo.x[k], fifo.y[k], fifo.z[k],
mag(fifo.x[k], fifo.y[k], fifo.z[k]));
}
}
if (lis3dh_deinit(&lis)) {
puts("deinit ERR");
}