From 11517648d32bc8213c38a987ec389f40feb5748e Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 25 Oct 2019 11:27:34 +0200 Subject: Add BME280 driver --- include/driver/bme280.h | 530 +++++++++++++++++++++++++++++++++++++++++++ include/driver/bme280_defs.h | 365 +++++++++++++++++++++++++++++ 2 files changed, 895 insertions(+) create mode 100644 include/driver/bme280.h create mode 100644 include/driver/bme280_defs.h (limited to 'include/driver') diff --git a/include/driver/bme280.h b/include/driver/bme280.h new file mode 100644 index 0000000..e4e49fc --- /dev/null +++ b/include/driver/bme280.h @@ -0,0 +1,530 @@ +/** + * Copyright (C) 2018 - 2019 Bosch Sensortec GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the copyright holder nor the names of the + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER + * OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + * The information provided is believed to be accurate and reliable. + * The copyright holder assumes no responsibility + * for the consequences of use + * of such information nor for any infringement of patents or + * other rights of third parties which may result from its use. + * No license is granted by implication or otherwise under any patent or + * patent rights of the copyright holder. + * + * @file bme280.h + * @date 26 Aug 2019 + * @version 3.3.7 + * @brief + * + */ + +/*! @file bme280.h + * @brief Sensor driver for BME280 sensor + */ + +/*! + * @defgroup BME280 SENSOR API + */ +#ifndef BME280_H_ +#define BME280_H_ + +/* Header includes */ +#include "driver/bme280_defs.h" + +class BME280 { + private: + BME280(const BME280 ©); + unsigned char txbuf[16]; + unsigned char rxbuf[8]; + + /*! + * @brief This internal API puts the device to sleep mode. + * + * @return Result of API execution status. + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t put_device_to_sleep(); + + /*! + * @brief This internal API writes the power mode in the sensor. + * + * @param[in] sensor_mode : Variable which contains the power mode to be set. + * + * @return Result of API execution status. + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t write_power_mode(uint8_t sensor_mode); + + /*! + * @brief This internal API is used to validate the device pointer for + * null conditions. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t null_ptr_check(); + + /*! + * @brief This internal API interleaves the register address between the + * register data buffer for burst write operation. + * + * @param[in] reg_addr : Contains the register address array. + * @param[out] temp_buff : Contains the temporary buffer to store the + * register data and register address. + * @param[in] reg_data : Contains the register data to be written in the + * temporary buffer. + * @param[in] len : No of bytes of data to be written for burst write. + */ + void interleave_reg_addr(const uint8_t *reg_addr, uint8_t *temp_buff, const uint8_t *reg_data, uint8_t len); + + /*! + * @brief This internal API reads the calibration data from the sensor, parse + * it and store in the device structure. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t get_calib_data(); + + /*! + * @brief This internal API is used to parse the temperature and + * pressure calibration data and store it in the device structure. + * + * @param[in] reg_data : Contains the calibration data to be parsed. + */ + void parse_temp_press_calib_data(const uint8_t *reg_data); + + /*! + * @brief This internal API is used to parse the humidity calibration data + * and store it in device structure. + * + * @param[in] reg_data : Contains calibration data to be parsed. + */ + void parse_humidity_calib_data(const uint8_t *reg_data); + +#ifdef BME280_FLOAT_ENABLE + + /*! + * @brief This internal API is used to compensate the raw pressure data and + * return the compensated pressure data in double data type. + * + * @param[in] uncomp_data : Contains the uncompensated pressure data. + * @param[in] calib_data : Pointer to the calibration data structure. + * + * @return Compensated pressure data. + * @retval Compensated pressure data in double. + */ + double compensate_pressure(const struct bme280_uncomp_data *uncomp_data, + const struct bme280_calib_data *calib_data); + + /*! + * @brief This internal API is used to compensate the raw humidity data and + * return the compensated humidity data in double data type. + * + * @param[in] uncomp_data : Contains the uncompensated humidity data. + * @param[in] calib_data : Pointer to the calibration data structure. + * + * @return Compensated humidity data. + * @retval Compensated humidity data in double. + */ + double compensate_humidity(const struct bme280_uncomp_data *uncomp_data, + const struct bme280_calib_data *calib_data); + + /*! + * @brief This internal API is used to compensate the raw temperature data and + * return the compensated temperature data in double data type. + * + * @param[in] uncomp_data : Contains the uncompensated temperature data. + * @param[in] calib_data : Pointer to calibration data structure. + * + * @return Compensated temperature data. + * @retval Compensated temperature data in double. + */ + double compensate_temperature(const struct bme280_uncomp_data *uncomp_data, + struct bme280_calib_data *calib_data); + +#else + + /*! + * @brief This internal API is used to compensate the raw temperature data and + * return the compensated temperature data in integer data type. + * + * @param[in] uncomp_data : Contains the uncompensated temperature data. + * @param[in] calib_data : Pointer to calibration data structure. + * + * @return Compensated temperature data. + * @retval Compensated temperature data in integer. + */ + int32_t compensate_temperature(const struct bme280_uncomp_data *uncomp_data, + struct bme280_calib_data *calib_data); + + /*! + * @brief This internal API is used to compensate the raw pressure data and + * return the compensated pressure data in integer data type. + * + * @param[in] uncomp_data : Contains the uncompensated pressure data. + * @param[in] calib_data : Pointer to the calibration data structure. + * + * @return Compensated pressure data. + * @retval Compensated pressure data in integer. + */ + uint32_t compensate_pressure(const struct bme280_uncomp_data *uncomp_data, + const struct bme280_calib_data *calib_data); + + /*! + * @brief This internal API is used to compensate the raw humidity data and + * return the compensated humidity data in integer data type. + * + * @param[in] uncomp_data : Contains the uncompensated humidity data. + * @param[in] calib_data : Pointer to the calibration data structure. + * + * @return Compensated humidity data. + * @retval Compensated humidity data in integer. + */ + uint32_t compensate_humidity(const struct bme280_uncomp_data *uncomp_data, + const struct bme280_calib_data *calib_data); + +#endif + + /*! + * @brief This internal API is used to identify the settings which the user + * wants to modify in the sensor. + * + * @param[in] sub_settings : Contains the settings subset to identify particular + * group of settings which the user is interested to change. + * @param[in] desired_settings : Contains the user specified settings. + * + * @return Indicates whether user is interested to modify the settings which + * are related to sub_settings. + * @retval True -> User wants to modify this group of settings + * @retval False -> User does not want to modify this group of settings + */ + uint8_t are_settings_changed(uint8_t sub_settings, uint8_t desired_settings); + + /*! + * @brief This API sets the humidity oversampling settings of the sensor. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t set_osr_humidity_settings(const struct bme280_settings *settings); + + /*! + * @brief This internal API sets the oversampling settings for pressure, + * temperature and humidity in the sensor. + * + * @param[in] desired_settings : Variable used to select the settings which + * are to be set. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t set_osr_settings(uint8_t desired_settings, + const struct bme280_settings *settings); + + /*! + * @brief This API sets the pressure and/or temperature oversampling settings + * in the sensor according to the settings selected by the user. + * + * @param[in] desired_settings: variable to select the pressure and/or + * temperature oversampling settings. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t set_osr_press_temp_settings(uint8_t desired_settings, + const struct bme280_settings *settings); + + /*! + * @brief This internal API fills the pressure oversampling settings provided by + * the user in the data buffer so as to write in the sensor. + * + * @param[out] reg_data : Variable which is filled according to the pressure + * oversampling data provided by the user. + */ + void fill_osr_press_settings(uint8_t *reg_data, const struct bme280_settings *settings); + + /*! + * @brief This internal API fills the temperature oversampling settings provided + * by the user in the data buffer so as to write in the sensor. + * + * @param[out] reg_data : Variable which is filled according to the temperature + * oversampling data provided by the user. + */ + void fill_osr_temp_settings(uint8_t *reg_data, const struct bme280_settings *settings); + + /*! + * @brief This internal API sets the filter and/or standby duration settings + * in the sensor according to the settings selected by the user. + * + * @param[in] desired_settings : variable to select the filter and/or + * standby duration settings. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t set_filter_standby_settings(uint8_t desired_settings, + const struct bme280_settings *settings); + + /*! + * @brief This internal API fills the filter settings provided by the user + * in the data buffer so as to write in the sensor. + * + * @param[out] reg_data : Variable which is filled according to the filter + * settings data provided by the user. + */ + void fill_filter_settings(uint8_t *reg_data, const struct bme280_settings *settings); + + /*! + * @brief This internal API fills the standby duration settings provided by the + * user in the data buffer so as to write in the sensor. + * + * @param[out] reg_data : Variable which is filled according to the standby + * settings data provided by the user. + */ + void fill_standby_settings(uint8_t *reg_data, const struct bme280_settings *settings); + + /*! + * @brief This internal API parse the oversampling(pressure, temperature + * and humidity), filter and standby duration settings and store in the + * device structure. + * + * @param[in] reg_data : Register data to be parsed. + */ + void parse_device_settings(const uint8_t *reg_data, struct bme280_settings *settings); + + /*! + * @brief This internal API reloads the already existing device settings in the + * sensor after soft reset. + * + * @param[in] settings : Pointer variable which contains the settings to + * be set in the sensor. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t reload_device_settings(const struct bme280_settings *settings); + + public: + + /*! Chip Id */ + uint8_t chip_id; + + /*! Device Id */ + uint8_t dev_id; + + /*! SPI/I2C interface */ + enum bme280_intf intf; + + /*! Read function pointer */ + bme280_com_fptr_t read; + + /*! Write function pointer */ + bme280_com_fptr_t write; + + /*! Delay function pointer */ + bme280_delay_fptr_t delay_ms; + + /*! Trim data */ + struct bme280_calib_data calib_data; + + /*! Sensor settings */ + struct bme280_settings settings; + + BME280(uint8_t const addr) : dev_id(addr) {} + + /*! + * @brief This API is the entry point. + * It reads the chip-id and calibration data from the sensor. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t init(); + + /*! + * @brief This API writes the given data to the register address + * of the sensor. + * + * @param[in] reg_addr : Register address from where the data to be written. + * @param[in] reg_data : Pointer to data buffer which is to be written + * in the sensor. + * @param[in] len : No of bytes of data to write.. + * + * @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); + + /*! + * @brief This API reads the data from the given register address of the sensor. + * + * @param[in] reg_addr : Register address from where the data to be read + * @param[out] reg_data : Pointer to data buffer to store the read data. + * @param[in] len : No of bytes of data to be read. + * + * @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); + + /*! + * @brief This API sets the oversampling, filter and standby duration + * (normal mode) settings in the sensor. + * + * @param[in] desired_settings : Variable used to select the settings which + * are to be set in the sensor. + * + * @note : Below are the macros to be used by the user for selecting the + * desired settings. User can do OR operation of these macros for configuring + * multiple settings. + * + * Macros | Functionality + * -----------------------|---------------------------------------------- + * BME280_OSR_PRESS_SEL | To set pressure oversampling. + * BME280_OSR_TEMP_SEL | To set temperature oversampling. + * BME280_OSR_HUM_SEL | To set humidity oversampling. + * BME280_FILTER_SEL | To set filter setting. + * BME280_STANDBY_SEL | To set standby duration setting. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error. + */ + int8_t set_sensor_settings(uint8_t desired_settings); + + /*! + * @brief This API gets the oversampling, filter and standby duration + * (normal mode) settings from the sensor. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error. + */ + int8_t get_sensor_settings(); + + /*! + * @brief This API sets the power mode of the sensor. + * + * @param[in] sensor_mode : Variable which contains the power mode to be set. + * + * sensor_mode | Macros + * ---------------------|------------------- + * 0 | BME280_SLEEP_MODE + * 1 | BME280_FORCED_MODE + * 3 | BME280_NORMAL_MODE + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t set_sensor_mode(uint8_t sensor_mode); + + /*! + * @brief This API gets the power mode of the sensor. + * + * @param[out] sensor_mode : Pointer variable to store the power mode. + * + * sensor_mode | Macros + * ---------------------|------------------- + * 0 | BME280_SLEEP_MODE + * 1 | BME280_FORCED_MODE + * 3 | BME280_NORMAL_MODE + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ + int8_t get_sensor_mode(uint8_t *sensor_mode); + + /*! + * @brief This API performs the soft reset of the sensor. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error. + */ + int8_t soft_reset(); + + /*! + * @brief This API reads the pressure, temperature and humidity data from the + * sensor, compensates the data and store it in the bme280_data structure + * instance passed by the user. + * + * @param[in] sensor_comp : Variable which selects which data to be read from + * the sensor. + * + * sensor_comp | Macros + * ------------|------------------- + * 1 | BME280_PRESS + * 2 | BME280_TEMP + * 4 | BME280_HUM + * 7 | BME280_ALL + * + * @param[out] comp_data : Structure instance of bme280_data. + * + * @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); + + /*! + * @brief This API is used to parse the pressure, temperature and + * humidity data and store it in the bme280_uncomp_data structure instance. + * + * @param[in] reg_data : Contains register data which needs to be parsed + * @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); + + /*! + * @brief This API is used to compensate the pressure and/or + * temperature and/or humidity data according to the component selected by the + * user. + * + * @param[in] sensor_comp : Used to select pressure and/or temperature and/or + * humidity. + * @param[in] uncomp_data : Contains the uncompensated pressure, temperature and + * humidity data. + * @param[out] comp_data : Contains the compensated pressure and/or temperature + * and/or humidity data. + * @param[in] calib_data : Pointer to the calibration data structure. + * + * @return Result of API execution status. + * @retval zero -> Success / -ve value -> Error + */ + int8_t compensate_data(uint8_t sensor_comp, + const struct bme280_uncomp_data *uncomp_data, + struct bme280_data *comp_data, + struct bme280_calib_data *calib_data); + +}; + +extern BME280 bme280; + +#endif /* BME280_H_ */ +/** @}*/ diff --git a/include/driver/bme280_defs.h b/include/driver/bme280_defs.h new file mode 100644 index 0000000..745954a --- /dev/null +++ b/include/driver/bme280_defs.h @@ -0,0 +1,365 @@ +/** + * Copyright (C) 2018 - 2019 Bosch Sensortec GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the copyright holder nor the names of the + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER + * OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + * The information provided is believed to be accurate and reliable. + * The copyright holder assumes no responsibility + * for the consequences of use + * of such information nor for any infringement of patents or + * other rights of third parties which may result from its use. + * No license is granted by implication or otherwise under any patent or + * patent rights of the copyright holder. + * + * @file bme280_defs.h + * @date 26 Aug 2019 + * @version 3.3.7 + * @brief + * + */ + +/*! @file bme280_defs.h + * @brief Sensor driver for BME280 sensor + */ + +/*! + * @defgroup BME280 SENSOR API + * @brief + */ +#ifndef BME280_DEFS_H_ +#define BME280_DEFS_H_ + +/********************************************************/ +/* header includes */ +#ifdef __KERNEL__ +#include +#include +#else +#include +#include +#endif + +/********************************************************/ +/*! @name Common macros */ +/********************************************************/ + +#if !defined(UINT8_C) && !defined(INT8_C) +#define INT8_C(x) S8_C(x) +#define UINT8_C(x) U8_C(x) +#endif + +#if !defined(UINT16_C) && !defined(INT16_C) +#define INT16_C(x) S16_C(x) +#define UINT16_C(x) U16_C(x) +#endif + +#if !defined(INT32_C) && !defined(UINT32_C) +#define INT32_C(x) S32_C(x) +#define UINT32_C(x) U32_C(x) +#endif + +#if !defined(INT64_C) && !defined(UINT64_C) +#define INT64_C(x) S64_C(x) +#define UINT64_C(x) U64_C(x) +#endif + +/**@}*/ +/**\name C standard macros */ +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *) 0) +#endif +#endif + +/********************************************************/ + +#ifndef BME280_FLOAT_ENABLE + +/* #define BME280_FLOAT_ENABLE */ +#endif + +#ifndef BME280_FLOAT_ENABLE +#ifndef BME280_64BIT_ENABLE +#define BME280_64BIT_ENABLE +#endif +#endif + +#ifndef TRUE +#define TRUE UINT8_C(1) +#endif +#ifndef FALSE +#define FALSE UINT8_C(0) +#endif + +/**\name I2C addresses */ +#define BME280_I2C_ADDR_PRIM UINT8_C(0x76) +#define BME280_I2C_ADDR_SEC UINT8_C(0x77) + +/**\name BME280 chip identifier */ +#define BME280_CHIP_ID UINT8_C(0x60) + +/**\name Register Address */ +#define BME280_CHIP_ID_ADDR UINT8_C(0xD0) +#define BME280_RESET_ADDR UINT8_C(0xE0) +#define BME280_TEMP_PRESS_CALIB_DATA_ADDR UINT8_C(0x88) +#define BME280_HUMIDITY_CALIB_DATA_ADDR UINT8_C(0xE1) +#define BME280_PWR_CTRL_ADDR UINT8_C(0xF4) +#define BME280_CTRL_HUM_ADDR UINT8_C(0xF2) +#define BME280_CTRL_MEAS_ADDR UINT8_C(0xF4) +#define BME280_CONFIG_ADDR UINT8_C(0xF5) +#define BME280_DATA_ADDR UINT8_C(0xF7) + +/**\name API success code */ +#define BME280_OK INT8_C(0) + +/**\name API error codes */ +#define BME280_E_NULL_PTR INT8_C(-1) +#define BME280_E_DEV_NOT_FOUND INT8_C(-2) +#define BME280_E_INVALID_LEN INT8_C(-3) +#define BME280_E_COMM_FAIL INT8_C(-4) +#define BME280_E_SLEEP_MODE_FAIL INT8_C(-5) +#define BME280_E_NVM_COPY_FAILED INT8_C(-6) + +/**\name API warning codes */ +#define BME280_W_INVALID_OSR_MACRO INT8_C(1) + +/**\name Macros related to size */ +#define BME280_TEMP_PRESS_CALIB_DATA_LEN UINT8_C(26) +#define BME280_HUMIDITY_CALIB_DATA_LEN UINT8_C(7) +#define BME280_P_T_H_DATA_LEN UINT8_C(8) + +/**\name Sensor power modes */ +#define BME280_SLEEP_MODE UINT8_C(0x00) +#define BME280_FORCED_MODE UINT8_C(0x01) +#define BME280_NORMAL_MODE UINT8_C(0x03) + +/**\name Macro to combine two 8 bit data's to form a 16 bit data */ +#define BME280_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb) + +#define BME280_SET_BITS(reg_data, bitname, data) \ + ((reg_data & ~(bitname##_MSK)) | \ + ((data << bitname##_POS) & bitname##_MSK)) +#define BME280_SET_BITS_POS_0(reg_data, bitname, data) \ + ((reg_data & ~(bitname##_MSK)) | \ + (data & bitname##_MSK)) + +#define BME280_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \ + (bitname##_POS)) +#define BME280_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK)) + +/**\name Macros for bit masking */ +#define BME280_SENSOR_MODE_MSK UINT8_C(0x03) +#define BME280_SENSOR_MODE_POS UINT8_C(0x00) + +#define BME280_CTRL_HUM_MSK UINT8_C(0x07) +#define BME280_CTRL_HUM_POS UINT8_C(0x00) + +#define BME280_CTRL_PRESS_MSK UINT8_C(0x1C) +#define BME280_CTRL_PRESS_POS UINT8_C(0x02) + +#define BME280_CTRL_TEMP_MSK UINT8_C(0xE0) +#define BME280_CTRL_TEMP_POS UINT8_C(0x05) + +#define BME280_FILTER_MSK UINT8_C(0x1C) +#define BME280_FILTER_POS UINT8_C(0x02) + +#define BME280_STANDBY_MSK UINT8_C(0xE0) +#define BME280_STANDBY_POS UINT8_C(0x05) + +/**\name Sensor component selection macros + * These values are internal for API implementation. Don't relate this to + * data sheet. + */ +#define BME280_PRESS UINT8_C(1) +#define BME280_TEMP UINT8_C(1 << 1) +#define BME280_HUM UINT8_C(1 << 2) +#define BME280_ALL UINT8_C(0x07) + +/**\name Settings selection macros */ +#define BME280_OSR_PRESS_SEL UINT8_C(1) +#define BME280_OSR_TEMP_SEL UINT8_C(1 << 1) +#define BME280_OSR_HUM_SEL UINT8_C(1 << 2) +#define BME280_FILTER_SEL UINT8_C(1 << 3) +#define BME280_STANDBY_SEL UINT8_C(1 << 4) +#define BME280_ALL_SETTINGS_SEL UINT8_C(0x1F) + +/**\name Oversampling macros */ +#define BME280_NO_OVERSAMPLING UINT8_C(0x00) +#define BME280_OVERSAMPLING_1X UINT8_C(0x01) +#define BME280_OVERSAMPLING_2X UINT8_C(0x02) +#define BME280_OVERSAMPLING_4X UINT8_C(0x03) +#define BME280_OVERSAMPLING_8X UINT8_C(0x04) +#define BME280_OVERSAMPLING_16X UINT8_C(0x05) + +/**\name Standby duration selection macros */ +#define BME280_STANDBY_TIME_0_5_MS (0x00) +#define BME280_STANDBY_TIME_62_5_MS (0x01) +#define BME280_STANDBY_TIME_125_MS (0x02) +#define BME280_STANDBY_TIME_250_MS (0x03) +#define BME280_STANDBY_TIME_500_MS (0x04) +#define BME280_STANDBY_TIME_1000_MS (0x05) +#define BME280_STANDBY_TIME_10_MS (0x06) +#define BME280_STANDBY_TIME_20_MS (0x07) + +/**\name Filter coefficient selection macros */ +#define BME280_FILTER_COEFF_OFF (0x00) +#define BME280_FILTER_COEFF_2 (0x01) +#define BME280_FILTER_COEFF_4 (0x02) +#define BME280_FILTER_COEFF_8 (0x03) +#define BME280_FILTER_COEFF_16 (0x04) + +#define BME280_STATUS_REG_ADDR (0xF3) +#define BME280_SOFT_RESET_COMMAND (0xB6) +#define BME280_STATUS_IM_UPDATE (0x01) + +/*! + * @brief Interface selection Enums + */ +enum bme280_intf { + /*! SPI interface */ + BME280_SPI_INTF, + + /*! I2C interface */ + BME280_I2C_INTF +}; + +/*! + * @brief Type definitions + */ +typedef int8_t (*bme280_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len); +typedef void (*bme280_delay_fptr_t)(uint32_t period); + +/*! + * @brief Calibration data + */ +struct bme280_calib_data +{ + /** + * @ Trim Variables + */ + + /**@{*/ + uint16_t dig_T1; + int16_t dig_T2; + int16_t dig_T3; + uint16_t dig_P1; + int16_t dig_P2; + int16_t dig_P3; + int16_t dig_P4; + int16_t dig_P5; + int16_t dig_P6; + int16_t dig_P7; + int16_t dig_P8; + int16_t dig_P9; + uint8_t dig_H1; + int16_t dig_H2; + uint8_t dig_H3; + int16_t dig_H4; + int16_t dig_H5; + int8_t dig_H6; + int32_t t_fine; + + /**@}*/ +}; + +/*! + * @brief bme280 sensor structure which comprises of temperature, pressure and + * humidity data + */ +#ifdef BME280_FLOAT_ENABLE +struct bme280_data +{ + /*! Compensated pressure */ + double pressure; + + /*! Compensated temperature */ + double temperature; + + /*! Compensated humidity */ + double humidity; +}; +#else +struct bme280_data +{ + /*! Compensated pressure */ + uint32_t pressure; + + /*! Compensated temperature */ + int32_t temperature; + + /*! Compensated humidity */ + uint32_t humidity; +}; +#endif /* BME280_USE_FLOATING_POINT */ + +/*! + * @brief bme280 sensor structure which comprises of uncompensated temperature, + * pressure and humidity data + */ +struct bme280_uncomp_data +{ + /*! un-compensated pressure */ + uint32_t pressure; + + /*! un-compensated temperature */ + uint32_t temperature; + + /*! un-compensated humidity */ + uint32_t humidity; +}; + +/*! + * @brief bme280 sensor settings structure which comprises of mode, + * oversampling and filter settings. + */ +struct bme280_settings +{ + /*! pressure oversampling */ + uint8_t osr_p; + + /*! temperature oversampling */ + uint8_t osr_t; + + /*! humidity oversampling */ + uint8_t osr_h; + + /*! filter coefficient */ + uint8_t filter; + + /*! standby time */ + uint8_t standby_time; +}; + +#endif /* BME280_DEFS_H_ */ +/** @}*/ +/** @}*/ -- cgit v1.2.3