Compare commits
No commits in common. "eac1eaa041e7714d07bdfb949d4a9ccf3285486a" and "5d3d1437f920a9e09304913dd279945150e0e42b" have entirely different histories.
eac1eaa041
...
5d3d1437f9
2
Makefile
2
Makefile
@ -1,5 +1,5 @@
|
|||||||
CC=gcc
|
CC=gcc
|
||||||
CFLAGS=-O2 -std=c89 -W -Werror -Wall -Wextra -pedantic -I.
|
CFLAGS=-O2 -std=c99 -W -Werror -Wall -Wextra -pedantic -I.
|
||||||
LFLAGS=-lm
|
LFLAGS=-lm
|
||||||
all:
|
all:
|
||||||
$(CC) $(CFLAGS) main.c i2c.c lis3dh.c -o lis3dh $(LFLAGS)
|
$(CC) $(CFLAGS) main.c i2c.c lis3dh.c -o lis3dh $(LFLAGS)
|
||||||
|
11
i2c.c
11
i2c.c
@ -38,11 +38,7 @@ int i2c_init(void) {
|
|||||||
|
|
||||||
|
|
||||||
int i2c_read(uint8_t reg, uint8_t *dst, uint32_t size) {
|
int i2c_read(uint8_t reg, uint8_t *dst, uint32_t size) {
|
||||||
uint8_t cmd[2];
|
uint8_t cmd[2] = {reg, 0x00};
|
||||||
|
|
||||||
cmd[0] = reg;
|
|
||||||
cmd[1] = 0x00;
|
|
||||||
|
|
||||||
write(fd, cmd, 2);
|
write(fd, cmd, 2);
|
||||||
|
|
||||||
if (read(fd, dst, size) != (ssize_t)size) {
|
if (read(fd, dst, size) != (ssize_t)size) {
|
||||||
@ -56,10 +52,7 @@ int i2c_read(uint8_t reg, uint8_t *dst, uint32_t size) {
|
|||||||
|
|
||||||
|
|
||||||
int i2c_write(uint8_t reg, uint8_t value) {
|
int i2c_write(uint8_t reg, uint8_t value) {
|
||||||
uint8_t cmd[2];
|
uint8_t cmd[2] = {reg, value};
|
||||||
|
|
||||||
cmd[0] = reg;
|
|
||||||
cmd[1] = value;
|
|
||||||
|
|
||||||
if (write(fd, cmd, 2) != 2) {
|
if (write(fd, cmd, 2) != 2) {
|
||||||
fprintf(stderr, "error write()\n");
|
fprintf(stderr, "error write()\n");
|
||||||
|
13
lis3dh.c
13
lis3dh.c
@ -59,7 +59,7 @@ int lis3dh_init(lis3dh_t *lis3dh) {
|
|||||||
lis3dh->cfg.fifo.fth = 32; /* default watermark level. */
|
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 = 1; /* bypass OFF by default */
|
lis3dh->cfg.filter.fds = 0;
|
||||||
lis3dh->cfg.filter.hpclick = 0;
|
lis3dh->cfg.filter.hpclick = 0;
|
||||||
lis3dh->cfg.filter.ia1 = 0;
|
lis3dh->cfg.filter.ia1 = 0;
|
||||||
lis3dh->cfg.filter.ia2 = 0;
|
lis3dh->cfg.filter.ia2 = 0;
|
||||||
@ -221,8 +221,9 @@ static uint8_t acc_sensitivity(lis3dh_t *lis3dh) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int lis3dh_read(lis3dh_t *lis3dh) {
|
int lis3dh_read(lis3dh_t *lis3dh) {
|
||||||
|
|
||||||
uint8_t data[6];
|
uint8_t data[6];
|
||||||
int32_t x, y, z;
|
int16_t x, y, z;
|
||||||
uint8_t scale, sens;
|
uint8_t scale, sens;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
@ -246,7 +247,8 @@ int lis3dh_read(lis3dh_t *lis3dh) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int lis3dh_read_fifo(lis3dh_t *lis3dh, struct lis3dh_fifo_data *fifo) {
|
int lis3dh_read_fifo(lis3dh_t *lis3dh, struct lis3dh_fifo_data *fifo) {
|
||||||
int32_t x, y, z;
|
|
||||||
|
int16_t x, y, z;
|
||||||
uint8_t scale, sens;
|
uint8_t scale, sens;
|
||||||
uint8_t data[192]; /* max size */
|
uint8_t data[192]; /* max size */
|
||||||
int err = 0;
|
int err = 0;
|
||||||
@ -255,15 +257,14 @@ int lis3dh_read_fifo(lis3dh_t *lis3dh, struct lis3dh_fifo_data *fifo) {
|
|||||||
scale = acc_shift(lis3dh);
|
scale = acc_shift(lis3dh);
|
||||||
sens = acc_sensitivity(lis3dh);
|
sens = acc_sensitivity(lis3dh);
|
||||||
|
|
||||||
/* fifo buffer is max 32 */
|
fifo->size = lis3dh->cfg.fifo.fth;
|
||||||
fifo->size = lis3dh->cfg.fifo.fth > 32 ? 32 : 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);
|
||||||
|
|
||||||
for (i=0, idx=0; i<fifo->size * 6; i+=6, idx++) {
|
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;
|
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;
|
||||||
|
5
main.c
5
main.c
@ -22,7 +22,6 @@ int main() {
|
|||||||
|
|
||||||
lis3dh_t lis;
|
lis3dh_t lis;
|
||||||
struct lis3dh_fifo_data fifo;
|
struct lis3dh_fifo_data fifo;
|
||||||
int i, k;
|
|
||||||
|
|
||||||
/* set fn ptrs to rw on bus (i2c or SPI) */
|
/* set fn ptrs to rw on bus (i2c or SPI) */
|
||||||
lis.dev.init = i2c_init;
|
lis.dev.init = i2c_init;
|
||||||
@ -48,7 +47,7 @@ int main() {
|
|||||||
quit("configure()", &lis);
|
quit("configure()", &lis);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<50; i++) {
|
for (int i=0; i<50; i++) {
|
||||||
|
|
||||||
/* poll fifo reg */
|
/* poll fifo reg */
|
||||||
if (lis3dh_poll_fifo(&lis)) {
|
if (lis3dh_poll_fifo(&lis)) {
|
||||||
@ -60,7 +59,7 @@ int main() {
|
|||||||
quit("read_fifo()", &lis);
|
quit("read_fifo()", &lis);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(k=0; k<fifo.size; k++) {
|
for(int k=0; k<fifo.size; k++) {
|
||||||
printf("x: %04.04f, y: %04.04f, z: %04.04f mag: %04.04f\n",
|
printf("x: %04.04f, y: %04.04f, z: %04.04f mag: %04.04f\n",
|
||||||
fifo.x[k], fifo.y[k], fifo.z[k],
|
fifo.x[k], fifo.y[k], fifo.z[k],
|
||||||
mag(fifo.x[k], fifo.y[k], fifo.z[k]));
|
mag(fifo.x[k], fifo.y[k], fifo.z[k]));
|
||||||
|
Loading…
Reference in New Issue
Block a user