From a4cad3173fc49cc0286f6eedf6efbca15db6688e Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 25 Oct 2019 13:38:50 +0200 Subject: BME280 driver: normalize API, add i2cdetect test --- include/driver/bme280.h | 46 +++++++++++++++++++++++++------- src/app/i2cdetect/main.cc | 28 +++++++++++++++++++ src/driver/bme280.cc | 68 +++++++++++++++++++++++------------------------ 3 files changed, 98 insertions(+), 44 deletions(-) diff --git a/include/driver/bme280.h b/include/driver/bme280.h index e4e49fc..d07bde4 100644 --- a/include/driver/bme280.h +++ b/include/driver/bme280.h @@ -382,7 +382,7 @@ class BME280 { * @return Result of API execution status * @retval zero -> Success / +ve value -> Warning / -ve value -> Error */ - int8_t set_regs(uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len); + int8_t setRegs(uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len); /*! * @brief This API reads the data from the given register address of the sensor. @@ -394,7 +394,7 @@ class BME280 { * @return Result of API execution status * @retval zero -> Success / +ve value -> Warning / -ve value -> Error */ - int8_t get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len); + int8_t getRegs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len); /*! * @brief This API sets the oversampling, filter and standby duration @@ -418,7 +418,7 @@ class BME280 { * @return Result of API execution status * @retval zero -> Success / +ve value -> Warning / -ve value -> Error. */ - int8_t set_sensor_settings(uint8_t desired_settings); + int8_t setSensorSettings(uint8_t desired_settings); /*! * @brief This API gets the oversampling, filter and standby duration @@ -427,7 +427,7 @@ class BME280 { * @return Result of API execution status * @retval zero -> Success / +ve value -> Warning / -ve value -> Error. */ - int8_t get_sensor_settings(); + int8_t getSensorSettings(); /*! * @brief This API sets the power mode of the sensor. @@ -443,7 +443,7 @@ class BME280 { * @return Result of API execution status * @retval zero -> Success / +ve value -> Warning / -ve value -> Error */ - int8_t set_sensor_mode(uint8_t sensor_mode); + int8_t setSensorMode(uint8_t sensor_mode); /*! * @brief This API gets the power mode of the sensor. @@ -459,7 +459,7 @@ class BME280 { * @return Result of API execution status * @retval zero -> Success / +ve value -> Warning / -ve value -> Error */ - int8_t get_sensor_mode(uint8_t *sensor_mode); + int8_t getSensorMode(uint8_t *sensor_mode); /*! * @brief This API performs the soft reset of the sensor. @@ -467,7 +467,7 @@ class BME280 { * @return Result of API execution status * @retval zero -> Success / +ve value -> Warning / -ve value -> Error. */ - int8_t soft_reset(); + int8_t softReset(); /*! * @brief This API reads the pressure, temperature and humidity data from the @@ -489,7 +489,7 @@ class BME280 { * @return Result of API execution status * @retval zero -> Success / +ve value -> Warning / -ve value -> Error */ - int8_t get_sensor_data(uint8_t sensor_comp, struct bme280_data *comp_data); + int8_t getSensorData(uint8_t sensor_comp, struct bme280_data *comp_data); /*! * @brief This API is used to parse the pressure, temperature and @@ -499,7 +499,7 @@ class BME280 { * @param[out] uncomp_data : Contains the uncompensated pressure, temperature * and humidity data. */ - void parse_sensor_data(const uint8_t *reg_data, struct bme280_uncomp_data *uncomp_data); + void parseSensorData(const uint8_t *reg_data, struct bme280_uncomp_data *uncomp_data); /*! * @brief This API is used to compensate the pressure and/or @@ -517,11 +517,37 @@ class BME280 { * @return Result of API execution status. * @retval zero -> Success / -ve value -> Error */ - int8_t compensate_data(uint8_t sensor_comp, + int8_t compensateSensorData(uint8_t sensor_comp, const struct bme280_uncomp_data *uncomp_data, struct bme280_data *comp_data, struct bme280_calib_data *calib_data); + inline void configure(uint8_t os_hum, uint8_t os_pres, uint8_t os_temp) { + settings.osr_h = os_hum; + settings.osr_p = os_pres; + settings.osr_t = os_temp; + } + + inline void setHumidityOversampling(uint8_t os) { + settings.osr_h = os; + } + + inline void setPressureOversampling(uint8_t os) { + settings.osr_p = os; + } + + inline void setTemperatureOversampling(uint8_t os) { + settings.osr_t = os; + } + + inline void setStandbyTime(uint8_t standby_time) { + settings.standby_time = standby_time; + } + + inline void setFilter(uint8_t filter) { + settings.filter = filter; + } + }; extern BME280 bme280; diff --git a/src/app/i2cdetect/main.cc b/src/app/i2cdetect/main.cc index e235369..faa2725 100644 --- a/src/app/i2cdetect/main.cc +++ b/src/app/i2cdetect/main.cc @@ -12,6 +12,10 @@ #ifdef DRIVER_AM2320 #include "driver/am2320.h" #endif +#ifdef DRIVER_BME280 +#include "driver/bme280.h" +#include "driver/bme680_util.h" +#endif #ifdef DRIVER_BME680 #include "driver/bme680.h" #include "driver/bme680_util.h" @@ -52,6 +56,30 @@ void loop(void) kout << "AM2320 error " << dec << am2320.getStatus() << endl; } #endif +#ifdef DRIVER_BME280 + bme280.intf = BME280_I2C_INTF; + bme280.read = bme680_i2c_read; + bme280.write = bme680_i2c_write; + bme280.delay_ms = bme680_delay_ms; + + int8_t rslt = BME280_OK; + struct bme280_data comp_data; + rslt = bme280.init(); + kout << "BME280 init " << rslt << endl; + bme280.settings.osr_p = BME280_OVERSAMPLING_16X; + bme280.settings.osr_t = BME280_OVERSAMPLING_16X; + bme280.settings.osr_h = BME280_OVERSAMPLING_16X; + bme280.settings.filter = BME280_FILTER_COEFF_OFF; + bme280.settings.standby_time = BME280_STANDBY_TIME_500_MS; + bme280.setSensorSettings(BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL | BME280_STANDBY_SEL); + bme280.setSensorMode(BME280_NORMAL_MODE); + arch.delay_ms(100); + rslt = bme280.getSensorData(BME280_ALL, &comp_data); + kout << "BME280 read " << rslt << endl; + kout << "BME280 temperature " << (float)comp_data.temperature / 100 << " degC" << endl; + kout << "BME280 humidity " << (float)comp_data.humidity / 1024 << " %" << endl; + kout << "BME280 pressure " << (float)comp_data.pressure / 100 << " Pa" << endl; +#endif #ifdef DRIVER_BME680 bme680.intf = BME680_I2C_INTF; bme680.read = bme680_i2c_read; diff --git a/src/driver/bme280.cc b/src/driver/bme280.cc index 69ef445..bf2cab5 100644 --- a/src/driver/bme280.cc +++ b/src/driver/bme280.cc @@ -102,13 +102,13 @@ int8_t BME280::init() while (try_count) { /* Read the chip-id of bme280 sensor */ - rslt = get_regs(BME280_CHIP_ID_ADDR, &chip_id, 1); + rslt = getRegs(BME280_CHIP_ID_ADDR, &chip_id, 1); /* Check for chip id validity */ if ((rslt == BME280_OK) && (chip_id == BME280_CHIP_ID)) { /* Reset the sensor */ - rslt = soft_reset(); + rslt = softReset(); if (rslt == BME280_OK) { /* Read the calibration data */ @@ -135,7 +135,7 @@ int8_t BME280::init() /*! * @brief This API reads the data from the given register address of the sensor. */ -int8_t BME280::get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len) +int8_t BME280::getRegs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { int8_t rslt; @@ -168,7 +168,7 @@ int8_t BME280::get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len) * @brief This API writes the given data to the register address * of the sensor. */ -int8_t BME280::set_regs(uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len) +int8_t BME280::setRegs(uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len) { int8_t rslt; uint8_t temp_buff[20]; /* Typically not to write more than 10 registers */ @@ -237,7 +237,7 @@ int8_t BME280::set_regs(uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len) * @brief This API sets the oversampling, filter and standby duration * (normal mode) settings in the sensor. */ -int8_t BME280::set_sensor_settings(uint8_t desired_settings) +int8_t BME280::setSensorSettings(uint8_t desired_settings) { int8_t rslt; uint8_t sensor_mode; @@ -248,7 +248,7 @@ int8_t BME280::set_sensor_settings(uint8_t desired_settings) /* Proceed if null check is fine */ if (rslt == BME280_OK) { - rslt = get_sensor_mode(&sensor_mode); + rslt = getSensorMode(&sensor_mode); if ((rslt == BME280_OK) && (sensor_mode != BME280_SLEEP_MODE)) { rslt = put_device_to_sleep(); @@ -280,7 +280,7 @@ int8_t BME280::set_sensor_settings(uint8_t desired_settings) * @brief This API gets the oversampling, filter and standby duration * (normal mode) settings from the sensor. */ -int8_t BME280::get_sensor_settings() +int8_t BME280::getSensorSettings() { int8_t rslt; uint8_t reg_data[4]; @@ -291,7 +291,7 @@ int8_t BME280::get_sensor_settings() /* Proceed if null check is fine */ if (rslt == BME280_OK) { - rslt = get_regs(BME280_CTRL_HUM_ADDR, reg_data, 4); + rslt = getRegs(BME280_CTRL_HUM_ADDR, reg_data, 4); if (rslt == BME280_OK) { parse_device_settings(reg_data, &settings); @@ -304,7 +304,7 @@ int8_t BME280::get_sensor_settings() /*! * @brief This API sets the power mode of the sensor. */ -int8_t BME280::set_sensor_mode(uint8_t sensor_mode) +int8_t BME280::setSensorMode(uint8_t sensor_mode) { int8_t rslt; uint8_t last_set_mode; @@ -313,7 +313,7 @@ int8_t BME280::set_sensor_mode(uint8_t sensor_mode) rslt = null_ptr_check(); if (rslt == BME280_OK) { - rslt = get_sensor_mode(&last_set_mode); + rslt = getSensorMode(&last_set_mode); /* If the sensor is not in sleep mode put the device to sleep * mode @@ -336,7 +336,7 @@ int8_t BME280::set_sensor_mode(uint8_t sensor_mode) /*! * @brief This API gets the power mode of the sensor. */ -int8_t BME280::get_sensor_mode(uint8_t *sensor_mode) +int8_t BME280::getSensorMode(uint8_t *sensor_mode) { int8_t rslt; @@ -345,7 +345,7 @@ int8_t BME280::get_sensor_mode(uint8_t *sensor_mode) if (rslt == BME280_OK) { /* Read the power mode register */ - rslt = get_regs(BME280_PWR_CTRL_ADDR, sensor_mode, 1); + rslt = getRegs(BME280_PWR_CTRL_ADDR, sensor_mode, 1); /* Assign the power mode in the device structure */ *sensor_mode = BME280_GET_BITS_POS_0(*sensor_mode, BME280_SENSOR_MODE); @@ -357,7 +357,7 @@ int8_t BME280::get_sensor_mode(uint8_t *sensor_mode) /*! * @brief This API performs the soft reset of the sensor. */ -int8_t BME280::soft_reset() +int8_t BME280::softReset() { int8_t rslt; uint8_t reg_addr = BME280_RESET_ADDR; @@ -374,7 +374,7 @@ int8_t BME280::soft_reset() if (rslt == BME280_OK) { /* Write the soft reset command in the sensor */ - rslt = set_regs(®_addr, &soft_rst_cmd, 1); + rslt = setRegs(®_addr, &soft_rst_cmd, 1); if (rslt == BME280_OK) { @@ -383,7 +383,7 @@ int8_t BME280::soft_reset() { /* As per data sheet - Table 1, startup time is 2 ms. */ delay_ms(2); - rslt = get_regs(BME280_STATUS_REG_ADDR, &status_reg, 1); + rslt = getRegs(BME280_STATUS_REG_ADDR, &status_reg, 1); } while ((rslt == BME280_OK) && (try_run--) && (status_reg & BME280_STATUS_IM_UPDATE)); if (status_reg & BME280_STATUS_IM_UPDATE) @@ -402,7 +402,7 @@ int8_t BME280::soft_reset() * sensor, compensates the data and store it in the bme280_data structure * instance passed by the user. */ -int8_t BME280::get_sensor_data(uint8_t sensor_comp, struct bme280_data *comp_data) +int8_t BME280::getSensorData(uint8_t sensor_comp, struct bme280_data *comp_data) { int8_t rslt; @@ -417,16 +417,16 @@ int8_t BME280::get_sensor_data(uint8_t sensor_comp, struct bme280_data *comp_dat if ((rslt == BME280_OK) && (comp_data != NULL)) { /* Read the pressure and temperature data from the sensor */ - rslt = get_regs(BME280_DATA_ADDR, reg_data, BME280_P_T_H_DATA_LEN); + rslt = getRegs(BME280_DATA_ADDR, reg_data, BME280_P_T_H_DATA_LEN); if (rslt == BME280_OK) { /* Parse the read data from the sensor */ - parse_sensor_data(reg_data, &uncomp_data); + parseSensorData(reg_data, &uncomp_data); /* Compensate the pressure and/or temperature and/or * humidity data from the sensor */ - rslt = compensate_data(sensor_comp, &uncomp_data, comp_data, &calib_data); + rslt = compensateSensorData(sensor_comp, &uncomp_data, comp_data, &calib_data); } } else @@ -441,7 +441,7 @@ int8_t BME280::get_sensor_data(uint8_t sensor_comp, struct bme280_data *comp_dat * @brief This API is used to parse the pressure, temperature and * humidity data and store it in the bme280_uncomp_data structure instance. */ -void BME280::parse_sensor_data(const uint8_t *reg_data, struct bme280_uncomp_data *uncomp_data) +void BME280::parseSensorData(const uint8_t *reg_data, struct bme280_uncomp_data *uncomp_data) { /* Variables to store the sensor data */ uint32_t data_xlsb; @@ -471,7 +471,7 @@ void BME280::parse_sensor_data(const uint8_t *reg_data, struct bme280_uncomp_dat * temperature and/or humidity data according to the component selected * by the user. */ -int8_t BME280::compensate_data(uint8_t sensor_comp, +int8_t BME280::compensateSensorData(uint8_t sensor_comp, const struct bme280_uncomp_data *uncomp_data, struct bme280_data *comp_data, struct bme280_calib_data *calib_data) @@ -544,7 +544,7 @@ int8_t BME280::set_osr_humidity_settings(const struct bme280_settings *settings) ctrl_hum = settings->osr_h & BME280_CTRL_HUM_MSK; /* Write the humidity control value in the register */ - rslt = set_regs(®_addr, &ctrl_hum, 1); + rslt = setRegs(®_addr, &ctrl_hum, 1); /* Humidity related changes will be only effective after a * write operation to ctrl_meas register @@ -552,10 +552,10 @@ int8_t BME280::set_osr_humidity_settings(const struct bme280_settings *settings) if (rslt == BME280_OK) { reg_addr = BME280_CTRL_MEAS_ADDR; - rslt = get_regs(reg_addr, &ctrl_meas, 1); + rslt = getRegs(reg_addr, &ctrl_meas, 1); if (rslt == BME280_OK) { - rslt = set_regs(®_addr, &ctrl_meas, 1); + rslt = setRegs(®_addr, &ctrl_meas, 1); } } @@ -573,7 +573,7 @@ int8_t BME280::set_osr_press_temp_settings(uint8_t desired_settings, uint8_t reg_addr = BME280_CTRL_MEAS_ADDR; uint8_t reg_data; - rslt = BME280::get_regs(reg_addr, ®_data, 1); + rslt = BME280::getRegs(reg_addr, ®_data, 1); if (rslt == BME280_OK) { if (desired_settings & BME280_OSR_PRESS_SEL) @@ -586,7 +586,7 @@ int8_t BME280::set_osr_press_temp_settings(uint8_t desired_settings, } /* Write the oversampling settings in the register */ - rslt = BME280::set_regs(®_addr, ®_data, 1); + rslt = BME280::setRegs(®_addr, ®_data, 1); } return rslt; @@ -603,7 +603,7 @@ int8_t BME280::set_filter_standby_settings(uint8_t desired_settings, uint8_t reg_addr = BME280_CONFIG_ADDR; uint8_t reg_data; - rslt = get_regs(reg_addr, ®_data, 1); + rslt = getRegs(reg_addr, ®_data, 1); if (rslt == BME280_OK) { if (desired_settings & BME280_FILTER_SEL) @@ -616,7 +616,7 @@ int8_t BME280::set_filter_standby_settings(uint8_t desired_settings, } /* Write the oversampling settings in the register */ - rslt = set_regs(®_addr, ®_data, 1); + rslt = setRegs(®_addr, ®_data, 1); } return rslt; @@ -684,7 +684,7 @@ int8_t BME280::write_power_mode(uint8_t sensor_mode) uint8_t sensor_mode_reg_val; /* Read the power mode register */ - rslt = get_regs(reg_addr, &sensor_mode_reg_val, 1); + rslt = getRegs(reg_addr, &sensor_mode_reg_val, 1); /* Set the power mode */ if (rslt == BME280_OK) @@ -692,7 +692,7 @@ int8_t BME280::write_power_mode(uint8_t sensor_mode) sensor_mode_reg_val = BME280_SET_BITS_POS_0(sensor_mode_reg_val, BME280_SENSOR_MODE, sensor_mode); /* Write the power mode in the register */ - rslt = set_regs(®_addr, &sensor_mode_reg_val, 1); + rslt = setRegs(®_addr, &sensor_mode_reg_val, 1); } return rslt; @@ -707,11 +707,11 @@ int8_t BME280::put_device_to_sleep() uint8_t reg_data[4]; struct bme280_settings settings; - rslt = get_regs(BME280_CTRL_HUM_ADDR, reg_data, 4); + rslt = getRegs(BME280_CTRL_HUM_ADDR, reg_data, 4); if (rslt == BME280_OK) { parse_device_settings(reg_data, &settings); - rslt = soft_reset(); + rslt = softReset(); if (rslt == BME280_OK) { rslt = reload_device_settings(&settings); @@ -1050,7 +1050,7 @@ int8_t BME280::get_calib_data() uint8_t calib_data[BME280_TEMP_PRESS_CALIB_DATA_LEN] = { 0 }; /* Read the calibration data from the sensor */ - rslt = get_regs(reg_addr, calib_data, BME280_TEMP_PRESS_CALIB_DATA_LEN); + rslt = getRegs(reg_addr, calib_data, BME280_TEMP_PRESS_CALIB_DATA_LEN); if (rslt == BME280_OK) { /* Parse temperature and pressure calibration data and store @@ -1060,7 +1060,7 @@ int8_t BME280::get_calib_data() reg_addr = BME280_HUMIDITY_CALIB_DATA_ADDR; /* Read the humidity calibration data from the sensor */ - rslt = get_regs(reg_addr, calib_data, BME280_HUMIDITY_CALIB_DATA_LEN); + rslt = getRegs(reg_addr, calib_data, BME280_HUMIDITY_CALIB_DATA_LEN); if (rslt == BME280_OK) { /* Parse humidity calibration data and store it in -- cgit v1.2.3