embox

Форк
0
91 строка · 2.4 Кб
1
/**
2
 * @file adxl345.c
3
 * @brief G-Sensor
4
 * @author Denis Deryugin <deryugin.denis@gmail.com>
5
 * @version
6
 * @date 17.12.2019
7
 */
8

9
#include <stdint.h>
10

11
#include <drivers/i2c/i2c.h>
12
#include <drivers/sensors/adxl345.h>
13
#include <framework/mod/options.h>
14
#include <util/log.h>
15

16
#define ADXL345_DEVID           0x00
17
#define ADXL345_OFSX            0x1E
18
#define ADXL345_OFSY            0x1F
19
#define ADXL345_OFSZ            0x20
20
#define ADXL345_OFS_AXIS(index) (ADXL345_REG_OFSX + (index))
21
#define ADXL345_BW_RATE         0x2C
22
#define ADXL345_POWER_CTL       0x2D
23
# define ADXL345_POWER_CTL_MSR  (1 << 3)
24
#define ADXL345_DATA_FORMAT     0x31
25
#define ADXL345_DATAX0          0x32
26
#define ADXL345_DATAY0          0x34
27
#define ADXL345_DATAZ0          0x36
28
#define ADXL345_DATA_AXIS(n)    (ADXL345_DATAX0 + (n))
29

30
#define ADXL345_DEVID_VALUE     0xE5
31

32
#define ADXL345_BUS    OPTION_GET(NUMBER, bus)
33
#define ADXL345_ADDR   OPTION_GET(NUMBER, addr)
34

35
struct adxl345_dev {
36
	int i2c_bus;
37
	int i2c_addr;
38
};
39

40
/* Note: ADXL345 supports i2c and spi read/write ops,
41
 * but for now we use only i2c bus */
42
static uint8_t adxl345_readb(struct adxl345_dev *dev, int offset) {
43
	uint8_t ret = offset;
44
	i2c_bus_write(dev->i2c_bus, dev->i2c_addr, &ret, sizeof(ret));
45
	i2c_bus_read(dev->i2c_bus, dev->i2c_addr, &ret, sizeof(ret));
46
	return ret;
47
}
48

49
static void adxl345_writeb(struct adxl345_dev *dev, int offset, uint8_t val) {
50
	uint16_t tmp = (offset & 0xFF) | (val << 8);
51
	i2c_bus_write(dev->i2c_bus, dev->i2c_addr, (void *) &tmp, sizeof(tmp));
52
}
53

54
static struct adxl345_dev adxl345_dev = {
55
	.i2c_bus  = ADXL345_BUS,
56
	.i2c_addr = ADXL345_ADDR
57
};
58

59
int16_t adxl345_get_x(void) {
60
	struct adxl345_dev *dev = &adxl345_dev;
61
	return (int16_t) (adxl345_readb(dev, ADXL345_DATA_AXIS(0)) +
62
		(adxl345_readb(dev, ADXL345_DATA_AXIS(1)) << 8));
63
}
64

65
int16_t adxl345_get_y(void) {
66
	struct adxl345_dev *dev = &adxl345_dev;
67
	return (int16_t) (adxl345_readb(dev, ADXL345_DATA_AXIS(2)) +
68
		(adxl345_readb(dev, ADXL345_DATA_AXIS(3)) << 8));
69
}
70

71
int16_t adxl345_get_z(void) {
72
	struct adxl345_dev *dev = &adxl345_dev;
73
	return (int16_t) (adxl345_readb(dev, ADXL345_DATA_AXIS(4)) +
74
		(adxl345_readb(dev, ADXL345_DATA_AXIS(5)) << 8));
75
}
76

77
int adxl345_init(void) {
78
	uint8_t tmp;
79
	struct adxl345_dev *dev = &adxl345_dev;
80

81
	tmp = adxl345_readb(dev, ADXL345_DEVID);
82
	if (tmp != ADXL345_DEVID_VALUE) {
83
		log_error("ADXL345 Device ID mismatch! %2x", tmp);
84
		return -1;
85
	}
86

87
	adxl345_writeb(dev, ADXL345_POWER_CTL,
88
			ADXL345_POWER_CTL_MSR);
89

90
	return 0;
91
}
92

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

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

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

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