LibDriver BME688
Loading...
Searching...
No Matches
driver_bme688_parallel_test.c
Go to the documentation of this file.
1
36
38
39static bme688_handle_t gs_handle;
40static uint8_t gs_flag = 0;
41static const float gsc_heater_temp_prof[] = {320.0f, 100.0f, 330.0f, 350.0f,
42 400.0f, 150.0f, 200.0f, 250.0f,
43 300.0f, 350.0f};
44static const uint8_t gsc_heater_dur_prof[] = {5, 10, 5, 5, 5, 10, 5, 5, 5, 5};
45static const float gsc_shared_heater_dur = 140.0f;
46
54static void a_receive_callback(uint8_t status, bme688_parallel_data_t *data, uint8_t len)
55{
56 switch (status)
57 {
59 {
60 /* output */
61 bme688_interface_debug_print("bme688: irq channel data.\n");
62
63 /* print all */
64 bme688_interface_debug_print("bme688: [%d] temperature raw is 0x%08X.\n", data->channel, data->temperature_raw);
65 bme688_interface_debug_print("bme688: [%d] temperature is %0.2fC.\n", data->channel, data->temperature_c);
66 bme688_interface_debug_print("bme688: [%d] pressure raw is 0x%08X.\n", data->channel, data->pressure_raw);
67 bme688_interface_debug_print("bme688: [%d] pressure is %0.2fpa.\n", data->channel, data->pressure_pa);
68 bme688_interface_debug_print("bme688: [%d] humidity raw is 0x%08X.\n", data->channel, data->humidity_raw);
69 bme688_interface_debug_print("bme688: [%d] humidity is %0.2f%%.\n", data->channel, data->humidity_percentage);
70 bme688_interface_debug_print("bme688: [%d] adc raw is 0x%04X.\n", data->channel, data->adc_raw);
71 bme688_interface_debug_print("bme688: [%d] adc range is 0x%02X.\n", data->channel, data->adc_range);
72 bme688_interface_debug_print("bme688: [%d] resistance ohms is %0.2fohms.\n", data->channel,data->ohms);
73
74 break;
75 }
77 {
78 uint8_t i;
79
80 /* output */
81 bme688_interface_debug_print("bme688: irq all data.\n");
82
83 /* print all */
84 for (i = 0; i < len; i++)
85 {
86 bme688_interface_debug_print("bme688: [%d] temperature raw is 0x%08X.\n", i, data[i].temperature_raw);
87 bme688_interface_debug_print("bme688: [%d] temperature is %0.2fC.\n", i, data[i].temperature_c);
88 bme688_interface_debug_print("bme688: [%d] pressure raw is 0x%08X.\n", i, data[i].pressure_raw);
89 bme688_interface_debug_print("bme688: [%d] pressure is %0.2fpa.\n", i, data[i].pressure_pa);
90 bme688_interface_debug_print("bme688: [%d] humidity raw is 0x%08X.\n", i, data[i].humidity_raw);
91 bme688_interface_debug_print("bme688: [%d] humidity is %0.2f%%.\n", i, data[i].humidity_percentage);
92 bme688_interface_debug_print("bme688: [%d] adc raw is 0x%04X.\n", i, data[i].adc_raw);
93 bme688_interface_debug_print("bme688: [%d] adc range is 0x%02X.\n", i, data[i].adc_range);
94 bme688_interface_debug_print("bme688: [%d] resistance ohms is %0.2fohms.\n", i, data[i].ohms);
95 }
96
97 /* flag done */
98 gs_flag = 1;
99
100 break;
101 }
103 {
104 /* output */
105 bme688_interface_debug_print("bme688: irq sequence lost.\n");
106
107 /* parallel reset */
108 (void)bme688_parallel_reset(&gs_handle);
109
110 /* flag error */
111 gs_flag = 2;
112
113 break;
114 }
115 default :
116 {
117 bme688_interface_debug_print("bme688: unknown code.\n");
118
119 break;
120 }
121 }
122}
123
134uint8_t bme688_parallel_test(bme688_interface_t interface, bme688_address_t addr_pin, uint32_t times)
135{
136 uint8_t res;
138 bme688_info_t info;
139
140 /* link interface function */
152 DRIVER_BME688_LINK_RECEIVE_CALLBACK(&gs_handle, a_receive_callback);
153
154 /* get bme688 info */
155 res = bme688_info(&info);
156 if (res != 0)
157 {
158 bme688_interface_debug_print("bme688: get info failed.\n");
159
160 return 1;
161 }
162 else
163 {
164 /* print bme688 */
165 bme688_interface_debug_print("bme688: chip is %s.\n", info.chip_name);
166 bme688_interface_debug_print("bme688: manufacturer is %s.\n", info.manufacturer_name);
167 bme688_interface_debug_print("bme688: interface is %s.\n", info.interface);
168 bme688_interface_debug_print("bme688: driver version is %d.%d.\n", info.driver_version / 1000, (info.driver_version % 1000) / 100);
169 bme688_interface_debug_print("bme688: min supply voltage is %0.1fV.\n", info.supply_voltage_min_v);
170 bme688_interface_debug_print("bme688: max supply voltage is %0.1fV.\n", info.supply_voltage_max_v);
171 bme688_interface_debug_print("bme688: max current is %0.2fmA.\n", info.max_current_ma);
172 bme688_interface_debug_print("bme688: max temperature is %0.1fC.\n", info.temperature_max);
173 bme688_interface_debug_print("bme688: min temperature is %0.1fC.\n", info.temperature_min);
174 }
175
176 /* start parallel test */
177 bme688_interface_debug_print("bme688: start parallel test.\n");
178
179 /* set interface */
180 res = bme688_set_interface(&gs_handle, interface);
181 if (res != 0)
182 {
183 bme688_interface_debug_print("bme688: set interface failed.\n");
184
185 return 1;
186 }
187
188 /* set addr pin */
189 res = bme688_set_addr_pin(&gs_handle, addr_pin);
190 if (res != 0)
191 {
192 bme688_interface_debug_print("bme688: set addr pin failed.\n");
193
194 return 1;
195 }
196
197 /* init */
198 res = bme688_init(&gs_handle);
199 if (res != 0)
200 {
201 bme688_interface_debug_print("bme688: init failed.\n");
202
203 return 1;
204 }
205
206 /* set spi wire4 */
207 res = bme688_set_spi_wire(&gs_handle, BME688_SPI_WIRE_4);
208 if (res != 0)
209 {
210 bme688_interface_debug_print("bme688: set spi wire failed.\n");
211 (void)bme688_deinit(&gs_handle);
212
213 return 1;
214 }
215
216 /* set humidity oversampling x1 */
218 if (res != 0)
219 {
220 bme688_interface_debug_print("bme688: set humidity oversampling failed.\n");
221 (void)bme688_deinit(&gs_handle);
222
223 return 1;
224 }
225
226 /* set temperature oversampling x2 */
228 if (res != 0)
229 {
230 bme688_interface_debug_print("bme688: set temperature oversampling failed.\n");
231 (void)bme688_deinit(&gs_handle);
232
233 return 1;
234 }
235
236 /* set pressure oversampling x16 */
238 if (res != 0)
239 {
240 bme688_interface_debug_print("bme688: set pressure oversampling failed.\n");
241 (void)bme688_deinit(&gs_handle);
242
243 return 1;
244 }
245
246 /* set filter 15 */
247 res = bme688_set_filter(&gs_handle, BME688_FILTER_COEFF_15);
248 if (res != 0)
249 {
250 bme688_interface_debug_print("bme688: set filter failed.\n");
251 (void)bme688_deinit(&gs_handle);
252
253 return 1;
254 }
255
256 /* set sleep mode */
257 res = bme688_set_mode(&gs_handle, BME688_MODE_SLEEP);
258 if (res != 0)
259 {
260 bme688_interface_debug_print("bme688: set mode failed.\n");
261 (void)bme688_deinit(&gs_handle);
262
263 return 1;
264 }
265
266 /* parallel config */
267 config.heater_temp_prof = gsc_heater_temp_prof;
268 config.heater_dur_prof = gsc_heater_dur_prof;
269 config.profile_len = 10;
270 config.shared_heater_dur = gsc_shared_heater_dur;
271 res = bme688_parallel_config(&gs_handle, &config);
272 if (res != 0)
273 {
274 bme688_interface_debug_print("bme688: parallel config failed.\n");
275 (void)bme688_deinit(&gs_handle);
276
277 return 1;
278 }
279
280 /* disable heater off */
281 res = bme688_set_heater_off(&gs_handle, BME688_BOOL_FALSE);
282 if (res != 0)
283 {
284 bme688_interface_debug_print("bme688: set heat off failed.\n");
285 (void)bme688_deinit(&gs_handle);
286
287 return 1;
288 }
289
290 /* enable run gas */
291 res = bme688_set_run_gas(&gs_handle, BME688_BOOL_TRUE);
292 if (res != 0)
293 {
294 bme688_interface_debug_print("bme688: set run gas failed.\n");
295 (void)bme688_deinit(&gs_handle);
296
297 return 1;
298 }
299
300 /* set parallel mode */
301 res = bme688_set_mode(&gs_handle, BME688_MODE_PARALLEL);
302 if (res != 0)
303 {
304 bme688_interface_debug_print("bme688: set mode failed.\n");
305 (void)bme688_deinit(&gs_handle);
306
307 return 1;
308 }
309
310 /* init 0 */
311 gs_flag = 0;
312
313 /* loop all */
314 while (1)
315 {
316 /* parallel progress */
317 (void)bme688_parallel_progress(&gs_handle);
318
319 /* delay */
320 bme688_interface_delay_ms((uint32_t)gsc_shared_heater_dur);
321
322 /* check flag */
323 if (gs_flag != 0)
324 {
325 if (gs_flag == 2)
326 {
327 bme688_interface_debug_print("bme688: find error.\n");
328 (void)bme688_deinit(&gs_handle);
329
330 return 1;
331 }
332
333 /* init 0 */
334 gs_flag = 0;
335
336 /* check times */
337 if (times != 0)
338 {
339 times--;
340
341 /* check times */
342 if (times == 0)
343 {
344 break;
345 }
346 }
347 else
348 {
349 break;
350 }
351 }
352 }
353
354 /* finish parallel test */
355 bme688_interface_debug_print("bme688: finish parallel test.\n");
356 (void)bme688_set_mode(&gs_handle, BME688_MODE_SLEEP);
357 (void)bme688_set_heater_off(&gs_handle, BME688_BOOL_TRUE);
358 (void)bme688_deinit(&gs_handle);
359
360 return 0;
361}
driver bme688 parallel test header file
uint8_t bme688_set_filter(bme688_handle_t *handle, bme688_filter_t filter)
set filter
uint8_t bme688_set_interface(bme688_handle_t *handle, bme688_interface_t interface)
set the interface
bme688_address_t
bme688 address enumeration definition
uint8_t bme688_set_addr_pin(bme688_handle_t *handle, bme688_address_t addr_pin)
set the iic address pin
uint8_t bme688_set_temperature_oversampling(bme688_handle_t *handle, bme688_oversampling_t oversampling)
set temperature oversampling
uint8_t bme688_set_mode(bme688_handle_t *handle, bme688_mode_t mode)
set mode
uint8_t bme688_parallel_config(bme688_handle_t *handle, bme688_parallel_config_t *config)
parallel config
uint8_t bme688_set_run_gas(bme688_handle_t *handle, bme688_bool_t enable)
enable or disable run gas
uint8_t bme688_set_spi_wire(bme688_handle_t *handle, bme688_spi_wire_t spi)
set spi wire
uint8_t bme688_init(bme688_handle_t *handle)
initialize the chip
uint8_t bme688_info(bme688_info_t *info)
get chip's information
struct bme688_info_s bme688_info_t
bme688 information structure definition
uint8_t bme688_deinit(bme688_handle_t *handle)
close the chip
uint8_t bme688_set_heater_off(bme688_handle_t *handle, bme688_bool_t enable)
enable or disable heater off
uint8_t bme688_parallel_progress(bme688_handle_t *handle)
parallel progress
uint8_t bme688_parallel_reset(bme688_handle_t *handle)
parallel reset
bme688_interface_t
bme688 interface enumeration definition
struct bme688_parallel_data_s bme688_parallel_data_t
bme688 parallel data structure definition
uint8_t bme688_set_humidity_oversampling(bme688_handle_t *handle, bme688_oversampling_t oversampling)
set humidity oversampling
uint8_t bme688_set_pressure_oversampling(bme688_handle_t *handle, bme688_oversampling_t oversampling)
set pressure oversampling
struct bme688_parallel_config_s bme688_parallel_config_t
bme688 parallel config structure definition
struct bme688_handle_s bme688_handle_t
bme688 handle structure definition
@ BME688_MODE_SLEEP
@ BME688_MODE_PARALLEL
@ BME688_STATUS_ALL_DATA
@ BME688_STATUS_CHANNEL_DATA
@ BME688_STATUS_SEQUENCE_LOST
@ BME688_FILTER_COEFF_15
@ BME688_BOOL_TRUE
@ BME688_BOOL_FALSE
@ BME688_OVERSAMPLING_x2
@ BME688_OVERSAMPLING_x1
@ BME688_OVERSAMPLING_x16
@ BME688_SPI_WIRE_4
uint8_t bme688_interface_spi_write(uint8_t reg, uint8_t *buf, uint16_t len)
interface spi bus write
uint8_t bme688_interface_iic_write(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
interface iic bus write
uint8_t bme688_interface_iic_read(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
interface iic bus read
void bme688_interface_delay_ms(uint32_t ms)
interface delay ms
uint8_t bme688_interface_spi_read(uint8_t reg, uint8_t *buf, uint16_t len)
interface spi bus read
void bme688_interface_debug_print(const char *const fmt,...)
interface print format data
uint8_t bme688_interface_spi_deinit(void)
interface spi bus deinit
uint8_t bme688_interface_spi_init(void)
interface spi bus init
uint8_t bme688_interface_iic_deinit(void)
interface iic bus deinit
uint8_t bme688_interface_iic_init(void)
interface iic bus init
uint8_t bme688_parallel_test(bme688_interface_t interface, bme688_address_t addr_pin, uint32_t times)
parallel test
float supply_voltage_max_v
uint32_t driver_version
char manufacturer_name[32]
float supply_voltage_min_v
char chip_name[32]
const float * heater_temp_prof
const uint8_t * heater_dur_prof