1 | /* |
---|
2 | * bme280.c |
---|
3 | * |
---|
4 | * Created: 08.01.2024 09:51:51 |
---|
5 | * Author: ecs |
---|
6 | */ |
---|
7 | |
---|
8 | #include <string.h> |
---|
9 | |
---|
10 | #include "bme280.h" |
---|
11 | |
---|
12 | static BME280_S32_t t_fine; |
---|
13 | static BME280_S64_t Var1, Var2; |
---|
14 | |
---|
15 | //----------------------------------------------------------------------------- |
---|
16 | |
---|
17 | /*uint8_t BME280_ReadDeviceID(TWI_Master_t* twi) |
---|
18 | { |
---|
19 | // Output buffer must contain only one byte, the ID itself - 0xD0 |
---|
20 | if (1 == twi->bytesRead) return twi->readData[0]; |
---|
21 | return 0; |
---|
22 | } |
---|
23 | |
---|
24 | //----------------------------------------------------------------------------- |
---|
25 | |
---|
26 | uint8_t BME280_ReadDeviceStatus(TWI_Master_t* twi) |
---|
27 | { |
---|
28 | if (1 == twi->bytesRead) return twi->readData[0]; |
---|
29 | return 0; |
---|
30 | } |
---|
31 | |
---|
32 | //----------------------------------------------------------------------------- |
---|
33 | |
---|
34 | uint32_t BME280_ReadPress(TWI_Master_t* twi) |
---|
35 | { |
---|
36 | if (8 == twi->bytesRead) |
---|
37 | { |
---|
38 | uint32_t press = (((uint32_t)twi->readData[0]) << 12) + (((uint32_t)twi->readData[1]) << 4) + (((uint32_t)twi->readData[2]) & 0xF); |
---|
39 | return press; |
---|
40 | } |
---|
41 | return 0; |
---|
42 | } |
---|
43 | |
---|
44 | //----------------------------------------------------------------------------- |
---|
45 | |
---|
46 | uint32_t BME280_ReadTemp(TWI_Master_t* twi) |
---|
47 | { |
---|
48 | if (8 == twi->bytesRead) |
---|
49 | { |
---|
50 | uint32_t temp = (((uint32_t)twi->readData[3]) << 12) + (((uint32_t)twi->readData[4]) << 4) + (((uint32_t)twi->readData[5]) & 0xF); |
---|
51 | return temp; |
---|
52 | } |
---|
53 | return 0; |
---|
54 | } |
---|
55 | |
---|
56 | //----------------------------------------------------------------------------- |
---|
57 | |
---|
58 | uint16_t BME280_ReadHum(TWI_Master_t* twi) |
---|
59 | { |
---|
60 | if (8 == twi->bytesRead) |
---|
61 | { |
---|
62 | uint16_t hum = (((uint16_t)twi->readData[6]) << 8) + ((uint16_t)twi->readData[7]); |
---|
63 | return hum; |
---|
64 | } |
---|
65 | return 0; |
---|
66 | } |
---|
67 | |
---|
68 | //----------------------------------------------------------------------------- |
---|
69 | |
---|
70 | int BME280_Calib00_25(TWI_Master_t* twi, BME280_Calib_0_t* digs) |
---|
71 | { |
---|
72 | if (sizeof(BME280_Calib_0_t) == twi->bytesRead) |
---|
73 | { |
---|
74 | memcpy(digs, (void*)twi->readData, sizeof(BME280_Calib_0_t)); |
---|
75 | return 0; |
---|
76 | } |
---|
77 | return 1; |
---|
78 | } |
---|
79 | |
---|
80 | //----------------------------------------------------------------------------- |
---|
81 | |
---|
82 | int BME280_Calib26_32(TWI_Master_t* twi, BME280_Calib_1_t* digs) |
---|
83 | { |
---|
84 | if (sizeof(BME280_Calib_1_t) == twi->bytesRead) |
---|
85 | { |
---|
86 | digs->dig_H2 = (int16_t)((((uint16_t)twi->readData[1]) << 8) + (uint16_t)twi->readData[0]); |
---|
87 | digs->dig_H3 = twi->readData[2]; |
---|
88 | digs->dig_H4 = (int16_t)((((uint16_t)twi->readData[3]) << 4) + (((uint16_t)twi->readData[4]) & 0xF)); |
---|
89 | digs->dig_H5 = (int16_t)((((uint16_t)twi->readData[6]) << 4) + (((uint16_t)twi->readData[5]) >> 4)); |
---|
90 | digs->dig_H6 = (int8_t)twi->readData[7]; |
---|
91 | return 0; |
---|
92 | } |
---|
93 | return 1; |
---|
94 | } |
---|
95 | |
---|
96 | //----------------------------------------------------------------------------- |
---|
97 | |
---|
98 | BME280_S32_t BME280_compensate_T(BME280_S32_t adc_T, BME280_Calib_0_t* digs) |
---|
99 | { |
---|
100 | BME280_S32_t var1, var2, T; |
---|
101 | |
---|
102 | var1 = ((((adc_T / 8U) - ((BME280_S32_t)digs->dig_T1 << 1))) * ((BME280_S32_t)digs->dig_T2)) >> 11; |
---|
103 | var2 = (((((adc_T >> 4) - ((BME280_S32_t)digs->dig_T1)) * ((adc_T) - ((BME280_S32_t)digs->dig_T1))) >> 12) * ((BME280_S32_t)digs->dig_T3)) >> 14; |
---|
104 | t_fine = var1 + var2; |
---|
105 | T = (t_fine * 5 + 128) >> 8; |
---|
106 | |
---|
107 | return T; |
---|
108 | } |
---|
109 | |
---|
110 | //----------------------------------------------------------------------------- |
---|
111 | |
---|
112 | void BME280_compensate_P_step1(BME280_Calib_0_t* digs) |
---|
113 | { |
---|
114 | BME280_S64_t var1, var2; |
---|
115 | |
---|
116 | var1 = ((BME280_S64_t)t_fine) - 128000; |
---|
117 | var2 = var1 * var1 * (BME280_S64_t)digs->dig_P6; |
---|
118 | var2 = var2 + ((var1 * (BME280_S64_t)digs->dig_P5) << 17U); |
---|
119 | var2 = var2 + (((BME280_S64_t)digs->dig_P4) << 35U); |
---|
120 | var1 = ((var1 * var1 * (BME280_S64_t)digs->dig_P3) >> 8U) + ((var1 * (BME280_S64_t)digs->dig_P2) << 12U); |
---|
121 | var1 = (((((BME280_S64_t)1) << 47U) + var1)) * ((BME280_S64_t)digs->dig_P1) >> 33U; |
---|
122 | |
---|
123 | Var1 = var1; |
---|
124 | Var2 = var2; |
---|
125 | } |
---|
126 | |
---|
127 | //----------------------------------------------------------------------------- |
---|
128 | |
---|
129 | BME280_U32_t BME280_compensate_P_step2(BME280_S32_t adc_P, BME280_Calib_0_t* digs) |
---|
130 | { |
---|
131 | if (Var1 == 0U) return 0U; |
---|
132 | |
---|
133 | BME280_S64_t var1, var2, P; |
---|
134 | |
---|
135 | var1 = Var1; |
---|
136 | var2 = Var2; |
---|
137 | |
---|
138 | P = (BME280_S32_t)((BME280_U32_t)1 << 20U) - adc_P; |
---|
139 | P = (((P << 31U) - var2) * 3125) / var1; |
---|
140 | var1 = (((BME280_S64_t)digs->dig_P9) * (P >> 13U) * (P >> 13)) >> 25U; |
---|
141 | var2 = (((BME280_S64_t)digs->dig_P8) * P) >> 19U; |
---|
142 | P = ((P + var1 + var2) >> 8U) + (((BME280_S64_t)digs->dig_P7) << 4U); |
---|
143 | |
---|
144 | return (BME280_U32_t)P; |
---|
145 | } |
---|
146 | |
---|
147 | //----------------------------------------------------------------------------- |
---|
148 | |
---|
149 | BME280_U32_t BME280_compensate_H(BME280_S32_t adc_H, BME280_Calib_0_t* dig0s, BME280_Calib_1_t* dig1s) |
---|
150 | { |
---|
151 | BME280_S32_t v_x1_u32r; |
---|
152 | |
---|
153 | v_x1_u32r = (t_fine - ((BME280_S32_t)76800)); |
---|
154 | v_x1_u32r = (((((adc_H << 14U) - (((BME280_S32_t)dig1s->dig_H4) << 20U) - (((BME280_S32_t)dig1s->dig_H5) * v_x1_u32r)) + ((BME280_S32_t)16384)) >> 15U) * (((((((v_x1_u32r * ((BME280_S32_t)dig1s->dig_H6)) >> 10U) * (((v_x1_u32r * ((BME280_S32_t)dig1s->dig_H3)) >> 11) + ((BME280_S32_t)32768))) >> 10) + ((BME280_S32_t)2097152)) * ((BME280_S32_t)dig1s->dig_H2) + 8192) >> 14U)); |
---|
155 | |
---|
156 | //v_x1_u32r = (((((adc_H << 14U) - (dig_H4 << 20U) - (dig_H5 * v_x1_u32r)) + 16384) >> 15U) * (((((((v_x1_u32r * dig_H6) >> 10U) * (((v_x1_u32r * dig_H3) >> 11) + 32768)) >> 10) + 2097152) * dig_H2 + 8192) >> 14U)); |
---|
157 | |
---|
158 | v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15U) * (v_x1_u32r >> 15U)) >> 7U) * ((BME280_S32_t)dig0s->dig_H1)) >> 4U)); |
---|
159 | v_x1_u32r = (v_x1_u32r < 0 ? 0: v_x1_u32r); |
---|
160 | v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400: v_x1_u32r); |
---|
161 | |
---|
162 | return (BME280_U32_t)(v_x1_u32r >> 12U); |
---|
163 | } |
---|
164 | */ |
---|
165 | //----------------------------------------------------------------------------- |
---|