-
Notifications
You must be signed in to change notification settings - Fork 6
/
si7051.c
144 lines (79 loc) · 2.11 KB
/
si7051.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "si7051.h"
#include "string.h"
#include "nrf_pwr_mgmt.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#define Si7051_ADDRESS 0x40
static nrf_drv_twi_t m_twi;
static void wait_100_ms() {
si7051_100_ms_timer = 0x00;
while (!si7051_100_ms_timer) {
if (NRF_LOG_PROCESS() == false) {
nrf_pwr_mgmt_run();
}
}
}
void set_si7051_i2c_instance(nrf_drv_twi_t twi_instance) {
m_twi = twi_instance;
}
static uint8_t i2c_write8(uint8_t address, uint8_t reg) {
uint16_t timeout = UINT16_MAX;
uint8_t txBuffer = reg;
twi_write_done = 0x00;
twi_read_done = 0x00;
twi_address_nack = 0x00;
ret_code_t result = nrf_drv_twi_tx(&m_twi, address, &txBuffer, 1, true);
if (result == NRF_SUCCESS) {
while (!twi_write_done && --timeout) {
}
if (!timeout || twi_address_nack) {
return 0x00;
} else {
return 0x01;
}
} else {
return 0x00;
}
}
static uint8_t i2c_read_buffer(uint8_t address, uint8_t *read_value,
const uint8_t buffer_size) {
uint16_t timeout = UINT16_MAX;
uint8_t rxBuffer[buffer_size];
twi_write_done = 0x00;
twi_read_done = 0x00;
twi_address_nack = 0x00;
ret_code_t result = nrf_drv_twi_rx(&m_twi, address, rxBuffer, buffer_size);
if (result == NRF_SUCCESS) {
while (!twi_write_done && --timeout) {
}
memcpy(read_value, rxBuffer, buffer_size);
if (!timeout || twi_address_nack) {
return 0x00;
} else {
return 0x01;
}
} else {
return 0x00;
}
}
uint8_t init_si7051(void) {
uint8_t i2c_state = i2c_write8(Si7051_ADDRESS, 0xFE);
for (uint8_t i = 0; i < 2; i++) {
wait_100_ms();
}
return i2c_state;
}
uint8_t get_si7051_temperature(int16_t *temperature_output) {
uint8_t i2c_state = 0x00;
uint8_t read_buffer[2] = { 0x00 };
i2c_state = i2c_write8(Si7051_ADDRESS, 0xF3);
for (uint8_t i = 0; i < 2; i++) {
wait_100_ms();
}
i2c_state = i2c_state & i2c_read_buffer(Si7051_ADDRESS, read_buffer, 2);
uint16_t temperature = (read_buffer[0] << 8) + read_buffer[1];
float temperature_si7051 =
((((float) temperature * 175.72) / 65536) - 46.85);
*temperature_output = (int16_t) (temperature_si7051 * 10);
return i2c_state;
}