c99 + comments
This commit is contained in:
parent
11e6e65c6f
commit
5d3d1437f9
2
Makefile
2
Makefile
@ -1,5 +1,5 @@
|
||||
CC=gcc
|
||||
CFLAGS=-O2 -std=gnu99 -W -Werror -Wall -Wextra -I.
|
||||
CFLAGS=-O2 -std=c99 -W -Werror -Wall -Wextra -pedantic -I.
|
||||
LFLAGS=-lm
|
||||
all:
|
||||
$(CC) $(CFLAGS) main.c i2c.c lis3dh.c -o lis3dh $(LFLAGS)
|
||||
|
50
lis3dh.c
50
lis3dh.c
@ -9,27 +9,27 @@ static int lis3dh_reset(lis3dh_t *lis3dh) {
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG5, 0x80);
|
||||
|
||||
/* write default values to rw regs */
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG0, 0b10000);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG1, 0b111);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG2, 0);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG3, 0);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG4, 0);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG5, 0);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG6, 0);
|
||||
err |= lis3dh->dev.write(REG_FIFO_CTRL_REG, 0);
|
||||
err |= lis3dh->dev.write(REG_INT1_CFG, 0);
|
||||
err |= lis3dh->dev.write(REG_INT1_THS, 0);
|
||||
err |= lis3dh->dev.write(REG_INT1_DURATION, 0);
|
||||
err |= lis3dh->dev.write(REG_INT2_CFG, 0);
|
||||
err |= lis3dh->dev.write(REG_INT2_THS, 0);
|
||||
err |= lis3dh->dev.write(REG_INT2_DURATION, 0);
|
||||
err |= lis3dh->dev.write(REG_CLICK_CFG, 0);
|
||||
err |= lis3dh->dev.write(REG_CLICK_THS, 0);
|
||||
err |= lis3dh->dev.write(REG_TIME_LIMIT, 0);
|
||||
err |= lis3dh->dev.write(REG_TIME_LATENCY, 0);
|
||||
err |= lis3dh->dev.write(REG_TIME_WINDOW, 0);
|
||||
err |= lis3dh->dev.write(REG_ACT_THS, 0);
|
||||
err |= lis3dh->dev.write(REG_ACT_DUR, 0);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG0, 0x10);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG1, 0x07);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG2, 0x00);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG3, 0x00);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG4, 0x00);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG5, 0x00);
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG6, 0x00);
|
||||
err |= lis3dh->dev.write(REG_FIFO_CTRL_REG, 0x00);
|
||||
err |= lis3dh->dev.write(REG_INT1_CFG, 0x00);
|
||||
err |= lis3dh->dev.write(REG_INT1_THS, 0x00);
|
||||
err |= lis3dh->dev.write(REG_INT1_DURATION, 0x00);
|
||||
err |= lis3dh->dev.write(REG_INT2_CFG, 0x00);
|
||||
err |= lis3dh->dev.write(REG_INT2_THS, 0x00);
|
||||
err |= lis3dh->dev.write(REG_INT2_DURATION, 0x00);
|
||||
err |= lis3dh->dev.write(REG_CLICK_CFG, 0x00);
|
||||
err |= lis3dh->dev.write(REG_CLICK_THS, 0x00);
|
||||
err |= lis3dh->dev.write(REG_TIME_LIMIT, 0x00);
|
||||
err |= lis3dh->dev.write(REG_TIME_LATENCY, 0x00);
|
||||
err |= lis3dh->dev.write(REG_TIME_WINDOW, 0x00);
|
||||
err |= lis3dh->dev.write(REG_ACT_THS, 0x00);
|
||||
err |= lis3dh->dev.write(REG_ACT_DUR, 0x00);
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -77,7 +77,7 @@ int lis3dh_configure(lis3dh_t *lis3dh) {
|
||||
int err = 0;
|
||||
|
||||
/* last 0b111 enables Z, Y and X axis */
|
||||
ctrl_reg1 = 0 | (lis3dh->cfg.rate << 4) | 0b111;
|
||||
ctrl_reg1 = 0 | (lis3dh->cfg.rate << 4) | 0x07;
|
||||
ctrl_reg2 = 0;
|
||||
ctrl_reg4 = 0 | (lis3dh->cfg.range << 4);
|
||||
ctrl_reg5 = 0;
|
||||
@ -93,8 +93,8 @@ int lis3dh_configure(lis3dh_t *lis3dh) {
|
||||
|
||||
/* set enable filter */
|
||||
if (lis3dh->cfg.filter.mode != 0xFF) {
|
||||
ctrl_reg2 |= ((lis3dh->cfg.filter.mode & 0b11) << 6);
|
||||
ctrl_reg2 |= ((lis3dh->cfg.filter.cutoff & 0b11) << 4);
|
||||
ctrl_reg2 |= ((lis3dh->cfg.filter.mode & 0x03) << 6);
|
||||
ctrl_reg2 |= ((lis3dh->cfg.filter.cutoff & 0x03) << 4);
|
||||
ctrl_reg2 |= ((lis3dh->cfg.filter.fds & 1) << 3);
|
||||
ctrl_reg2 |= ((lis3dh->cfg.filter.hpclick & 1) << 2);
|
||||
ctrl_reg2 |= ((lis3dh->cfg.filter.ia1 & 1) << 1);
|
||||
@ -111,7 +111,7 @@ int lis3dh_configure(lis3dh_t *lis3dh) {
|
||||
|
||||
/* set LPen */
|
||||
if (lis3dh->cfg.mode == LIS3DH_MODE_LP) {
|
||||
ctrl_reg1 |= 0b1000;
|
||||
ctrl_reg1 |= 0x08;
|
||||
}
|
||||
|
||||
err |= lis3dh->dev.write(REG_CTRL_REG1, ctrl_reg1);
|
||||
|
68
lis3dh.h
68
lis3dh.h
@ -4,55 +4,55 @@
|
||||
#include <stdint.h>
|
||||
|
||||
/* rates */
|
||||
#define LIS3DH_ODR_POWEROFF 0b0000
|
||||
#define LIS3DH_ODR_1_HZ 0b0001
|
||||
#define LIS3DH_ODR_10_HZ 0b0010
|
||||
#define LIS3DH_ODR_25_HZ 0b0011
|
||||
#define LIS3DH_ODR_50_HZ 0b0100
|
||||
#define LIS3DH_ODR_100_HZ 0b0101
|
||||
#define LIS3DH_ODR_200_HZ 0b0110
|
||||
#define LIS3DH_ODR_400_HZ 0b0111
|
||||
#define LIS3DH_ODR_NORM_1344_HZ 0b1001
|
||||
#define LIS3DH_ODR_LP_1600_HZ 0b1000
|
||||
#define LIS3DH_ODR_LP_5376_HZ 0b1001
|
||||
#define LIS3DH_ODR_POWEROFF 0x00
|
||||
#define LIS3DH_ODR_1_HZ 0x01
|
||||
#define LIS3DH_ODR_10_HZ 0x02
|
||||
#define LIS3DH_ODR_25_HZ 0x03
|
||||
#define LIS3DH_ODR_50_HZ 0x04
|
||||
#define LIS3DH_ODR_100_HZ 0x05
|
||||
#define LIS3DH_ODR_200_HZ 0x06
|
||||
#define LIS3DH_ODR_400_HZ 0x07
|
||||
#define LIS3DH_ODR_NORM_1344_HZ 0x09
|
||||
#define LIS3DH_ODR_LP_1600_HZ 0x08
|
||||
#define LIS3DH_ODR_LP_5376_HZ 0x09
|
||||
|
||||
/* range/sens */
|
||||
#define LIS3DH_FS_2G 0b00
|
||||
#define LIS3DH_FS_4G 0b01
|
||||
#define LIS3DH_FS_8G 0b10
|
||||
#define LIS3DH_FS_16G 0b11
|
||||
#define LIS3DH_FS_2G 0x00
|
||||
#define LIS3DH_FS_4G 0x01
|
||||
#define LIS3DH_FS_8G 0x02
|
||||
#define LIS3DH_FS_16G 0x03
|
||||
|
||||
/* operating modes */
|
||||
#define LIS3DH_MODE_HR 0b00
|
||||
#define LIS3DH_MODE_LP 0b01
|
||||
#define LIS3DH_MODE_NORMAL 0b10
|
||||
#define LIS3DH_MODE_HR 0x00
|
||||
#define LIS3DH_MODE_LP 0x01
|
||||
#define LIS3DH_MODE_NORMAL 0x02
|
||||
|
||||
/* FIFO modes */
|
||||
#define LIS3DH_FIFO_MODE_BYPASS 0b00
|
||||
#define LIS3DH_FIFO_MODE_NORMAL 0b01 /* "FIFO" */
|
||||
#define LIS3DH_FIFO_MODE_STREAM 0b10
|
||||
#define LIS3DH_FIFO_MODE_STREAM_TO_FIFO 0b11
|
||||
#define LIS3DH_FIFO_MODE_BYPASS 0x00
|
||||
#define LIS3DH_FIFO_MODE_NORMAL 0x01 /* "FIFO" */
|
||||
#define LIS3DH_FIFO_MODE_STREAM 0x02
|
||||
#define LIS3DH_FIFO_MODE_STREAM_TO_FIFO 0x03
|
||||
|
||||
/* FIFO trigger pin selection */
|
||||
#define LIS3DH_FIFO_TRIG_INT1 0b0
|
||||
#define LIS3DH_FIFO_TRIG_INT2 0b1
|
||||
#define LIS3DH_FIFO_TRIG_INT1 0x00
|
||||
#define LIS3DH_FIFO_TRIG_INT2 0x01
|
||||
|
||||
/* filter modes */
|
||||
/* this one is reset by reading REFERENCE (0x26) */
|
||||
#define LIS3DH_FILTER_MODE_NORMAL 0b00
|
||||
#define LIS3DH_FILTER_MODE_REFERENCE 0b01
|
||||
#define LIS3DH_FILTER_MODE_NORMAL2 0b10 /* same as 00? */
|
||||
#define LIS3DH_FILTER_MODE_AUTORESET 0b11
|
||||
#define LIS3DH_FILTER_MODE_NORMAL 0x00
|
||||
#define LIS3DH_FILTER_MODE_REFERENCE 0x01
|
||||
#define LIS3DH_FILTER_MODE_NORMAL2 0x02 /* same as 00? */
|
||||
#define LIS3DH_FILTER_MODE_AUTORESET 0x03
|
||||
|
||||
/* filter cutoff */
|
||||
/* unfortunately, there is only a table for low-power mode,
|
||||
and the actual cutoff-frequency depends on the ODR.
|
||||
Naming scheme after ODR@400Hz
|
||||
AN3308 > section 4.3.1.1 */
|
||||
#define LIS3DH_FILTER_CUTOFF_8 0b00 /* highest freq */
|
||||
#define LIS3DH_FILTER_CUTOFF_4 0b01
|
||||
#define LIS3DH_FILTER_CUTOFF_2 0b10
|
||||
#define LIS3DH_FILTER_CUTOFF_1 0b11 /* lowest freq */
|
||||
#define LIS3DH_FILTER_CUTOFF_8 0x00 /* highest freq */
|
||||
#define LIS3DH_FILTER_CUTOFF_4 0x01
|
||||
#define LIS3DH_FILTER_CUTOFF_2 0x02
|
||||
#define LIS3DH_FILTER_CUTOFF_1 0x03 /* lowest freq */
|
||||
|
||||
|
||||
struct lis3dh_device {
|
||||
@ -73,9 +73,9 @@ struct lis3dh_filter_config {
|
||||
};
|
||||
|
||||
struct lis3dh_fifo_config {
|
||||
uint8_t fth;
|
||||
uint8_t fth; /* user-specified watermark level 0-32 */
|
||||
uint8_t trig;
|
||||
uint8_t mode;
|
||||
uint8_t mode;
|
||||
};
|
||||
|
||||
struct lis3dh_config {
|
||||
|
33
main.c
33
main.c
@ -1,19 +1,29 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
#include "lis3dh.h"
|
||||
#include "i2c.h"
|
||||
|
||||
/* calc magnitude of accel [x y z] vector */
|
||||
float mag(float x, float y, float z) {
|
||||
return sqrt( powf(x, 2) + powf(y, 2) + powf(z, 2) );
|
||||
}
|
||||
|
||||
/* print message then exit */
|
||||
void quit(const char *msg, lis3dh_t *lis) {
|
||||
lis->dev.deinit();
|
||||
fprintf(stderr, "%s\n", msg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
lis3dh_t lis;
|
||||
struct lis3dh_fifo_data fifo;
|
||||
|
||||
/* set fn ptrs to rw on bus (i2c or SPI) */
|
||||
lis.dev.init = i2c_init;
|
||||
lis.dev.read = i2c_read;
|
||||
lis.dev.write = i2c_write;
|
||||
@ -21,28 +31,32 @@ int main() {
|
||||
lis.dev.deinit = i2c_deinit;
|
||||
|
||||
|
||||
/* write config after init() */
|
||||
/* initialise struct */
|
||||
if (lis3dh_init(&lis)) {
|
||||
puts("init ERR");
|
||||
quit("init()", &lis);
|
||||
}
|
||||
|
||||
/* set up config */
|
||||
lis.cfg.mode = LIS3DH_MODE_HR;
|
||||
lis.cfg.range = LIS3DH_FS_2G;
|
||||
lis.cfg.rate = LIS3DH_ODR_100_HZ;
|
||||
lis.cfg.fifo.mode = LIS3DH_FIFO_MODE_STREAM;
|
||||
|
||||
/* write device config */
|
||||
if (lis3dh_configure(&lis)) {
|
||||
puts("configure ERR");
|
||||
quit("configure()", &lis);
|
||||
}
|
||||
|
||||
for(int i=0; i<100; i++) {
|
||||
for (int i=0; i<50; i++) {
|
||||
|
||||
/* poll fifo reg */
|
||||
if (lis3dh_poll_fifo(&lis)) {
|
||||
puts("poll_fifo ERR");
|
||||
quit("poll_fifo()", &lis);
|
||||
}
|
||||
|
||||
/* read stored fifo data into `fifo' struct */
|
||||
if (lis3dh_read_fifo(&lis, &fifo)) {
|
||||
puts("read_fifo ERR");
|
||||
quit("read_fifo()", &lis);
|
||||
}
|
||||
|
||||
for(int k=0; k<fifo.size; k++) {
|
||||
@ -50,10 +64,11 @@ int main() {
|
||||
fifo.x[k], fifo.y[k], fifo.z[k],
|
||||
mag(fifo.x[k], fifo.y[k], fifo.z[k]));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* deinitalise struct */
|
||||
if (lis3dh_deinit(&lis)) {
|
||||
puts("deinit ERR");
|
||||
quit("deinit()", &lis);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user