13
#include "hts221_transfer.h"
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
38
#define HTS221_WHO_AM_I_VALUE 0xbc
40
extern struct hts221_dev hts221_dev0;
42
static int16_t H0_rH_x2, dH_rH_x2, H0, dH, T0_degC_x8, dT_degC_x8, T0, dT;
44
int16_t hts221_get_humidity(void) {
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);
51
H = l | (int16_t) (h << 8);
52
return ((H - H0) * dH_rH_x2 + (int32_t)dH * H0_rH_x2 + dH) / (2 * dH);
55
int16_t hts221_get_temp_x10(void) {
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);
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);
66
int hts221_init(void) {
69
struct hts221_dev *dev = &hts221_dev0;
71
if (hts221_hw_init(dev) < 0) {
72
log_error("HTS221 hw init failed!");
76
if (hts221_readb(dev, HTS221_WHO_AM_I, &tmp) < 0) {
77
log_error("HTS221 readb failed!");
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);
88
hts221_writeb(dev, HTS221_AV_CONF_REG, tmp);
93
hts221_writeb(dev, HTS221_CTRL_REG(1), tmp);
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);
99
hts221_readb(dev, HTS221_STATUS_REG, &tmp);
100
log_info("STATUS_REG = 0x%02x", tmp);
102
hts221_readb(dev, HTS221_H0_RH_X2, &tmp);
104
hts221_readb(dev, HTS221_H1_RH_X2, &tmp);
105
dH_rH_x2 = tmp-H0_rH_x2;
107
hts221_readb(dev, HTS221_H0_OUT_L, &tmp);
109
hts221_readb(dev, HTS221_H0_OUT_H, &tmp);
110
H0 |= (int16_t)tmp<<8;
112
hts221_readb(dev, HTS221_H1_OUT_L, &tmp);
114
hts221_readb(dev, HTS221_H1_OUT_H, &tmp);
115
dH |= (int16_t)tmp<<8;
118
hts221_readb(dev, HTS221_T0_DEGC_X8, &tmp);
120
hts221_readb(dev, HTS221_T1_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;
127
hts221_readb(dev, HTS221_T0_OUT_L, &tmp);
129
hts221_readb(dev, HTS221_T0_OUT_H, &tmp);
130
T0 |= (int16_t)tmp<<8;
132
hts221_readb(dev, HTS221_T1_OUT_L, &tmp);
134
hts221_readb(dev, HTS221_T1_OUT_H, &tmp);
135
dT |= (int16_t)tmp<<8;