pass FIFO data
This commit is contained in:
parent
57740b2e92
commit
e9472ed1f0
7
Makefile
7
Makefile
@ -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
|
||||
rm -rf lis3dh
|
||||
|
31
lis3dh.c
31
lis3dh.c
@ -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;
|
||||
}
|
||||
|
||||
|
12
lis3dh.h
12
lis3dh.h
@ -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
|
44
main.c
44
main.c
@ -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,40 +27,30 @@ 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_poll_fifo(&lis)) {
|
||||
puts("poll_fifo ERR");
|
||||
}
|
||||
|
||||
if (lis3dh_read(&lis)) {
|
||||
puts("read ERR");
|
||||
if (lis3dh_read_fifo(&lis, &fifo)) {
|
||||
puts("read_fifo 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)) {
|
||||
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");
|
||||
|
Loading…
Reference in New Issue
Block a user