embox

Форк
0
139 строк · 3.4 Кб
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

12
#include "hts221.h"
13
#include "hts221_transfer.h"
14

15
#define HTS221_WHO_AM_I		0xf
16
#define HTS221_AV_CONF_REG	0x10
17
#define HTS221_CTRL_REG(i)	(0x20 + i - 1)
18
#define HTS221_STATUS_REG	0x27
19
#define HTS221_HUMIDITY_OUT_L	0x28
20
#define HTS221_HUMIDITY_OUT_H	0x29
21
#define HTS221_TEMP_OUT_L	0x2A
22
#define HTS221_TEMP_OUT_H	0x2B
23
#define HTS221_H0_RH_X2		0x30
24
#define HTS221_H1_RH_X2		0x31
25
#define HTS221_T0_DEGC_X8	0x32
26
#define HTS221_T1_DEGC_X8	0x33
27
#define HTS221_T0_1_DEGC_X8_MSB	0x35
28
#define HTS221_H0_OUT_L		0x36
29
#define HTS221_H0_OUT_H		0x37
30
#define HTS221_H1_OUT_L		0x3a
31
#define HTS221_H1_OUT_H		0x3b
32
#define HTS221_T0_OUT_L		0x3c
33
#define HTS221_T0_OUT_H		0x3d
34
#define HTS221_T1_OUT_L		0x3e
35
#define HTS221_T1_OUT_H		0x3f
36

37

38
#define HTS221_WHO_AM_I_VALUE 0xbc
39

40
extern struct hts221_dev hts221_dev0;
41

42
static int16_t H0_rH_x2, dH_rH_x2, H0, dH, T0_degC_x8, dT_degC_x8, T0, dT;
43

44
int16_t hts221_get_humidity(void) {
45
	uint8_t l, h;
46
	int32_t H;
47
	struct hts221_dev *dev = &hts221_dev0;
48
	hts221_readb(dev, HTS221_HUMIDITY_OUT_L, &l);
49
	hts221_readb(dev, HTS221_HUMIDITY_OUT_H, &h);
50

51
	H = l | (int16_t) (h << 8);
52
	return ((H - H0) * dH_rH_x2 + (int32_t)dH * H0_rH_x2 + dH) / (2 * dH);
53
}
54

55
int16_t hts221_get_temp_x10(void) {
56
	uint8_t l, h;
57
	int32_t T;
58
	struct hts221_dev *dev = &hts221_dev0;
59
	hts221_readb(dev, HTS221_TEMP_OUT_L, &l);
60
	hts221_readb(dev, HTS221_TEMP_OUT_H, &h);
61

62
	T = l | (int16_t) (h << 8);
63
	return (((T - T0) * dT_degC_x8 + (int32_t)dT * T0_degC_x8) * 5 + 2 * dT) / (4 * dT);
64
}
65

66
int hts221_init(void) {
67
	int i;
68
	uint8_t tmp;
69
	struct hts221_dev *dev = &hts221_dev0;
70

71
	if (hts221_hw_init(dev) < 0) {
72
		log_error("HTS221 hw init failed!");
73
		return -1;
74
	}
75

76
	if (hts221_readb(dev, HTS221_WHO_AM_I, &tmp) < 0) {
77
		log_error("HTS221 readb failed!");
78
		return -1;
79
	}
80
	log_info("WHO_AM_I = 0x%02x", tmp);
81
	if (tmp != HTS221_WHO_AM_I_VALUE) {
82
		log_error("HTS221 Device ID mismatch! %2x", tmp);
83
		return -1;
84
	}
85

86
	tmp = 0x3;		/* Humidity average number is 32 */
87
	tmp |= (0x3 << 3);	/* Temperature average number is 16 */
88
	hts221_writeb(dev, HTS221_AV_CONF_REG, tmp);
89

90
	tmp = 0x1;		/* Output data rate is 1 Hz */
91
	tmp |= (1 << 2);	/* Block data update until MSB reading after LSB */
92
	tmp |= (1 << 7);	/* Active mode */
93
	hts221_writeb(dev, HTS221_CTRL_REG(1), tmp);
94

95
	for (i = 1; i <= 3; i++) {
96
		hts221_readb(dev, HTS221_CTRL_REG(i), &tmp);
97
		log_info("CTRL_REG%d = 0x%02x", i, tmp);
98
	}
99
	hts221_readb(dev, HTS221_STATUS_REG, &tmp);
100
	log_info("STATUS_REG = 0x%02x", tmp);
101

102
	hts221_readb(dev, HTS221_H0_RH_X2, &tmp);
103
	H0_rH_x2 = tmp;
104
	hts221_readb(dev, HTS221_H1_RH_X2, &tmp);
105
	dH_rH_x2 = tmp-H0_rH_x2;
106

107
	hts221_readb(dev, HTS221_H0_OUT_L, &tmp);
108
	H0 = tmp;
109
	hts221_readb(dev, HTS221_H0_OUT_H, &tmp);
110
	H0 |= (int16_t)tmp<<8;
111

112
	hts221_readb(dev, HTS221_H1_OUT_L, &tmp);
113
	dH = tmp;
114
	hts221_readb(dev, HTS221_H1_OUT_H, &tmp);
115
	dH |= (int16_t)tmp<<8;
116
	dH -= H0;
117

118
	hts221_readb(dev, HTS221_T0_DEGC_X8, &tmp);
119
	T0_degC_x8 = tmp;
120
	hts221_readb(dev, HTS221_T1_DEGC_X8, &tmp);
121
	dT_degC_x8 = tmp;
122
	hts221_readb(dev, HTS221_T0_1_DEGC_X8_MSB, &tmp);
123
	T0_degC_x8 |= (((uint16_t)tmp&0x3)<<8);
124
	dT_degC_x8 |= (((uint16_t)tmp&0xc)<<6);
125
	dT_degC_x8 -= T0_degC_x8;
126

127
	hts221_readb(dev, HTS221_T0_OUT_L, &tmp);
128
	T0 = tmp;
129
	hts221_readb(dev, HTS221_T0_OUT_H, &tmp);
130
	T0 |= (int16_t)tmp<<8;
131

132
	hts221_readb(dev, HTS221_T1_OUT_L, &tmp);
133
	dT = tmp;
134
	hts221_readb(dev, HTS221_T1_OUT_H, &tmp);
135
	dT |= (int16_t)tmp<<8;
136
	dT -= T0;
137

138
	return 0;
139
}
140

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

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

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

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