62static uint32_t
calc_pressure(uint32_t pres_adc,
const struct bme68x_dev *dev);
65static uint32_t
calc_humidity(uint16_t hum_adc,
const struct bme68x_dev *dev);
91static uint8_t
calc_res_heat(uint16_t temp,
const struct bme68x_dev *dev);
115static float calc_pressure(uint32_t pres_adc,
const struct bme68x_dev *dev);
126static float calc_humidity(uint16_t hum_adc,
const struct bme68x_dev *dev);
152static uint8_t
calc_res_heat(uint16_t temp,
const struct bme68x_dev *dev);
157static int8_t
read_field_data(uint8_t index,
struct bme68x_data *data,
struct bme68x_dev *dev);
160static int8_t
read_all_field_data(
struct bme68x_data *
const data[],
struct bme68x_dev *dev);
163static int8_t
set_mem_page(uint8_t reg_addr,
struct bme68x_dev *dev);
172static int8_t
set_conf(
const struct bme68x_heatr_conf *conf, uint8_t op_mode, uint8_t *nb_conv,
struct bme68x_dev *dev);
175static int8_t
boundary_check(uint8_t *value, uint8_t max,
struct bme68x_dev *dev);
182static void swap_fields(uint8_t index1, uint8_t index2,
struct bme68x_data *field[]);
185static void sort_sensor_data(uint8_t low_index, uint8_t high_index,
struct bme68x_data *field[]);
224 if (rslt == BME68X_OK) {
225 if (dev->chip_id == BME68X_CHIP_ID) {
230 if (rslt == BME68X_OK) {
235 rslt = BME68X_E_DEV_NOT_FOUND;
253int8_t
bme68x_set_regs(
const uint8_t *reg_addr,
const uint8_t *reg_data, uint32_t len,
struct bme68x_dev *dev) {
255 if (dev->intf == BME68X_SPI_INTF)
259 if (rslt == BME68X_OK)
261 reg_addr = reg_addr & BME68X_SPI_WR_MSK;
264 dev->intf_rslt = dev->write(reg_addr, reg_data, len, dev->intf_ptr);
269 uint8_t tmp_buff[BME68X_LEN_INTERLEAVE_BUFF] = {0};
274 if ((rslt == BME68X_OK) && reg_addr && reg_data) {
275 if ((len > 0) && (len <= (BME68X_LEN_INTERLEAVE_BUFF / 2))) {
277 for (index = 0; index < len; index++) {
278 if (dev->intf == BME68X_SPI_INTF) {
281 tmp_buff[(2 * index)] = reg_addr[index] & BME68X_SPI_WR_MSK;
283 tmp_buff[(2 * index)] = reg_addr[index];
286 tmp_buff[(2 * index) + 1] = reg_data[index];
290 if (rslt == BME68X_OK) {
291 dev->intf_rslt = dev->write(tmp_buff[0], &tmp_buff[1], (2 * len) - 1, dev->intf_ptr);
292 if (dev->intf_rslt != 0) {
293 rslt = BME68X_E_COM_FAIL;
297 rslt = BME68X_E_INVALID_LENGTH;
300 rslt = BME68X_E_NULL_PTR;
318int8_t
bme68x_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len,
struct bme68x_dev *dev) {
323 if ((rslt == BME68X_OK) && reg_data) {
324 if (dev->intf == BME68X_SPI_INTF) {
327 if (rslt == BME68X_OK) {
328 reg_addr = reg_addr | BME68X_SPI_RD_MSK;
333 dev->intf_rslt = dev->read(reg_addr, reg_data, len, dev->intf_ptr);
334 if (dev->intf_rslt != 0) {
335 rslt = BME68X_E_COM_FAIL;
338 rslt = BME68X_E_NULL_PTR;
356 uint8_t reg_addr = BME68X_REG_SOFT_RESET;
359 uint8_t soft_rst_cmd = BME68X_SOFT_RESET_CMD;
363 if (rslt == BME68X_OK) {
365 if (dev->intf == BME68X_SPI_INTF) {
370 if (rslt == BME68X_OK) {
373 if (rslt == BME68X_OK) {
375 dev->delay_us(BME68X_PERIOD_RESET, dev->intf_ptr);
378 if (dev->intf == BME68X_SPI_INTF) {
400 uint8_t odr20 = 0, odr3 = 1;
401 uint8_t current_op_mode;
404 uint8_t reg_array[BME68X_LEN_CONFIG] = {0x71, 0x72, 0x73, 0x74, 0x75};
405 uint8_t data_array[BME68X_LEN_CONFIG] = {0};
408 if (rslt == BME68X_OK) {
414 rslt = BME68X_E_NULL_PTR;
415 }
else if (rslt == BME68X_OK) {
417 rslt =
bme68x_get_regs(reg_array[0], data_array, BME68X_LEN_CONFIG, dev);
418 dev->info_msg = BME68X_OK;
419 if (rslt == BME68X_OK) {
420 rslt =
boundary_check(&conf->filter, BME68X_FILTER_SIZE_127, dev);
423 if (rslt == BME68X_OK) {
427 if (rslt == BME68X_OK) {
431 if (rslt == BME68X_OK) {
435 if (rslt == BME68X_OK) {
439 if (rslt == BME68X_OK) {
440 data_array[4] = BME68X_SET_BITS(data_array[4], BME68X_FILTER, conf->filter);
441 data_array[3] = BME68X_SET_BITS(data_array[3], BME68X_OST, conf->os_temp);
442 data_array[3] = BME68X_SET_BITS(data_array[3], BME68X_OSP, conf->os_pres);
443 data_array[1] = BME68X_SET_BITS_POS_0(data_array[1], BME68X_OSH, conf->os_hum);
444 if (conf->odr != BME68X_ODR_NONE) {
449 data_array[4] = BME68X_SET_BITS(data_array[4], BME68X_ODR20, odr20);
450 data_array[0] = BME68X_SET_BITS(data_array[0], BME68X_ODR3, odr3);
454 if (rslt == BME68X_OK) {
458 if ((current_op_mode != BME68X_SLEEP_MODE) && (rslt == BME68X_OK)) {
472 uint8_t reg_addr = BME68X_REG_CTRL_GAS_1;
473 uint8_t data_array[BME68X_LEN_CONFIG];
477 rslt = BME68X_E_NULL_PTR;
478 }
else if (rslt == BME68X_OK) {
479 conf->os_hum = BME68X_GET_BITS_POS_0(data_array[1], BME68X_OSH);
480 conf->filter = BME68X_GET_BITS(data_array[4], BME68X_FILTER);
481 conf->os_temp = BME68X_GET_BITS(data_array[3], BME68X_OST);
482 conf->os_pres = BME68X_GET_BITS(data_array[3], BME68X_OSP);
483 if (BME68X_GET_BITS(data_array[0], BME68X_ODR3)) {
484 conf->odr = BME68X_ODR_NONE;
486 conf->odr = BME68X_GET_BITS(data_array[4], BME68X_ODR20);
498 uint8_t tmp_pow_mode;
499 uint8_t pow_mode = 0;
500 uint8_t reg_addr = BME68X_REG_CTRL_MEAS;
505 if (rslt == BME68X_OK) {
507 pow_mode = (tmp_pow_mode & BME68X_MODE_MSK);
508 if (pow_mode != BME68X_SLEEP_MODE) {
509 tmp_pow_mode &= ~BME68X_MODE_MSK;
511 dev->delay_us(BME68X_PERIOD_POLL, dev->intf_ptr);
514 }
while ((pow_mode != BME68X_SLEEP_MODE) && (rslt == BME68X_OK));
517 if ((op_mode != BME68X_SLEEP_MODE) && (rslt == BME68X_OK)) {
518 tmp_pow_mode = (tmp_pow_mode & ~BME68X_MODE_MSK) | (op_mode & BME68X_MODE_MSK);
536 *op_mode = mode & BME68X_MODE_MSK;
538 rslt = BME68X_E_NULL_PTR;
549 uint32_t meas_dur = 0;
550 uint32_t meas_cycles;
551 uint8_t os_to_meas_cycles[6] = {0, 1, 2, 4, 8, 16};
557 if (rslt == BME68X_OK) {
562 if (rslt == BME68X_OK) {
567 if (rslt == BME68X_OK) {
568 meas_cycles = os_to_meas_cycles[conf->os_temp];
569 meas_cycles += os_to_meas_cycles[conf->os_pres];
570 meas_cycles += os_to_meas_cycles[conf->os_hum];
573 meas_dur = meas_cycles * UINT32_C(1963);
574 meas_dur += UINT32_C(477 * 4);
575 meas_dur += UINT32_C(477 * 5);
577 if (op_mode != BME68X_PARALLEL_MODE) {
578 meas_dur += UINT32_C(1000);
591int8_t
bme68x_get_data(uint8_t op_mode,
struct bme68x_data *data, uint8_t *n_data,
struct bme68x_dev *dev) {
593 uint8_t i = 0, j = 0, new_fields = 0;
594 struct bme68x_data *field_ptr[3] = {0};
595 struct bme68x_data field_data[3] = {{0}};
597 field_ptr[0] = &field_data[0];
598 field_ptr[1] = &field_data[1];
599 field_ptr[2] = &field_data[2];
602 if ((rslt == BME68X_OK) && (data != NULL)) {
604 if (op_mode == BME68X_FORCED_MODE) {
606 if (rslt == BME68X_OK) {
607 if (data->status & BME68X_NEW_DATA_MSK) {
611 rslt = BME68X_W_NO_NEW_DATA;
614 }
else if ((op_mode == BME68X_PARALLEL_MODE) || (op_mode == BME68X_SEQUENTIAL_MODE)) {
619 for (i = 0; (i < 3) && (rslt == BME68X_OK); i++) {
620 if (field_ptr[i]->status & BME68X_NEW_DATA_MSK) {
626 for (i = 0; (i < 2) && (rslt == BME68X_OK); i++) {
627 for (j = i + 1; j < 3; j++) {
633 for (i = 0; ((i < 3) && (rslt == BME68X_OK)); i++) {
634 data[i] = *field_ptr[i];
637 if (new_fields == 0) {
638 rslt = BME68X_W_NO_NEW_DATA;
641 rslt = BME68X_W_DEFINE_OP_MODE;
644 if (n_data == NULL) {
645 rslt = BME68X_E_NULL_PTR;
647 *n_data = new_fields;
650 rslt = BME68X_E_NULL_PTR;
662 uint8_t hctrl, run_gas = 0;
663 uint8_t ctrl_gas_data[2];
664 uint8_t ctrl_gas_addr[2] = {BME68X_REG_CTRL_GAS_0, BME68X_REG_CTRL_GAS_1};
668 if (rslt == BME68X_OK) {
669 rslt =
set_conf(conf, op_mode, &nb_conv, dev);
672 if (rslt == BME68X_OK) {
674 if (rslt == BME68X_OK) {
675 if (conf->enable == BME68X_ENABLE) {
676 hctrl = BME68X_ENABLE_HEATER;
677 if (dev->variant_id == BME68X_VARIANT_GAS_HIGH) {
678 run_gas = BME68X_ENABLE_GAS_MEAS_H;
680 run_gas = BME68X_ENABLE_GAS_MEAS_L;
683 hctrl = BME68X_DISABLE_HEATER;
684 run_gas = BME68X_DISABLE_GAS_MEAS;
687 ctrl_gas_data[0] = BME68X_SET_BITS(ctrl_gas_data[0], BME68X_HCTRL, hctrl);
688 ctrl_gas_data[1] = BME68X_SET_BITS_POS_0(ctrl_gas_data[1], BME68X_NBCONV, nb_conv);
689 ctrl_gas_data[1] = BME68X_SET_BITS(ctrl_gas_data[1], BME68X_RUN_GAS, run_gas);
694 rslt = BME68X_E_NULL_PTR;
704 int8_t rslt = BME68X_OK;
705 uint8_t data_array[10] = {0};
708 if ((conf != NULL) && (conf->heatr_dur_prof != NULL) && (conf->heatr_temp_prof != NULL)) {
712 if (rslt == BME68X_OK) {
713 for (i = 0; i < conf->profile_len; i++) {
714 conf->heatr_temp_prof[i] = data_array[i];
719 if (rslt == BME68X_OK) {
720 for (i = 0; i < conf->profile_len; i++) {
721 conf->heatr_dur_prof[i] = data_array[i];
726 rslt = BME68X_E_NULL_PTR;
740 struct bme68x_data data[BME68X_N_MEAS] = {{0}};
741 struct bme68x_dev t_dev;
742 struct bme68x_conf conf;
743 struct bme68x_heatr_conf heatr_conf;
747 if (rslt == BME68X_OK) {
750 t_dev.read = dev->read;
751 t_dev.write = dev->write;
752 t_dev.intf = dev->intf;
753 t_dev.delay_us = dev->delay_us;
754 t_dev.intf_ptr = dev->intf_ptr;
759 if (rslt == BME68X_OK) {
761 conf.os_hum = BME68X_OS_1X;
762 conf.os_pres = BME68X_OS_16X;
763 conf.os_temp = BME68X_OS_2X;
766 heatr_conf.enable = BME68X_ENABLE;
767 heatr_conf.heatr_dur = BME68X_HEATR_DUR1;
768 heatr_conf.heatr_temp = BME68X_HIGH_TEMP;
770 if (rslt == BME68X_OK) {
772 if (rslt == BME68X_OK) {
774 if (rslt == BME68X_OK) {
776 t_dev.delay_us(BME68X_HEATR_DUR1_DELAY, t_dev.intf_ptr);
777 rslt =
bme68x_get_data(BME68X_FORCED_MODE, &data[0], &n_fields, &t_dev);
778 if (rslt == BME68X_OK) {
779 if ((data[0].idac != 0x00) && (data[0].idac != 0xFF) && (data[0].status & BME68X_GASM_VALID_MSK)) {
782 rslt = BME68X_E_SELF_TEST;
789 heatr_conf.heatr_dur = BME68X_HEATR_DUR2;
790 while ((rslt == BME68X_OK) && (i < BME68X_N_MEAS)) {
792 heatr_conf.heatr_temp = BME68X_HIGH_TEMP;
794 heatr_conf.heatr_temp = BME68X_LOW_TEMP;
798 if (rslt == BME68X_OK) {
800 if (rslt == BME68X_OK) {
802 if (rslt == BME68X_OK) {
804 t_dev.delay_us(BME68X_HEATR_DUR2_DELAY, t_dev.intf_ptr);
805 rslt =
bme68x_get_data(BME68X_FORCED_MODE, &data[i], &n_fields, &t_dev);
813 if (rslt == BME68X_OK) {
822#ifndef BME68X_USE_FPU
840 var1 = ((int32_t)temp_adc >> 3) - ((int32_t)dev->calib.par_t1 << 1);
841 var2 = (var1 * (int32_t)dev->calib.par_t2) >> 11;
842 var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
843 var3 = ((var3) * ((int32_t)dev->calib.par_t3 << 4)) >> 14;
844 dev->calib.t_fine = (int32_t)(var2 + var3);
845 calc_temp = (int16_t)(((dev->calib.t_fine * 5) + 128) >> 8);
860static uint32_t
calc_pressure(uint32_t pres_adc,
const struct bme68x_dev *dev) {
864 int32_t pressure_comp;
871 const int32_t pres_ovf_check = INT32_C(0x40000000);
874 var1 = (((int32_t)dev->calib.t_fine) >> 1) - 64000;
875 var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * (int32_t)dev->calib.par_p6) >> 2;
876 var2 = var2 + ((var1 * (int32_t)dev->calib.par_p5) << 1);
877 var2 = (var2 >> 2) + ((int32_t)dev->calib.par_p4 << 16);
878 var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) * ((int32_t)dev->calib.par_p3 << 5)) >> 3) + (((int32_t)dev->calib.par_p2 * var1) >> 1);
880 var1 = ((32768 + var1) * (int32_t)dev->calib.par_p1) >> 15;
881 pressure_comp = 1048576 - pres_adc;
882 pressure_comp = (int32_t)((pressure_comp - (var2 >> 12)) * ((uint32_t)3125));
883 if (pressure_comp >= pres_ovf_check) {
884 pressure_comp = ((pressure_comp / var1) << 1);
886 pressure_comp = ((pressure_comp << 1) / var1);
889 var1 = ((int32_t)dev->calib.par_p9 * (int32_t)(((pressure_comp >> 3) * (pressure_comp >> 3)) >> 13)) >> 12;
890 var2 = ((int32_t)(pressure_comp >> 2) * (int32_t)dev->calib.par_p8) >> 13;
892 ((int32_t)(pressure_comp >> 8) * (int32_t)(pressure_comp >> 8) * (int32_t)(pressure_comp >> 8) * (int32_t)dev->calib.par_p10) >> 17;
893 pressure_comp = (int32_t)(pressure_comp) + ((var1 + var2 + var3 + ((int32_t)dev->calib.par_p7 << 7)) >> 4);
896 return (uint32_t)pressure_comp;
908static uint32_t
calc_humidity(uint16_t hum_adc,
const struct bme68x_dev *dev) {
919 temp_scaled = (((int32_t)dev->calib.t_fine * 5) + 128) >> 8;
920 var1 = (int32_t)(hum_adc - ((int32_t)((int32_t)dev->calib.par_h1 * 16))) -
921 (((temp_scaled * (int32_t)dev->calib.par_h3) / ((int32_t)100)) >> 1);
922 var2 = ((int32_t)dev->calib.par_h2 *
923 (((temp_scaled * (int32_t)dev->calib.par_h4) / ((int32_t)100)) +
924 (((temp_scaled * ((temp_scaled * (int32_t)dev->calib.par_h5) / ((int32_t)100))) >> 6) / ((int32_t)100)) + (int32_t)(1 << 14))) >>
927 var4 = (int32_t)dev->calib.par_h6 << 7;
928 var4 = ((var4) + ((temp_scaled * (int32_t)dev->calib.par_h7) / ((int32_t)100))) >> 4;
929 var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
930 var6 = (var4 * var5) >> 1;
931 calc_hum = (((var3 + var6) >> 10) * ((int32_t)1000)) >> 12;
932 if (calc_hum > 100000)
935 }
else if (calc_hum < 0) {
940 return (uint32_t)calc_hum;
957 uint32_t calc_gas_res;
958 uint32_t lookup_table1[16] = {UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647),
959 UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2130303777),
960 UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2143188679), UINT32_C(2136746228),
961 UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2147483647)};
962 uint32_t lookup_table2[16] = {UINT32_C(4096000000), UINT32_C(2048000000), UINT32_C(1024000000), UINT32_C(512000000),
963 UINT32_C(255744255), UINT32_C(127110228), UINT32_C(64000000), UINT32_C(32258064),
964 UINT32_C(16016016), UINT32_C(8000000), UINT32_C(4000000), UINT32_C(2000000),
965 UINT32_C(1000000), UINT32_C(500000), UINT32_C(250000), UINT32_C(125000)};
968 var1 = (int64_t)((1340 + (5 * (int64_t)dev->calib.range_sw_err)) * ((int64_t)lookup_table1[gas_range])) >> 16;
969 var2 = (((int64_t)((int64_t)gas_res_adc << 15) - (int64_t)(16777216)) + var1);
970 var3 = (((int64_t)lookup_table2[gas_range] * (int64_t)var1) >> 9);
971 calc_gas_res = (uint32_t)((var3 + ((int64_t)var2 >> 1)) / (int64_t)var2);
987 uint32_t calc_gas_res;
988 uint32_t var1 = UINT32_C(262144) >> gas_range;
989 int32_t var2 = (int32_t)gas_res_adc - INT32_C(512);
992 var2 = INT32_C(4096) + var2;
995 calc_gas_res = (UINT32_C(10000) * var1) / (uint32_t)var2;
996 calc_gas_res = calc_gas_res * 100;
1009 int32_t heatr_res_x100;
1016 var1 = (((int32_t)dev->amb_temp * dev->calib.par_gh3) / 1000) * 256;
1017 var2 = (dev->calib.par_gh1 + 784) * (((((dev->calib.par_gh2 + 154009) * temp * 5) / 100) + 3276800) / 10);
1018 var3 = var1 + (var2 / 2);
1019 var4 = (var3 / (dev->calib.res_heat_range + 4));
1020 var5 = (131 * dev->calib.res_heat_val) + 65536;
1021 heatr_res_x100 = (int32_t)(((var4 / var5) - 250) * 34);
1022 heatr_res = (uint8_t)((heatr_res_x100 + 50) / 100);
1044 var1 = ((((float)temp_adc / 16384.0f) - ((float)dev->calib.par_t1 / 1024.0f)) * ((float)dev->calib.par_t2));
1047 var2 = (((((float)temp_adc / 131072.0f) - ((float)dev->calib.par_t1 / 8192.0f)) *
1048 (((float)temp_adc / 131072.0f) - ((float)dev->calib.par_t1 / 8192.0f))) *
1049 ((float)dev->calib.par_t3 * 16.0f));
1052 dev->calib.t_fine = (var1 + var2);
1055 calc_temp = ((dev->calib.t_fine) / 5120.0f);
1069static float calc_pressure(uint32_t pres_adc,
const struct bme68x_dev *dev) {
1075 var1 = (((float)dev->calib.t_fine / 2.0f) - 64000.0f);
1076 var2 = var1 * var1 * (((float)dev->calib.par_p6) / (131072.0f));
1077 var2 = var2 + (var1 * ((float)dev->calib.par_p5) * 2.0f);
1078 var2 = (var2 / 4.0f) + (((
float)dev->calib.par_p4) * 65536.0f);
1079 var1 = (((((float)dev->calib.par_p3 * var1 * var1) / 16384.0f) + ((float)dev->calib.par_p2 * var1)) / 524288.0f);
1080 var1 = ((1.0f + (var1 / 32768.0f)) * ((float)dev->calib.par_p1));
1081 calc_pres = (1048576.0f - ((float)pres_adc));
1084 if ((
int)var1 != 0) {
1085 calc_pres = (((calc_pres - (var2 / 4096.0f)) * 6250.0f) / var1);
1086 var1 = (((float)dev->calib.par_p9) * calc_pres * calc_pres) / 2147483648.0f;
1087 var2 = calc_pres * (((float)dev->calib.par_p8) / 32768.0f);
1088 var3 = ((calc_pres / 256.0f) * (calc_pres / 256.0f) * (calc_pres / 256.0f) * (dev->calib.par_p10 / 131072.0f));
1089 calc_pres = (calc_pres + (var1 + var2 + var3 + ((float)dev->calib.par_p7 * 128.0f)) / 16.0f);
1106static float calc_humidity(uint16_t hum_adc,
const struct bme68x_dev *dev) {
1115 temp_comp = ((dev->calib.t_fine) / 5120.0f);
1116 var1 = (float)((
float)hum_adc) - (((float)dev->calib.par_h1 * 16.0f) + (((float)dev->calib.par_h3 / 2.0f) * temp_comp));
1117 var2 = var1 * ((float)(((float)dev->calib.par_h2 / 262144.0f) * (1.0f + (((float)dev->calib.par_h4 / 16384.0f) * temp_comp) +
1118 (((float)dev->calib.par_h5 / 1048576.0f) * temp_comp * temp_comp))));
1119 var3 = (float)dev->calib.par_h6 / 16384.0f;
1120 var4 = (float)dev->calib.par_h7 / 2097152.0f;
1121 calc_hum = var2 + ((var3 + (var4 * temp_comp)) * var2 * var2);
1122 if (calc_hum > 100.0f) {
1124 }
else if (calc_hum < 0.0f) {
1146 float gas_res_f = gas_res_adc;
1147 float gas_range_f = (1U << gas_range);
1148 const float lookup_k1_range[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, -0.8f, 0.0f, 0.0f, -0.2f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f};
1149 const float lookup_k2_range[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.1f, 0.7f, 0.0f, -0.8f, -0.1f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
1151 var1 = (1340.0f + (5.0f * dev->calib.range_sw_err));
1152 var2 = (var1) * (1.0f + lookup_k1_range[gas_range] / 100.0f);
1153 var3 = 1.0f + (lookup_k2_range[gas_range] / 100.0f);
1154 calc_gas_res = 1.0f / (float)(var3 * (0.000000125f) * gas_range_f * (((gas_res_f - 512.0f) / var2) + 1.0f));
1156 return calc_gas_res;
1170 uint32_t var1 = UINT32_C(262144) >> gas_range;
1171 int32_t var2 = (int32_t)gas_res_adc - INT32_C(512);
1174 var2 = INT32_C(4096) + var2;
1176 calc_gas_res = 1000000.0f * (float)var1 / (
float)var2;
1178 return calc_gas_res;
1182static uint8_t
calc_res_heat(uint16_t temp,
const struct bme68x_dev *dev) {
1195 var1 = (((float)dev->calib.par_gh1 / (16.0f)) + 49.0f);
1196 var2 = ((((float)dev->calib.par_gh2 / (32768.0f)) * (0.0005f)) + 0.00235f);
1197 var3 = ((float)dev->calib.par_gh3 / (1024.0f));
1198 var4 = (var1 * (1.0f + (var2 * (float)temp)));
1199 var5 = (var4 + (var3 * (float)dev->amb_temp));
1202 ((var5 * (4 / (4 + (
float)dev->calib.res_heat_range)) * (1 / (1 + ((
float)dev->calib.res_heat_val * 0.002f)))) - 25));
1227 while (dur > 0x3F) {
1232 durval = (uint8_t)(dur + (factor * 64));
1239static int8_t
read_field_data(uint8_t index,
struct bme68x_data *data,
struct bme68x_dev *dev) {
1240 int8_t rslt = BME68X_OK;
1241 uint8_t buff[BME68X_LEN_FIELD] = {0};
1242 uint8_t gas_range_l, gas_range_h;
1246 uint16_t adc_gas_res_low, adc_gas_res_high;
1249 while ((tries) && (rslt == BME68X_OK)) {
1250 rslt =
bme68x_get_regs(((uint8_t)(BME68X_REG_FIELD0 + (index * BME68X_LEN_FIELD_OFFSET))), buff, (uint16_t)BME68X_LEN_FIELD, dev);
1252 rslt = BME68X_E_NULL_PTR;
1256 data->status = buff[0] & BME68X_NEW_DATA_MSK;
1257 data->gas_index = buff[0] & BME68X_GAS_INDEX_MSK;
1258 data->meas_index = buff[1];
1261 adc_pres = (uint32_t)(((uint32_t)buff[2] * 4096) | ((uint32_t)buff[3] * 16) | ((uint32_t)buff[4] / 16));
1262 adc_temp = (uint32_t)(((uint32_t)buff[5] * 4096) | ((uint32_t)buff[6] * 16) | ((uint32_t)buff[7] / 16));
1263 adc_hum = (uint16_t)(((uint32_t)buff[8] * 256) | (uint32_t)buff[9]);
1264 adc_gas_res_low = (uint16_t)((uint32_t)buff[13] * 4 | (((uint32_t)buff[14]) / 64));
1265 adc_gas_res_high = (uint16_t)((uint32_t)buff[15] * 4 | (((uint32_t)buff[16]) / 64));
1266 gas_range_l = buff[14] & BME68X_GAS_RANGE_MSK;
1267 gas_range_h = buff[16] & BME68X_GAS_RANGE_MSK;
1268 if (dev->variant_id == BME68X_VARIANT_GAS_HIGH) {
1269 data->status |= buff[16] & BME68X_GASM_VALID_MSK;
1270 data->status |= buff[16] & BME68X_HEAT_STAB_MSK;
1272 data->status |= buff[14] & BME68X_GASM_VALID_MSK;
1273 data->status |= buff[14] & BME68X_HEAT_STAB_MSK;
1276 if ((data->status & BME68X_NEW_DATA_MSK) && (rslt == BME68X_OK)) {
1277 rslt =
bme68x_get_regs(BME68X_REG_RES_HEAT0 + data->gas_index, &data->res_heat, 1, dev);
1278 if (rslt == BME68X_OK) {
1279 rslt =
bme68x_get_regs(BME68X_REG_IDAC_HEAT0 + data->gas_index, &data->idac, 1, dev);
1282 if (rslt == BME68X_OK) {
1283 rslt =
bme68x_get_regs(BME68X_REG_GAS_WAIT0 + data->gas_index, &data->gas_wait, 1, dev);
1286 if (rslt == BME68X_OK) {
1290 if (dev->variant_id == BME68X_VARIANT_GAS_HIGH) {
1300 if (rslt == BME68X_OK) {
1301 dev->delay_us(BME68X_PERIOD_POLL, dev->intf_ptr);
1312 int8_t rslt = BME68X_OK;
1313 uint8_t buff[BME68X_LEN_FIELD * 3] = {0};
1314 uint8_t gas_range_l, gas_range_h;
1318 uint16_t adc_gas_res_low, adc_gas_res_high;
1320 uint8_t set_val[30] = {0};
1323 if (!data[0] && !data[1] && !data[2]) {
1324 rslt = BME68X_E_NULL_PTR;
1327 if (rslt == BME68X_OK) {
1328 rslt =
bme68x_get_regs(BME68X_REG_FIELD0, buff, (uint32_t)BME68X_LEN_FIELD * 3, dev);
1331 if (rslt == BME68X_OK) {
1335 for (i = 0; ((i < 3) && (rslt == BME68X_OK)); i++) {
1336 off = (uint8_t)(i * BME68X_LEN_FIELD);
1337 data[i]->status = buff[off] & BME68X_NEW_DATA_MSK;
1338 data[i]->gas_index = buff[off] & BME68X_GAS_INDEX_MSK;
1339 data[i]->meas_index = buff[off + 1];
1342 adc_pres = (uint32_t)(((uint32_t)buff[off + 2] * 4096) | ((uint32_t)buff[off + 3] * 16) | ((uint32_t)buff[off + 4] / 16));
1343 adc_temp = (uint32_t)(((uint32_t)buff[off + 5] * 4096) | ((uint32_t)buff[off + 6] * 16) | ((uint32_t)buff[off + 7] / 16));
1344 adc_hum = (uint16_t)(((uint32_t)buff[off + 8] * 256) | (uint32_t)buff[off + 9]);
1345 adc_gas_res_low = (uint16_t)((uint32_t)buff[off + 13] * 4 | (((uint32_t)buff[off + 14]) / 64));
1346 adc_gas_res_high = (uint16_t)((uint32_t)buff[off + 15] * 4 | (((uint32_t)buff[off + 16]) / 64));
1347 gas_range_l = buff[off + 14] & BME68X_GAS_RANGE_MSK;
1348 gas_range_h = buff[off + 16] & BME68X_GAS_RANGE_MSK;
1349 if (dev->variant_id == BME68X_VARIANT_GAS_HIGH) {
1350 data[i]->status |= buff[off + 16] & BME68X_GASM_VALID_MSK;
1351 data[i]->status |= buff[off + 16] & BME68X_HEAT_STAB_MSK;
1353 data[i]->status |= buff[off + 14] & BME68X_GASM_VALID_MSK;
1354 data[i]->status |= buff[off + 14] & BME68X_HEAT_STAB_MSK;
1357 data[i]->idac = set_val[data[i]->gas_index];
1358 data[i]->res_heat = set_val[10 + data[i]->gas_index];
1359 data[i]->gas_wait = set_val[20 + data[i]->gas_index];
1363 if (dev->variant_id == BME68X_VARIANT_GAS_HIGH) {
1381 if (rslt == BME68X_OK) {
1382 if (reg_addr > 0x7f) {
1383 mem_page = BME68X_MEM_PAGE1;
1385 mem_page = BME68X_MEM_PAGE0;
1388 if (mem_page != dev->mem_page) {
1389 dev->mem_page = mem_page;
1390 dev->intf_rslt = dev->read(BME68X_REG_MEM_PAGE | BME68X_SPI_RD_MSK, ®, 1, dev->intf_ptr);
1391 if (dev->intf_rslt != 0) {
1392 rslt = BME68X_E_COM_FAIL;
1395 if (rslt == BME68X_OK) {
1396 reg = reg & (~BME68X_MEM_PAGE_MSK);
1397 reg = reg | (dev->mem_page & BME68X_MEM_PAGE_MSK);
1398 dev->intf_rslt = dev->write(BME68X_REG_MEM_PAGE & BME68X_SPI_WR_MSK, ®, 1, dev->intf_ptr);
1399 if (dev->intf_rslt != 0) {
1400 rslt = BME68X_E_COM_FAIL;
1416 if (rslt == BME68X_OK) {
1417 dev->intf_rslt = dev->read(BME68X_REG_MEM_PAGE | BME68X_SPI_RD_MSK, ®, 1, dev->intf_ptr);
1418 if (dev->intf_rslt != 0) {
1419 rslt = BME68X_E_COM_FAIL;
1421 dev->mem_page = reg & BME68X_MEM_PAGE_MSK;
1433 if ((value != NULL) && (rslt == BME68X_OK)) {
1438 dev->info_msg |= BME68X_I_PARAM_CORR;
1441 rslt = BME68X_E_NULL_PTR;
1449 int8_t rslt = BME68X_OK;
1451 if ((dev == NULL) || (dev->read == NULL) || (dev->write == NULL) || (dev->delay_us == NULL)) {
1453 rslt = BME68X_E_NULL_PTR;
1460static int8_t
set_conf(
const struct bme68x_heatr_conf *conf, uint8_t op_mode, uint8_t *nb_conv,
struct bme68x_dev *dev) {
1461 int8_t rslt = BME68X_OK;
1464 uint8_t write_len = 0;
1465 uint8_t heater_dur_shared_addr = BME68X_REG_SHD_HEATR_DUR;
1466 uint8_t rh_reg_addr[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1467 uint8_t rh_reg_data[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1468 uint8_t gw_reg_addr[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1469 uint8_t gw_reg_data[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1472 case BME68X_FORCED_MODE:
1473 rh_reg_addr[0] = BME68X_REG_RES_HEAT0;
1475 gw_reg_addr[0] = BME68X_REG_GAS_WAIT0;
1480 case BME68X_SEQUENTIAL_MODE:
1481 if ((!conf->heatr_dur_prof) || (!conf->heatr_temp_prof)) {
1482 rslt = BME68X_E_NULL_PTR;
1486 for (i = 0; i < conf->profile_len; i++) {
1487 rh_reg_addr[i] = BME68X_REG_RES_HEAT0 + i;
1488 rh_reg_data[i] =
calc_res_heat(conf->heatr_temp_prof[i], dev);
1489 gw_reg_addr[i] = BME68X_REG_GAS_WAIT0 + i;
1493 (*nb_conv) = conf->profile_len;
1494 write_len = conf->profile_len;
1496 case BME68X_PARALLEL_MODE:
1497 if ((!conf->heatr_dur_prof) || (!conf->heatr_temp_prof)) {
1498 rslt = BME68X_E_NULL_PTR;
1502 if (conf->shared_heatr_dur == 0) {
1503 rslt = BME68X_W_DEFINE_SHD_HEATR_DUR;
1506 for (i = 0; i < conf->profile_len; i++) {
1507 rh_reg_addr[i] = BME68X_REG_RES_HEAT0 + i;
1508 rh_reg_data[i] =
calc_res_heat(conf->heatr_temp_prof[i], dev);
1509 gw_reg_addr[i] = BME68X_REG_GAS_WAIT0 + i;
1510 gw_reg_data[i] = (uint8_t)conf->heatr_dur_prof[i];
1513 (*nb_conv) = conf->profile_len;
1514 write_len = conf->profile_len;
1516 if (rslt == BME68X_OK) {
1522 rslt = BME68X_W_DEFINE_OP_MODE;
1525 if (rslt == BME68X_OK) {
1529 if (rslt == BME68X_OK) {
1546 dur = (uint16_t)(((uint32_t)dur * 1000) / 477);
1547 while (dur > 0x3F) {
1552 heatdurval = (uint8_t)(dur + (factor * 64));
1559static void sort_sensor_data(uint8_t low_index, uint8_t high_index,
struct bme68x_data *field[]) {
1560 int16_t meas_index1;
1561 int16_t meas_index2;
1563 meas_index1 = (int16_t)field[low_index]->meas_index;
1564 meas_index2 = (int16_t)field[high_index]->meas_index;
1565 if ((field[low_index]->status & BME68X_NEW_DATA_MSK) && (field[high_index]->status & BME68X_NEW_DATA_MSK)) {
1566 int16_t diff = meas_index2 - meas_index1;
1567 if (((diff > -3) && (diff < 0)) || (diff > 2)) {
1570 }
else if (field[high_index]->status & BME68X_NEW_DATA_MSK) {
1686static void swap_fields(uint8_t index1, uint8_t index2,
struct bme68x_data *field[]) {
1687 struct bme68x_data *temp;
1689 temp = field[index1];
1690 field[index1] = field[index2];
1691 field[index2] = temp;
1696 int8_t rslt = BME68X_OK;
1697 uint8_t self_test_failed = 0, i;
1698 uint32_t cent_res = 0;
1700 if ((data[0].temperature < BME68X_MIN_TEMPERATURE) || (data[0].temperature > BME68X_MAX_TEMPERATURE)) {
1704 if ((data[0].pressure < BME68X_MIN_PRESSURE) || (data[0].pressure > BME68X_MAX_PRESSURE)) {
1708 if ((data[0].humidity < BME68X_MIN_HUMIDITY) || (data[0].humidity > BME68X_MAX_HUMIDITY)) {
1712 for (i = 0; i < n_meas; i++)
1714 if (!(data[i].status & BME68X_GASM_VALID_MSK)) {
1720 cent_res = (uint32_t)((5 * (data[3].gas_resistance + data[5].gas_resistance)) / (2 * data[4].gas_resistance));
1727 if (self_test_failed) {
1728 rslt = BME68X_E_SELF_TEST;
1749 uint8_t coeff_array[BME68X_LEN_COEFF_ALL];
1752 rslt =
bme68x_get_regs(BME68X_REG_COEFF1, coeff_array, BME68X_LEN_COEFF1, dev);
1753 if (rslt == BME68X_OK) {
1754 rslt =
bme68x_get_regs(BME68X_REG_COEFF2, &coeff_array[BME68X_LEN_COEFF1], BME68X_LEN_COEFF2, dev);
1757 if (rslt == BME68X_OK) {
1758 rslt =
bme68x_get_regs(BME68X_REG_COEFF3, &coeff_array[BME68X_LEN_COEFF1 + BME68X_LEN_COEFF2], BME68X_LEN_COEFF3, dev);
1761 if (rslt == BME68X_OK) {
1763 dev->calib.par_t1 = (uint16_t)(BME68X_CONCAT_BYTES(coeff_array[BME68X_IDX_T1_MSB], coeff_array[BME68X_IDX_T1_LSB]));
1764 dev->calib.par_t2 = (int16_t)(BME68X_CONCAT_BYTES(coeff_array[BME68X_IDX_T2_MSB], coeff_array[BME68X_IDX_T2_LSB]));
1765 dev->calib.par_t3 = (int8_t)(coeff_array[BME68X_IDX_T3]);
1768 dev->calib.par_p1 = (uint16_t)(BME68X_CONCAT_BYTES(coeff_array[BME68X_IDX_P1_MSB], coeff_array[BME68X_IDX_P1_LSB]));
1769 dev->calib.par_p2 = (int16_t)(BME68X_CONCAT_BYTES(coeff_array[BME68X_IDX_P2_MSB], coeff_array[BME68X_IDX_P2_LSB]));
1770 dev->calib.par_p3 = (int8_t)coeff_array[BME68X_IDX_P3];
1771 dev->calib.par_p4 = (int16_t)(BME68X_CONCAT_BYTES(coeff_array[BME68X_IDX_P4_MSB], coeff_array[BME68X_IDX_P4_LSB]));
1772 dev->calib.par_p5 = (int16_t)(BME68X_CONCAT_BYTES(coeff_array[BME68X_IDX_P5_MSB], coeff_array[BME68X_IDX_P5_LSB]));
1773 dev->calib.par_p6 = (int8_t)(coeff_array[BME68X_IDX_P6]);
1774 dev->calib.par_p7 = (int8_t)(coeff_array[BME68X_IDX_P7]);
1775 dev->calib.par_p8 = (int16_t)(BME68X_CONCAT_BYTES(coeff_array[BME68X_IDX_P8_MSB], coeff_array[BME68X_IDX_P8_LSB]));
1776 dev->calib.par_p9 = (int16_t)(BME68X_CONCAT_BYTES(coeff_array[BME68X_IDX_P9_MSB], coeff_array[BME68X_IDX_P9_LSB]));
1777 dev->calib.par_p10 = (uint8_t)(coeff_array[BME68X_IDX_P10]);
1781 (uint16_t)(((uint16_t)coeff_array[BME68X_IDX_H1_MSB] << 4) | (coeff_array[BME68X_IDX_H1_LSB] & BME68X_BIT_H1_DATA_MSK));
1782 dev->calib.par_h2 = (uint16_t)(((uint16_t)coeff_array[BME68X_IDX_H2_MSB] << 4) | ((coeff_array[BME68X_IDX_H2_LSB]) >> 4));
1783 dev->calib.par_h3 = (int8_t)coeff_array[BME68X_IDX_H3];
1784 dev->calib.par_h4 = (int8_t)coeff_array[BME68X_IDX_H4];
1785 dev->calib.par_h5 = (int8_t)coeff_array[BME68X_IDX_H5];
1786 dev->calib.par_h6 = (uint8_t)coeff_array[BME68X_IDX_H6];
1787 dev->calib.par_h7 = (int8_t)coeff_array[BME68X_IDX_H7];
1790 dev->calib.par_gh1 = (int8_t)coeff_array[BME68X_IDX_GH1];
1791 dev->calib.par_gh2 = (int16_t)(BME68X_CONCAT_BYTES(coeff_array[BME68X_IDX_GH2_MSB], coeff_array[BME68X_IDX_GH2_LSB]));
1792 dev->calib.par_gh3 = (int8_t)coeff_array[BME68X_IDX_GH3];
1795 dev->calib.res_heat_range = ((coeff_array[BME68X_IDX_RES_HEAT_RANGE] & BME68X_RHRANGE_MSK) / 16);
1796 dev->calib.res_heat_val = (int8_t)coeff_array[BME68X_IDX_RES_HEAT_VAL];
1797 dev->calib.range_sw_err = ((int8_t)(coeff_array[BME68X_IDX_RANGE_SW_ERR] & BME68X_RSERROR_MSK)) / 16;
1814 uint8_t reg_data = 0;
1819 if (rslt == BME68X_OK) {
1820 dev->variant_id = reg_data;
1832 int8_t rslt = BME68X_OK;
1848 uint8_t reg[BME68X_LEN_CONFIG];
1849 uint8_t reg_array[BME68X_LEN_CONFIG] = {0x71, 0x72, 0x73, 0x74, 0x75};
1850 uint8_t data_array[BME68X_LEN_CONFIG] = {0};
1867 if (rslt == BME68X_OK)
1872 if (rslt == BME68X_E_SELF_TEST)
1893 if (rslt == BME68X_OK) {
1896 myPrintkI(
"BME688 Air Quality Present\r\n");
1898 myPrintkI(
"BME688 Air Quality Not Present\r\n");
1917 int8_t rslt = BME68X_OK;
1918 struct bme68x_conf conf;
1919 struct bme68x_heatr_conf heatr_conf;
1920 uint32_t del_period;
1922 uint8_t n_fields = 0;
1923 uint16_t sample_count = 0;
1927 if (rslt == BME68X_OK) {
1928 conf.filter = BME68X_FILTER_OFF;
1929 conf.odr = BME68X_ODR_NONE;
1930 conf.os_hum = BME68X_OS_16X;
1931 conf.os_pres = BME68X_OS_1X;
1932 conf.os_temp = BME68X_OS_2X;
1934 if (quiet ==
FALSE) {
1940 if (rslt == BME68X_OK) {
1941 heatr_conf.enable = BME68X_ENABLE;
1942 heatr_conf.heatr_temp = 300;
1943 heatr_conf.heatr_dur = 100;
1945 if (quiet ==
FALSE) {
1950 if (quiet ==
FALSE) {
1952 myPrintkI(
"Sample\tTemperature(deg C)\tPressure(Pa)\tHumidity(%%)\tGas resistance(ohm)\tStatus\n");
1956 while (sample_count < count) {
1973#ifdef BME68X_USE_FPU
1974 if (quiet ==
FALSE) {
int8_t bme68x_set_regs(const uint8_t *reg_addr, const uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev)
This API writes the given data to the register address of the sensor.
static int8_t read_variant_id(struct bme68x_dev *dev)
Read the sensor variant ID from the device register and store it in the device structure.
int8_t bme68x_set_heatr_conf(uint8_t op_mode, const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev)
uint32_t bme68x_get_meas_dur(const uint8_t op_mode, struct bme68x_conf *conf, struct bme68x_dev *dev)
int8_t bme68x_set_op_mode(const uint8_t op_mode, struct bme68x_dev *dev)
static uint32_t calc_gas_resistance_high(uint16_t gas_res_adc, uint8_t gas_range)
This internal API is used to calculate the gas resistance value in float.
int initBME688(void)
Initializes the BME688 sensor over SPI. Performs interface initialization, device reset,...
int8_t bme68x_get_op_mode(uint8_t *op_mode, struct bme68x_dev *dev)
static int16_t calc_temperature(uint32_t temp_adc, struct bme68x_dev *dev)
This internal API is used to calculate the temperature value.
static int8_t get_calib_data(struct bme68x_dev *dev)
Read calibration coefficients from the BME68x sensor registers.
static void sort_sensor_data(uint8_t low_index, uint8_t high_index, struct bme68x_data *field[])
static uint8_t calc_res_heat(uint16_t temp, const struct bme68x_dev *dev)
int8_t bme68x_get_heatr_conf(const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev)
This API is used to get the gas configuration of the sensor.
static uint8_t calc_gas_wait(uint16_t dur)
convert duration in milliseconds to encoded register value
static int8_t set_mem_page(uint8_t reg_addr, struct bme68x_dev *dev)
static int8_t boundary_check(uint8_t *value, uint8_t max, struct bme68x_dev *dev)
static uint8_t calc_heatr_dur_shared(uint16_t dur)
int8_t bme68x_init(struct bme68x_dev *dev)
Initializes the BME68X sensor.
static void swap_fields(uint8_t index1, uint8_t index2, struct bme68x_data *field[])
Swap two entries in the sensor data pointer array.
int8_t bme68x_get_conf(struct bme68x_conf *conf, struct bme68x_dev *dev)
int8_t bme68x_soft_reset(struct bme68x_dev *dev)
Triggers a software reset on the BME68X sensor.
int8_t bme68x_get_data(uint8_t op_mode, struct bme68x_data *data, uint8_t *n_data, struct bme68x_dev *dev)
int getBME688Data(int count, uint8_t quiet)
Triggers and retrieves measurement data from the BME688.
static uint32_t calc_humidity(uint16_t hum_adc, const struct bme68x_dev *dev)
Calculate relative humidity (in percent, float) from raw ADC value.
static int8_t read_field_data(uint8_t index, struct bme68x_data *data, struct bme68x_dev *dev)
static uint32_t calc_pressure(uint32_t pres_adc, const struct bme68x_dev *dev)
This internal API is used to calculate the pressure value.
int8_t bme68x_selftest_check(const struct bme68x_dev *dev)
static int8_t set_conf(const struct bme68x_heatr_conf *conf, uint8_t op_mode, uint8_t *nb_conv, struct bme68x_dev *dev)
static int8_t get_mem_page(struct bme68x_dev *dev)
static int8_t analyze_sensor_data(const struct bme68x_data *data, uint8_t n_meas)
Function to analyze the sensor data.
static int8_t read_all_field_data(struct bme68x_data *const data[], struct bme68x_dev *dev)
static int8_t null_ptr_check(const struct bme68x_dev *dev)
int8_t bme68x_set_conf(struct bme68x_conf *conf, struct bme68x_dev *dev)
Sets the oversampling, filter and ODR configurations of the sensor.
static uint32_t calc_gas_resistance_low(uint16_t gas_res_adc, uint8_t gas_range, const struct bme68x_dev *dev)
This internal API is used to calculate the gas resistance low value in float.
int8_t bme68x_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev)
This API reads the data from the given register address of sensor.
BME68X Sensor API header file.
int8_t bme68x_interface_init(struct bme68x_dev *bme, uint8_t intf)
Function to select the interface between SPI and I2C.
void bme68x_check_rslt(const char api_name[], int8_t rslt)
Log BME68X API result and error details.
uint32_t sensorTypePresentAll
struct bme68x_dev bme688_dev
BME688 device.
struct bme68x_data BME688Data
common struct, enum, externs, prototypes
int myPrintkS(char *restrict fmt,...)
prints a status message to the UART
int myPrintkI(char *restrict fmt,...)
prints an information message to the UART