Hi, I am Using BSEC 1.4.7.4 ( I have not tried the latest one, but I checked at the code and it didn't chagned) and using the bme680 API in github repository here https://github.com/BoschSensortec/BME680_driver. I didn't find a way to report this on github so here I am. I guess I have found a bug in the i2c retries in the "read_field_data" function, there is a retry mechanism put in place ( a do while loop 10 times), however the rslt return value from the bme680_get_regs function is not checked after this function. Thus in case of a failed read ( i2c nack let's say in my case), the rslt is not equal to OK, but the retry is never triggered due to the position of the "if" coundition on rslt. Here is the function : /*!
* @brief This internal API is used to calculate the field data of sensor.
*/
static int8_t read_field_data(struct bme680_field_data *data, struct bme680_dev *dev)
{
int8_t rslt;
uint8_t buff[BME680_FIELD_LENGTH] = { 0 };
uint8_t gas_range;
uint32_t adc_temp;
uint32_t adc_pres;
uint16_t adc_hum;
uint16_t adc_gas_res;
uint8_t tries = 10;
/* Check for null pointer in the device structure*/
rslt = null_ptr_check(dev);
do {
if (rslt == BME680_OK) {
rslt = bme680_get_regs(((uint8_t) (BME680_FIELD0_ADDR)), buff, (uint16_t) BME680_FIELD_LENGTH,
dev);
data->status = buff[0] & BME680_NEW_DATA_MSK;
data->gas_index = buff[0] & BME680_GAS_INDEX_MSK;
data->meas_index = buff[1];
/* read the raw data from the sensor */
adc_pres = (uint32_t) (((uint32_t) buff[2] * 4096) | ((uint32_t) buff[3] * 16)
| ((uint32_t) buff[4] / 16));
adc_temp = (uint32_t) (((uint32_t) buff[5] * 4096) | ((uint32_t) buff[6] * 16)
| ((uint32_t) buff[7] / 16));
adc_hum = (uint16_t) (((uint32_t) buff[8] * 256) | (uint32_t) buff[9]);
adc_gas_res = (uint16_t) ((uint32_t) buff[13] * 4 | (((uint32_t) buff[14]) / 64));
gas_range = buff[14] & BME680_GAS_RANGE_MSK;
data->status |= buff[14] & BME680_GASM_VALID_MSK;
data->status |= buff[14] & BME680_HEAT_STAB_MSK;
if (data->status & BME680_NEW_DATA_MSK) {
data->temperature = calc_temperature(adc_temp, dev);
data->pressure = calc_pressure(adc_pres, dev);
data->humidity = calc_humidity(adc_hum, dev);
data->gas_resistance = calc_gas_resistance(adc_gas_res, gas_range, dev);
break;
}
/* Delay to poll the data */
dev->delay_ms(BME680_POLL_PERIOD_MS);
}
tries--;
} while (tries);
if (!tries)
rslt = BME680_W_NO_NEW_DATA;
return rslt;
} Here is a suggested fix that don't take into account the result of the null_ptr_check --- a/bme680.c +++ b/bme680.c @@ -1222,10 +1222,10 @@ static int8_t read_field_data(struct bme680_field_data *data, struct bme680_dev /* Check for null pointer in the device structure*/ rslt = null_ptr_check(dev); do { - if (rslt == BME680_OK) { - rslt = bme680_get_regs(((uint8_t) (BME680_FIELD0_ADDR)), buff, (uint16_t) BME680_FIELD_LENGTH, - dev); + rslt = bme680_get_regs(((uint8_t) (BME680_FIELD0_ADDR)), buff, (uint16_t) BME680_FIELD_LENGTH, + dev); + if (rslt == BME680_OK) { data->status = buff[0] & BME680_NEW_DATA_MSK; data->gas_index = buff[0] & BME680_GAS_INDEX_MSK; data->meas_index = buff[1];
... View more