20
20
#include "AHT20.h"
21
21
#include <stdio.h>
22
22
#include <string.h>
23
+ #include <math.h>
23
24
24
25
/*
25
26
* device address for AHT20
@@ -53,6 +54,8 @@ static uint8_t INIT_CMD[3] = {0xbe, 0x08, 0x00};
53
54
*/
54
55
static uint8_t MEASURE_CMD [3 ] = {0xac , 0x33 , 0x00 };
55
56
57
+ static uint8_t calculate_crc (uint8_t * data );
58
+
56
59
/*
57
60
* sends reads status_word for further calibration verification
58
61
*
@@ -106,6 +109,8 @@ aht20_status_t aht20_calibrate(I2C_HandleTypeDef *hi2c, uint8_t status_word) {
106
109
* 5.4 Sensor reading process, paragraph 2
107
110
*/
108
111
aht20_status_t aht20_measure (I2C_HandleTypeDef * hi2c , uint8_t * measured_data ) {
112
+ uint8_t received_crc = 0 ;
113
+
109
114
if (HAL_OK != HAL_I2C_Master_Transmit (hi2c , DEVICE_ADDRESS , MEASURE_CMD , 3 , HAL_MAX_DELAY )) {
110
115
return AHT20_STATUS_NOT_TRANSMITTED ;
111
116
}
@@ -114,15 +119,56 @@ aht20_status_t aht20_measure(I2C_HandleTypeDef *hi2c, uint8_t *measured_data) {
114
119
uint8_t measuring_status = 0 ;
115
120
HAL_I2C_Master_Receive (hi2c , DEVICE_ADDRESS , & measuring_status , 1 , HAL_MAX_DELAY );
116
121
117
- if (measuring_status & (1 << 7 )) {
122
+ uint8_t all_data [7 ];
123
+ if (measuring_status & (1 << 7 )) {
118
124
return AHT20_STATUS_NOT_MEASURED ;
119
- }else {
120
- HAL_I2C_Master_Receive (hi2c , DEVICE_ADDRESS , measured_data , 6 , HAL_MAX_DELAY );
125
+ } else {
126
+ HAL_I2C_Master_Receive (hi2c , DEVICE_ADDRESS , all_data , 7 , HAL_MAX_DELAY );
127
+ }
128
+
129
+ // Copy 6 data bytes to measured_data
130
+ for (uint8_t i = 0 ; i < 6 ; i ++ ) {
131
+ measured_data [i ] = all_data [i ];
132
+ }
133
+ received_crc = all_data [6 ]; // CRC is the 7th byte
134
+
135
+ uint8_t calculated_crc = calculate_crc (measured_data );
136
+ if (calculated_crc == received_crc ) {
137
+ uint8_t ack = 0x06 ;
138
+ if (HAL_OK != HAL_I2C_Master_Transmit (hi2c , DEVICE_ADDRESS , & ack , 1 , HAL_MAX_DELAY )) {
139
+ return AHT20_STATUS_NOT_TRANSMITTED ;
140
+ }
141
+ } else {
142
+ uint8_t nack = 0x15 ;
143
+ if (HAL_OK != HAL_I2C_Master_Transmit (hi2c , DEVICE_ADDRESS , & nack , 1 , HAL_MAX_DELAY )) {
144
+ return AHT20_STATUS_NOT_TRANSMITTED ;
145
+ }
121
146
}
122
147
123
148
return AHT20_STATUS_OK ;
124
149
}
125
150
151
+ /*
152
+ * calculates crc8 for given data
153
+ */
154
+ static uint8_t calculate_crc (uint8_t * data ) {
155
+ uint8_t crc = 0xFF ;
156
+ uint8_t i = 0 , j = 0 ;
157
+
158
+ for (; i < 6 ; ++ i ) {
159
+ crc ^= data [i ];
160
+ for (j = 0 ; j < 8 ; ++ j ) {
161
+ if (crc & 0x80 ) {
162
+ crc = (crc << 1 ) ^ 0x31 ;
163
+ } else {
164
+ crc <<= 1 ;
165
+ }
166
+ }
167
+ }
168
+
169
+ return crc ;
170
+ }
171
+
126
172
/*
127
173
* calculates measured_data and writes the calculation in provided variables
128
174
*
0 commit comments