pass FIFO data
This commit is contained in:
parent
57740b2e92
commit
e9472ed1f0
7
Makefile
7
Makefile
@ -1,7 +1,8 @@
|
|||||||
CC=gcc
|
CC=gcc
|
||||||
CFLAGS=-O2 -std=c99 -W -Werror -Wall -Wextra -I.
|
CFLAGS=-O2 -std=gnu99 -W -Werror -Wall -Wextra -I.
|
||||||
|
LFLAGS=-lm
|
||||||
all:
|
all:
|
||||||
$(CC) $(CFLAGS) main.c i2c.c lis3dh.c -o lis3dh -lm
|
$(CC) $(CFLAGS) main.c i2c.c lis3dh.c -o lis3dh $(LFLAGS)
|
||||||
|
|
||||||
clean:
|
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.mode = 0;
|
||||||
lis3dh->cfg.fifo.mode = 0xFF; /* in use if neq 0xFF */
|
lis3dh->cfg.fifo.mode = 0xFF; /* in use if neq 0xFF */
|
||||||
lis3dh->cfg.fifo.trig = 0;
|
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.mode = 0xFF; /* in use if neq 0xFF */
|
||||||
lis3dh->cfg.filter.cutoff = 0;
|
lis3dh->cfg.filter.cutoff = 0;
|
||||||
lis3dh->cfg.filter.fds = 0;
|
lis3dh->cfg.filter.fds = 0;
|
||||||
@ -248,45 +248,34 @@ int lis3dh_read(lis3dh_t *lis3dh) {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double mag(double x, double y, double z) {
|
int lis3dh_read_fifo(lis3dh_t *lis3dh, struct lis3dh_fifo_data *fifo) {
|
||||||
return sqrt( powf(x, 2) + powf(y, 2) + powf(z, 2) );
|
|
||||||
}
|
|
||||||
|
|
||||||
int lis3dh_read_fifo(lis3dh_t *lis3dh) {
|
|
||||||
|
|
||||||
int16_t x, y, z;
|
int16_t x, y, z;
|
||||||
uint8_t scale, sens;
|
uint8_t scale, sens;
|
||||||
uint8_t data[192];
|
uint8_t data[192]; /* max size */
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
int i, idx;
|
||||||
|
|
||||||
scale = acc_shift(lis3dh);
|
scale = acc_shift(lis3dh);
|
||||||
sens = acc_sensitivity(lis3dh);
|
sens = acc_sensitivity(lis3dh);
|
||||||
|
|
||||||
|
fifo->size = lis3dh->cfg.fifo.fth;
|
||||||
|
|
||||||
/* must set MSbit of the address to multi-read and
|
/* must set MSbit of the address to multi-read and
|
||||||
have the device auto-increment the address.
|
have the device auto-increment the address.
|
||||||
see 5.1.5 in datasheet. */
|
see 5.1.5 in datasheet. */
|
||||||
err |= lis3dh->dev.read(REG_OUT_X_L | 0x80, data, 192);
|
err |= lis3dh->dev.read(REG_OUT_X_L | 0x80, data, 192);
|
||||||
|
|
||||||
puts("FIFO =>");
|
for(i=0, idx=0; i<lis3dh->cfg.fifo.fth * 6; i+=6, idx++) {
|
||||||
|
|
||||||
for(int i=0; i<192; i+=6) {
|
|
||||||
x = (((int16_t)((data[i + 0] << 8) | data[i + 1])) >> scale) * sens;
|
x = (((int16_t)((data[i + 0] << 8) | data[i + 1])) >> scale) * sens;
|
||||||
y = (((int16_t)((data[i + 2] << 8) | data[i + 3])) >> 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;
|
z = (((int16_t)((data[i + 4] << 8) | data[i + 5])) >> scale) * sens;
|
||||||
|
|
||||||
double dx = ((double)x) / 1000.0;
|
fifo->x[idx] = ((float)x) / 1000.0;
|
||||||
double dy = ((double)y) / 1000.0;
|
fifo->y[idx] = ((float)y) / 1000.0;
|
||||||
double dz = ((double)z) / 1000.0;
|
fifo->z[idx] = ((float)z) / 1000.0;
|
||||||
|
|
||||||
printf("x: %04.04f, y: %04.04f, z: %04.04f mag:%f\n",
|
|
||||||
dx,
|
|
||||||
dy,
|
|
||||||
dz,
|
|
||||||
mag(dx, dy, dz));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
puts("<= FIFO");
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
lis3dh.h
12
lis3dh.h
@ -100,12 +100,22 @@ struct lis3dh {
|
|||||||
|
|
||||||
typedef struct lis3dh lis3dh_t;
|
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_init(lis3dh_t *lis3dh);
|
||||||
int lis3dh_deinit(lis3dh_t *lis3dh);
|
int lis3dh_deinit(lis3dh_t *lis3dh);
|
||||||
int lis3dh_configure(lis3dh_t *lis3dh);
|
int lis3dh_configure(lis3dh_t *lis3dh);
|
||||||
int lis3dh_poll(lis3dh_t *lis3dh);
|
int lis3dh_poll(lis3dh_t *lis3dh);
|
||||||
int lis3dh_read(lis3dh_t *lis3dh);
|
int lis3dh_read(lis3dh_t *lis3dh);
|
||||||
int lis3dh_poll_fifo(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
|
#endif
|
44
main.c
44
main.c
@ -5,16 +5,14 @@
|
|||||||
#include "lis3dh.h"
|
#include "lis3dh.h"
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
|
|
||||||
double accel_mag(lis3dh_t *lis) {
|
float mag(float x, float y, float z) {
|
||||||
double d = 0.0;
|
return sqrt( powf(x, 2) + powf(y, 2) + powf(z, 2) );
|
||||||
|
|
||||||
d = sqrt( powf(lis->acc.x, 2) + powf(lis->acc.y, 2) + powf(lis->acc.z, 2));
|
|
||||||
return d;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
lis3dh_t lis;
|
lis3dh_t lis;
|
||||||
|
struct lis3dh_fifo_data fifo;
|
||||||
|
|
||||||
lis.dev.init = i2c_init;
|
lis.dev.init = i2c_init;
|
||||||
lis.dev.read = i2c_read;
|
lis.dev.read = i2c_read;
|
||||||
@ -29,40 +27,30 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lis.cfg.mode = LIS3DH_MODE_HR;
|
lis.cfg.mode = LIS3DH_MODE_HR;
|
||||||
lis.cfg.range = LIS3DH_FS_4G;
|
lis.cfg.range = LIS3DH_FS_2G;
|
||||||
lis.cfg.rate = LIS3DH_ODR_25_HZ;
|
lis.cfg.rate = LIS3DH_ODR_100_HZ;
|
||||||
lis.cfg.fifo.mode = LIS3DH_FIFO_MODE_STREAM;
|
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)) {
|
if (lis3dh_configure(&lis)) {
|
||||||
puts("configure ERR");
|
puts("configure ERR");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
for(int i=0; i<100; i++) {
|
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)) {
|
if (lis3dh_read_fifo(&lis, &fifo)) {
|
||||||
puts("read ERR");
|
puts("read_fifo ERR");
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("x: % 04.04f g, y: % 04.04f g, z: % 04.04f g, mag:% 04.04f\n",
|
for(int k=0; k<fifo.size; k++) {
|
||||||
lis.acc.x, lis.acc.y, lis.acc.z, accel_mag(&lis));
|
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]));
|
||||||
|
}
|
||||||
/* FIFO test */
|
}
|
||||||
if (lis3dh_poll_fifo(&lis)) {
|
|
||||||
puts("poll_fifo ERR");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lis3dh_read_fifo(&lis)) {
|
|
||||||
puts("read_fifo ERR");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lis3dh_deinit(&lis)) {
|
if (lis3dh_deinit(&lis)) {
|
||||||
puts("deinit ERR");
|
puts("deinit ERR");
|
||||||
|
Loading…
Reference in New Issue
Block a user