embox

Форк
0
111 строк · 2.8 Кб
1
/**
2
 * @file
3
 * @brief
4
 *
5
 * @date 21.04.2023
6
 * @author Andrew Bursian
7
 */
8

9
#include <unistd.h>
10
#include <util/log.h>
11
#include <endian.h>
12

13
#include "lis3mdl.h"
14
#include "lis3mdl_transfer.h"
15

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
31

32

33
#define LIS3MDL_WHO_AM_I_VALUE 0x3d
34

35
#define LIS3MDL_FS4_SENSITIVITY		6842
36
#define LIS3MDL_FS8_SENSITIVITY		3421
37
#define LIS3MDL_FS12_SENSITIVITY	2281
38
#define LIS3MDL_FS16_SENSITIVITY	1711
39

40
#define LIS3MDL_T_OFFSET		(25*8)
41

42
extern struct lis3mdl_dev lis3mdl_dev0;
43

44
static int sens;
45

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);
58
	data->sens = sens;
59
}
60

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]));
66

67
	return le16toh(t.val) + LIS3MDL_T_OFFSET;
68
}
69

70
int lis3mdl_init(void) {
71
	int i;
72
	uint8_t tmp;
73
	struct lis3mdl_dev *dev = &lis3mdl_dev0;
74

75
	if (lis3mdl_hw_init(dev) < 0) {
76
		log_error("LIS3MDL hw init failed!");
77
		return -1;
78
	}
79

80
	if (lis3mdl_readb(dev, LIS3MDL_WHO_AM_I, &tmp) < 0) {
81
		log_error("LIS3MDL readb failed!");
82
		return -1;
83
	}
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);
87
		return -1;
88
	}
89

90
	tmp = 0x80;	/* Temperature sensor enable */
91
	tmp |= 1<<2;	/* Output data rate 1.25 Hz */
92
	lis3mdl_writeb(dev, LIS3MDL_CTRL_REG(1), tmp);
93

94
	tmp = 0 << 5;	/* Full-scale +-4 gauss */
95
	sens = LIS3MDL_FS4_SENSITIVITY;
96
	lis3mdl_writeb(dev, LIS3MDL_CTRL_REG(2), tmp);
97

98
	tmp = 0;	/* Continuous-conversion mode */
99
	lis3mdl_writeb(dev, LIS3MDL_CTRL_REG(3), tmp);
100

101
	tmp = 0x40;	/* Block data update for magnetic data */
102
	lis3mdl_writeb(dev, LIS3MDL_CTRL_REG(5), tmp);
103

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);
107
	}
108
	lis3mdl_readb(dev, LIS3MDL_STATUS_REG, &tmp);
109
	log_info("STATUS_REG = 0x%02x", tmp);
110
	return 0;
111
}
112

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.