14
#include "lis3mdl_transfer.h"
16
#define LIS3MDL_WHO_AM_I 0xf
17
#define LIS3MDL_CTRL_REG(i) (0x20 + i - 1)
18
#define LIS3MDL_STATUS_REG 0x27
19
#define LIS3MDL_OUT_X_L 0x28
20
#define LIS3MDL_OUT_X_H 0x29
21
#define LIS3MDL_OUT_Y_L 0x2a
22
#define LIS3MDL_OUT_Y_H 0x2b
23
#define LIS3MDL_OUT_Z_L 0x2c
24
#define LIS3MDL_OUT_Z_H 0x2d
25
#define LIS3MDL_TEMP_OUT_L 0x2e
26
#define LIS3MDL_TEMP_OUT_H 0x2f
27
#define LIS3MDL_INT_CFG 0x30
28
#define LIS3MDL_INT_SRC 0x31
29
#define LIS3MDL_INT_THS_L 0x32
30
#define LIS3MDL_INT_THS_H 0x33
33
#define LIS3MDL_WHO_AM_I_VALUE 0x3d
35
#define LIS3MDL_FS4_SENSITIVITY 6842
36
#define LIS3MDL_FS8_SENSITIVITY 3421
37
#define LIS3MDL_FS12_SENSITIVITY 2281
38
#define LIS3MDL_FS16_SENSITIVITY 1711
40
#define LIS3MDL_T_OFFSET (25*8)
42
extern struct lis3mdl_dev lis3mdl_dev0;
46
void lis3mdl_get_data(struct lis3mdl_s *data) {
47
struct lis3mdl_dev *dev = &lis3mdl_dev0;
48
union {int16_t val; uint8_t b[2];}m;
49
lis3mdl_readb(dev, LIS3MDL_OUT_X_L, &(m.b[0]));
50
lis3mdl_readb(dev, LIS3MDL_OUT_X_H, &(m.b[1]));
51
data->x = le16toh(m.val);
52
lis3mdl_readb(dev, LIS3MDL_OUT_Y_L, &(m.b[0]));
53
lis3mdl_readb(dev, LIS3MDL_OUT_Y_H, &(m.b[1]));
54
data->y = le16toh(m.val);
55
lis3mdl_readb(dev, LIS3MDL_OUT_Z_L, &(m.b[0]));
56
lis3mdl_readb(dev, LIS3MDL_OUT_Z_H, &(m.b[1]));
57
data->z = le16toh(m.val);
61
int16_t lis3mdl_get_temp_x8(void) {
62
struct lis3mdl_dev *dev = &lis3mdl_dev0;
63
union {int16_t val; uint8_t b[2];}t;
64
lis3mdl_readb(dev, LIS3MDL_TEMP_OUT_L, &(t.b[0]));
65
lis3mdl_readb(dev, LIS3MDL_TEMP_OUT_H, &(t.b[1]));
67
return le16toh(t.val) + LIS3MDL_T_OFFSET;
70
int lis3mdl_init(void) {
73
struct lis3mdl_dev *dev = &lis3mdl_dev0;
75
if (lis3mdl_hw_init(dev) < 0) {
76
log_error("LIS3MDL hw init failed!");
80
if (lis3mdl_readb(dev, LIS3MDL_WHO_AM_I, &tmp) < 0) {
81
log_error("LIS3MDL readb failed!");
84
log_info("WHO_AM_I = 0x%02x", tmp);
85
if (tmp != LIS3MDL_WHO_AM_I_VALUE) {
86
log_error("LIS3MDL Device ID mismatch! %2x", tmp);
92
lis3mdl_writeb(dev, LIS3MDL_CTRL_REG(1), tmp);
95
sens = LIS3MDL_FS4_SENSITIVITY;
96
lis3mdl_writeb(dev, LIS3MDL_CTRL_REG(2), tmp);
99
lis3mdl_writeb(dev, LIS3MDL_CTRL_REG(3), tmp);
102
lis3mdl_writeb(dev, LIS3MDL_CTRL_REG(5), tmp);
104
for (i = 1; i <= 3; i++) {
105
lis3mdl_readb(dev, LIS3MDL_CTRL_REG(i), &tmp);
106
log_info("CTRL_REG%d = 0x%02x", i, tmp);
108
lis3mdl_readb(dev, LIS3MDL_STATUS_REG, &tmp);
109
log_info("STATUS_REG = 0x%02x", tmp);