STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
dev_h3lis100dl.c
Go to the documentation of this file.
1#include "dev_h3lis100dl.h"
2
3#include <stddef.h>
4
5enum {
10 REG_OUT_X = 0x29,
11};
12
13/* First byte (p.20): bit 7 RW (1 = read), bit 6 MS (1 = auto-increment),
14 * bits 5:0 address. */
15#define SPI_READ 0x80U
16#define SPI_INCREMENT 0x40U
17
18static const struct {
19 uint8_t reg;
20 uint8_t value;
21} config[] = {
22 {REG_CTRL_REG4, 0x00}, /* 4-wire SPI */
23 {REG_CTRL_REG3, 0x02}, /* INT1 = data ready, active high, push-pull */
24 {REG_CTRL_REG1, 0x37}, /* normal mode, 400 Hz, X/Y/Z on: last */
25};
26
27static int write_reg(const dev_bus_t* bus, uint8_t reg, uint8_t value) {
28 const uint8_t tx[2] = {reg, value};
29 return bus->xfer(bus->ctx, tx, NULL, 2);
30}
31
32static int read_reg(const dev_bus_t* bus, uint8_t reg, uint8_t* value) {
33 const uint8_t tx[2] = {(uint8_t)(SPI_READ | reg), 0};
34 uint8_t rx[2];
35 int err = bus->xfer(bus->ctx, tx, rx, 2);
36 *value = rx[1];
37 return err;
38}
39
40int h3lis_init(const dev_bus_t* bus) {
41 if (!bus || !bus->xfer) {
42 return DEV_ERR_PARAM;
43 }
44 uint8_t value = 0;
45 if (read_reg(bus, REG_WHO_AM_I, &value) != DEV_OK) {
46 return DEV_ERR_BUS;
47 }
49 return DEV_ERR_ID;
50 }
51 for (size_t i = 0; i < sizeof(config) / sizeof(config[0]); ++i) {
52 if (write_reg(bus, config[i].reg, config[i].value) != DEV_OK ||
53 read_reg(bus, config[i].reg, &value) != DEV_OK) {
54 return DEV_ERR_BUS;
55 }
56 if (value != config[i].value) {
57 return DEV_ERR_VERIFY;
58 }
59 }
60 return DEV_OK;
61}
62
63int h3lis_power_down(const dev_bus_t* bus) {
64 if (!bus) {
65 return DEV_ERR_PARAM;
66 }
67 return write_reg(bus, REG_CTRL_REG1, 0x07) == DEV_OK ? DEV_OK : DEV_ERR_BUS;
68}
69
70int h3lis_read(const dev_bus_t* bus, h3lis_sample_t* out) {
71 if (!bus || !out) {
72 return DEV_ERR_PARAM;
73 }
74 const uint8_t tx[6] = {(uint8_t)(SPI_READ | SPI_INCREMENT | REG_OUT_X)};
75 uint8_t rx[6];
76 if (bus->xfer(bus->ctx, tx, rx, sizeof(tx)) != DEV_OK) {
77 return DEV_ERR_BUS;
78 }
79 /* 29h X, 2Ah reserved, 2Bh Y, 2Ch reserved, 2Dh Z */
80 out->accel[0] = (int8_t)rx[1];
81 out->accel[1] = (int8_t)rx[3];
82 out->accel[2] = (int8_t)rx[5];
83 return DEV_OK;
84}
@ DEV_ERR_VERIFY
Definition dev_bus.h:20
@ DEV_OK
Definition dev_bus.h:17
@ DEV_ERR_PARAM
Definition dev_bus.h:22
@ DEV_ERR_ID
Definition dev_bus.h:19
@ DEV_ERR_BUS
Definition dev_bus.h:18
#define SPI_READ
static int write_reg(const dev_bus_t *bus, uint8_t reg, uint8_t value)
int h3lis_power_down(const dev_bus_t *bus)
uint8_t reg
#define SPI_INCREMENT
static int read_reg(const dev_bus_t *bus, uint8_t reg, uint8_t *value)
@ REG_CTRL_REG4
@ REG_CTRL_REG3
@ REG_CTRL_REG1
@ REG_WHO_AM_I
@ REG_OUT_X
int h3lis_read(const dev_bus_t *bus, h3lis_sample_t *out)
int h3lis_init(const dev_bus_t *bus)
#define H3LIS_WHO_AM_I_VALUE
#define NULL
Definition usbd_def.h:44
static const idle_config_t config
Definition idle_task.c:17