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
5
enum
{
6
REG_WHO_AM_I
= 0x0F,
7
REG_CTRL_REG1
= 0x20,
8
REG_CTRL_REG3
= 0x22,
9
REG_CTRL_REG4
= 0x23,
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
18
static
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
27
static
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
32
static
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
40
int
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
}
48
if
(
value
!=
H3LIS_WHO_AM_I_VALUE
) {
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
63
int
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
70
int
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
}
value
Definition
toml.hpp:1472
DEV_ERR_VERIFY
@ DEV_ERR_VERIFY
Definition
dev_bus.h:20
DEV_OK
@ DEV_OK
Definition
dev_bus.h:17
DEV_ERR_PARAM
@ DEV_ERR_PARAM
Definition
dev_bus.h:22
DEV_ERR_ID
@ DEV_ERR_ID
Definition
dev_bus.h:19
DEV_ERR_BUS
@ DEV_ERR_BUS
Definition
dev_bus.h:18
SPI_READ
#define SPI_READ
Definition
dev_h3lis100dl.c:15
write_reg
static int write_reg(const dev_bus_t *bus, uint8_t reg, uint8_t value)
Definition
dev_h3lis100dl.c:27
h3lis_power_down
int h3lis_power_down(const dev_bus_t *bus)
Definition
dev_h3lis100dl.c:63
reg
uint8_t reg
Definition
dev_h3lis100dl.c:19
SPI_INCREMENT
#define SPI_INCREMENT
Definition
dev_h3lis100dl.c:16
read_reg
static int read_reg(const dev_bus_t *bus, uint8_t reg, uint8_t *value)
Definition
dev_h3lis100dl.c:32
REG_CTRL_REG4
@ REG_CTRL_REG4
Definition
dev_h3lis100dl.c:9
REG_CTRL_REG3
@ REG_CTRL_REG3
Definition
dev_h3lis100dl.c:8
REG_CTRL_REG1
@ REG_CTRL_REG1
Definition
dev_h3lis100dl.c:7
REG_WHO_AM_I
@ REG_WHO_AM_I
Definition
dev_h3lis100dl.c:6
REG_OUT_X
@ REG_OUT_X
Definition
dev_h3lis100dl.c:10
h3lis_read
int h3lis_read(const dev_bus_t *bus, h3lis_sample_t *out)
Definition
dev_h3lis100dl.c:70
h3lis_init
int h3lis_init(const dev_bus_t *bus)
Definition
dev_h3lis100dl.c:40
dev_h3lis100dl.h
H3LIS_WHO_AM_I_VALUE
#define H3LIS_WHO_AM_I_VALUE
Definition
dev_h3lis100dl.h:29
NULL
#define NULL
Definition
usbd_def.h:44
config
static const idle_config_t config
Definition
idle_task.c:17
dev_bus_t
Definition
dev_bus.h:26
h3lis_sample_t
Definition
dev_h3lis100dl.h:32
firmware
Flight_Computer
src
chips
dev_h3lis100dl.c
Generated by
1.15.0