Low power gas, pressure, temperature and humidity sensor

Dependents:   MERGE Sensor_iAQ_sgp30_bme_si7051 POCBreath_V2_smd_commercial

Committer:
mcm
Date:
Mon Jul 23 11:41:39 2018 +0000
Revision:
3:8aefe9304f85
Parent:
2:090496028eb9
An example that shows how to use this driver was added into the header file.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 0:0180d9905fe5 1 /**
mcm 1:4d60db802cfb 2 * @brief bme680_defs.h
mcm 1:4d60db802cfb 3 * @details Low power gas, pressure, temperature & humidity sensor.
mcm 1:4d60db802cfb 4 * Header file.
mcm 1:4d60db802cfb 5 *
mcm 1:4d60db802cfb 6 *
mcm 1:4d60db802cfb 7 * @return N/A
mcm 1:4d60db802cfb 8 *
mcm 1:4d60db802cfb 9 * @author Manuel Caballero
mcm 1:4d60db802cfb 10 * @date 21/July/2018
mcm 1:4d60db802cfb 11 * @version 21/July/2018 The ORIGIN
mcm 1:4d60db802cfb 12 * @pre This is just a port from Bosh driver to mBed ( c++ )
mcm 1:4d60db802cfb 13 * @warning N/A
mcm 1:4d60db802cfb 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
mcm 1:4d60db802cfb 15 */
mcm 1:4d60db802cfb 16 /**
mcm 0:0180d9905fe5 17 * Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
mcm 0:0180d9905fe5 18 *
mcm 0:0180d9905fe5 19 * Redistribution and use in source and binary forms, with or without
mcm 0:0180d9905fe5 20 * modification, are permitted provided that the following conditions are met:
mcm 0:0180d9905fe5 21 *
mcm 0:0180d9905fe5 22 * Redistributions of source code must retain the above copyright
mcm 0:0180d9905fe5 23 * notice, this list of conditions and the following disclaimer.
mcm 0:0180d9905fe5 24 *
mcm 0:0180d9905fe5 25 * Redistributions in binary form must reproduce the above copyright
mcm 0:0180d9905fe5 26 * notice, this list of conditions and the following disclaimer in the
mcm 0:0180d9905fe5 27 * documentation and/or other materials provided with the distribution.
mcm 0:0180d9905fe5 28 *
mcm 0:0180d9905fe5 29 * Neither the name of the copyright holder nor the names of the
mcm 0:0180d9905fe5 30 * contributors may be used to endorse or promote products derived from
mcm 0:0180d9905fe5 31 * this software without specific prior written permission.
mcm 0:0180d9905fe5 32 *
mcm 0:0180d9905fe5 33 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
mcm 0:0180d9905fe5 34 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
mcm 0:0180d9905fe5 35 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
mcm 0:0180d9905fe5 36 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mcm 0:0180d9905fe5 37 * DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
mcm 0:0180d9905fe5 38 * OR CONTRIBUTORS BE LIABLE FOR ANY
mcm 0:0180d9905fe5 39 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
mcm 0:0180d9905fe5 40 * OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
mcm 0:0180d9905fe5 41 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
mcm 0:0180d9905fe5 42 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
mcm 0:0180d9905fe5 43 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
mcm 0:0180d9905fe5 44 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
mcm 0:0180d9905fe5 45 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mcm 0:0180d9905fe5 46 * ANY WAY OUT OF THE USE OF THIS
mcm 0:0180d9905fe5 47 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
mcm 0:0180d9905fe5 48 *
mcm 0:0180d9905fe5 49 * The information provided is believed to be accurate and reliable.
mcm 0:0180d9905fe5 50 * The copyright holder assumes no responsibility
mcm 0:0180d9905fe5 51 * for the consequences of use
mcm 0:0180d9905fe5 52 * of such information nor for any infringement of patents or
mcm 0:0180d9905fe5 53 * other rights of third parties which may result from its use.
mcm 0:0180d9905fe5 54 * No license is granted by implication or otherwise under any patent or
mcm 0:0180d9905fe5 55 * patent rights of the copyright holder.
mcm 0:0180d9905fe5 56 *
mcm 0:0180d9905fe5 57 * @file bme680_defs.h
mcm 0:0180d9905fe5 58 * @date 19 Jun 2018
mcm 0:0180d9905fe5 59 * @version 3.5.9
mcm 0:0180d9905fe5 60 * @brief
mcm 0:0180d9905fe5 61 *
mcm 0:0180d9905fe5 62 */
mcm 0:0180d9905fe5 63
mcm 0:0180d9905fe5 64 /*! @file bme680_defs.h
mcm 0:0180d9905fe5 65 @brief Sensor driver for BME680 sensor */
mcm 0:0180d9905fe5 66 /*!
mcm 0:0180d9905fe5 67 * @defgroup BME680 SENSOR API
mcm 0:0180d9905fe5 68 * @brief
mcm 0:0180d9905fe5 69 * @{*/
mcm 0:0180d9905fe5 70 #ifndef BME680_DEFS_H_
mcm 0:0180d9905fe5 71 #define BME680_DEFS_H_
mcm 0:0180d9905fe5 72
mcm 0:0180d9905fe5 73 /********************************************************/
mcm 0:0180d9905fe5 74 /* header includes */
mcm 0:0180d9905fe5 75 #ifdef __KERNEL__
mcm 0:0180d9905fe5 76 #include <linux/types.h>
mcm 0:0180d9905fe5 77 #include <linux/kernel.h>
mcm 0:0180d9905fe5 78 #else
mcm 0:0180d9905fe5 79 #include <stdint.h>
mcm 0:0180d9905fe5 80 #include <stddef.h>
mcm 0:0180d9905fe5 81 #endif
mcm 0:0180d9905fe5 82
mcm 0:0180d9905fe5 83 /******************************************************************************/
mcm 0:0180d9905fe5 84 /*! @name Common macros */
mcm 0:0180d9905fe5 85 /******************************************************************************/
mcm 2:090496028eb9 86 /* [MANUEL] Compatible with mBed
mcm 0:0180d9905fe5 87 #if !defined(UINT8_C) && !defined(INT8_C)
mcm 0:0180d9905fe5 88 #define INT8_C(x) S8_C(x)
mcm 0:0180d9905fe5 89 #define UINT8_C(x) U8_C(x)
mcm 0:0180d9905fe5 90 #endif
mcm 0:0180d9905fe5 91
mcm 0:0180d9905fe5 92 #if !defined(UINT16_C) && !defined(INT16_C)
mcm 0:0180d9905fe5 93 #define INT16_C(x) S16_C(x)
mcm 0:0180d9905fe5 94 #define UINT16_C(x) U16_C(x)
mcm 0:0180d9905fe5 95 #endif
mcm 0:0180d9905fe5 96
mcm 0:0180d9905fe5 97 #if !defined(INT32_C) && !defined(UINT32_C)
mcm 0:0180d9905fe5 98 #define INT32_C(x) S32_C(x)
mcm 0:0180d9905fe5 99 #define UINT32_C(x) U32_C(x)
mcm 0:0180d9905fe5 100 #endif
mcm 0:0180d9905fe5 101
mcm 0:0180d9905fe5 102 #if !defined(INT64_C) && !defined(UINT64_C)
mcm 0:0180d9905fe5 103 #define INT64_C(x) S64_C(x)
mcm 0:0180d9905fe5 104 #define UINT64_C(x) U64_C(x)
mcm 0:0180d9905fe5 105 #endif
mcm 1:4d60db802cfb 106 */
mcm 1:4d60db802cfb 107
mcm 1:4d60db802cfb 108 #if !defined(UINT8_C) && !defined(INT8_C)
mcm 1:4d60db802cfb 109 #define INT8_C(x) int8_t(x)
mcm 1:4d60db802cfb 110 #define UINT8_C(x) uint8_t(x)
mcm 1:4d60db802cfb 111 #endif
mcm 1:4d60db802cfb 112
mcm 1:4d60db802cfb 113 #if !defined(UINT16_C) && !defined(INT16_C)
mcm 1:4d60db802cfb 114 #define INT16_C(x) int16_t(x)
mcm 1:4d60db802cfb 115 #define UINT16_C(x) uint16_t(x)
mcm 1:4d60db802cfb 116 #endif
mcm 1:4d60db802cfb 117
mcm 1:4d60db802cfb 118 #if !defined(INT32_C) && !defined(UINT32_C)
mcm 1:4d60db802cfb 119 #define INT32_C(x) int32_t(x)
mcm 1:4d60db802cfb 120 #define UINT32_C(x) uint32_t(x)
mcm 1:4d60db802cfb 121 #endif
mcm 1:4d60db802cfb 122
mcm 1:4d60db802cfb 123 #if !defined(INT64_C) && !defined(UINT64_C)
mcm 1:4d60db802cfb 124 #define INT64_C(x) int64_t(x)
mcm 1:4d60db802cfb 125 #define UINT64_C(x) uint64_t(x)
mcm 1:4d60db802cfb 126 #endif
mcm 1:4d60db802cfb 127
mcm 0:0180d9905fe5 128
mcm 0:0180d9905fe5 129 /**@}*/
mcm 0:0180d9905fe5 130
mcm 0:0180d9905fe5 131 /**\name C standard macros */
mcm 0:0180d9905fe5 132 #ifndef NULL
mcm 0:0180d9905fe5 133 #ifdef __cplusplus
mcm 0:0180d9905fe5 134 #define NULL 0
mcm 0:0180d9905fe5 135 #else
mcm 0:0180d9905fe5 136 #define NULL ((void *) 0)
mcm 0:0180d9905fe5 137 #endif
mcm 0:0180d9905fe5 138 #endif
mcm 0:0180d9905fe5 139
mcm 0:0180d9905fe5 140 /** BME680 configuration macros */
mcm 0:0180d9905fe5 141 /** Enable or un-comment the macro to provide floating point data output */
mcm 0:0180d9905fe5 142 #ifndef BME680_FLOAT_POINT_COMPENSATION
mcm 0:0180d9905fe5 143 /* #define BME680_FLOAT_POINT_COMPENSATION */
mcm 0:0180d9905fe5 144 #endif
mcm 0:0180d9905fe5 145
mcm 0:0180d9905fe5 146 /** BME680 General config */
mcm 0:0180d9905fe5 147 #define BME680_POLL_PERIOD_MS UINT8_C(10)
mcm 0:0180d9905fe5 148
mcm 0:0180d9905fe5 149 /** BME680 I2C addresses */
mcm 2:090496028eb9 150 #define BME680_I2C_ADDR_PRIMARY UINT8_C( ( 0x76 << 1 ) ) // [MANUEL] Address compatible with mBed
mcm 2:090496028eb9 151 #define BME680_I2C_ADDR_SECONDARY UINT8_C( ( 0x77 << 1 ) ) // [MANUEL] Address compatible with mBed
mcm 0:0180d9905fe5 152
mcm 0:0180d9905fe5 153 /** BME680 unique chip identifier */
mcm 0:0180d9905fe5 154 #define BME680_CHIP_ID UINT8_C(0x61)
mcm 0:0180d9905fe5 155
mcm 0:0180d9905fe5 156 /** BME680 coefficients related defines */
mcm 0:0180d9905fe5 157 #define BME680_COEFF_SIZE UINT8_C(41)
mcm 0:0180d9905fe5 158 #define BME680_COEFF_ADDR1_LEN UINT8_C(25)
mcm 0:0180d9905fe5 159 #define BME680_COEFF_ADDR2_LEN UINT8_C(16)
mcm 0:0180d9905fe5 160
mcm 0:0180d9905fe5 161 /** BME680 field_x related defines */
mcm 0:0180d9905fe5 162 #define BME680_FIELD_LENGTH UINT8_C(15)
mcm 0:0180d9905fe5 163 #define BME680_FIELD_ADDR_OFFSET UINT8_C(17)
mcm 0:0180d9905fe5 164
mcm 0:0180d9905fe5 165 /** Soft reset command */
mcm 0:0180d9905fe5 166 #define BME680_SOFT_RESET_CMD UINT8_C(0xb6)
mcm 0:0180d9905fe5 167
mcm 0:0180d9905fe5 168 /** Error code definitions */
mcm 0:0180d9905fe5 169 #define BME680_OK INT8_C(0)
mcm 0:0180d9905fe5 170 /* Errors */
mcm 0:0180d9905fe5 171 #define BME680_E_NULL_PTR INT8_C(-1)
mcm 0:0180d9905fe5 172 #define BME680_E_COM_FAIL INT8_C(-2)
mcm 0:0180d9905fe5 173 #define BME680_E_DEV_NOT_FOUND INT8_C(-3)
mcm 0:0180d9905fe5 174 #define BME680_E_INVALID_LENGTH INT8_C(-4)
mcm 0:0180d9905fe5 175
mcm 0:0180d9905fe5 176 /* Warnings */
mcm 0:0180d9905fe5 177 #define BME680_W_DEFINE_PWR_MODE INT8_C(1)
mcm 0:0180d9905fe5 178 #define BME680_W_NO_NEW_DATA INT8_C(2)
mcm 0:0180d9905fe5 179
mcm 0:0180d9905fe5 180 /* Info's */
mcm 0:0180d9905fe5 181 #define BME680_I_MIN_CORRECTION UINT8_C(1)
mcm 0:0180d9905fe5 182 #define BME680_I_MAX_CORRECTION UINT8_C(2)
mcm 0:0180d9905fe5 183
mcm 0:0180d9905fe5 184 /** Register map */
mcm 0:0180d9905fe5 185 /** Other coefficient's address */
mcm 0:0180d9905fe5 186 #define BME680_ADDR_RES_HEAT_VAL_ADDR UINT8_C(0x00)
mcm 0:0180d9905fe5 187 #define BME680_ADDR_RES_HEAT_RANGE_ADDR UINT8_C(0x02)
mcm 0:0180d9905fe5 188 #define BME680_ADDR_RANGE_SW_ERR_ADDR UINT8_C(0x04)
mcm 0:0180d9905fe5 189 #define BME680_ADDR_SENS_CONF_START UINT8_C(0x5A)
mcm 0:0180d9905fe5 190 #define BME680_ADDR_GAS_CONF_START UINT8_C(0x64)
mcm 0:0180d9905fe5 191
mcm 0:0180d9905fe5 192 /** Field settings */
mcm 0:0180d9905fe5 193 #define BME680_FIELD0_ADDR UINT8_C(0x1d)
mcm 0:0180d9905fe5 194
mcm 0:0180d9905fe5 195 /** Heater settings */
mcm 0:0180d9905fe5 196 #define BME680_RES_HEAT0_ADDR UINT8_C(0x5a)
mcm 0:0180d9905fe5 197 #define BME680_GAS_WAIT0_ADDR UINT8_C(0x64)
mcm 0:0180d9905fe5 198
mcm 0:0180d9905fe5 199 /** Sensor configuration registers */
mcm 0:0180d9905fe5 200 #define BME680_CONF_HEAT_CTRL_ADDR UINT8_C(0x70)
mcm 0:0180d9905fe5 201 #define BME680_CONF_ODR_RUN_GAS_NBC_ADDR UINT8_C(0x71)
mcm 0:0180d9905fe5 202 #define BME680_CONF_OS_H_ADDR UINT8_C(0x72)
mcm 0:0180d9905fe5 203 #define BME680_MEM_PAGE_ADDR UINT8_C(0xf3)
mcm 0:0180d9905fe5 204 #define BME680_CONF_T_P_MODE_ADDR UINT8_C(0x74)
mcm 0:0180d9905fe5 205 #define BME680_CONF_ODR_FILT_ADDR UINT8_C(0x75)
mcm 0:0180d9905fe5 206
mcm 0:0180d9905fe5 207 /** Coefficient's address */
mcm 0:0180d9905fe5 208 #define BME680_COEFF_ADDR1 UINT8_C(0x89)
mcm 0:0180d9905fe5 209 #define BME680_COEFF_ADDR2 UINT8_C(0xe1)
mcm 0:0180d9905fe5 210
mcm 0:0180d9905fe5 211 /** Chip identifier */
mcm 0:0180d9905fe5 212 #define BME680_CHIP_ID_ADDR UINT8_C(0xd0)
mcm 0:0180d9905fe5 213
mcm 0:0180d9905fe5 214 /** Soft reset register */
mcm 0:0180d9905fe5 215 #define BME680_SOFT_RESET_ADDR UINT8_C(0xe0)
mcm 0:0180d9905fe5 216
mcm 0:0180d9905fe5 217 /** Heater control settings */
mcm 0:0180d9905fe5 218 #define BME680_ENABLE_HEATER UINT8_C(0x00)
mcm 0:0180d9905fe5 219 #define BME680_DISABLE_HEATER UINT8_C(0x08)
mcm 0:0180d9905fe5 220
mcm 0:0180d9905fe5 221 /** Gas measurement settings */
mcm 0:0180d9905fe5 222 #define BME680_DISABLE_GAS_MEAS UINT8_C(0x00)
mcm 0:0180d9905fe5 223 #define BME680_ENABLE_GAS_MEAS UINT8_C(0x01)
mcm 0:0180d9905fe5 224
mcm 0:0180d9905fe5 225 /** Over-sampling settings */
mcm 0:0180d9905fe5 226 #define BME680_OS_NONE UINT8_C(0)
mcm 0:0180d9905fe5 227 #define BME680_OS_1X UINT8_C(1)
mcm 0:0180d9905fe5 228 #define BME680_OS_2X UINT8_C(2)
mcm 0:0180d9905fe5 229 #define BME680_OS_4X UINT8_C(3)
mcm 0:0180d9905fe5 230 #define BME680_OS_8X UINT8_C(4)
mcm 0:0180d9905fe5 231 #define BME680_OS_16X UINT8_C(5)
mcm 0:0180d9905fe5 232
mcm 0:0180d9905fe5 233 /** IIR filter settings */
mcm 0:0180d9905fe5 234 #define BME680_FILTER_SIZE_0 UINT8_C(0)
mcm 0:0180d9905fe5 235 #define BME680_FILTER_SIZE_1 UINT8_C(1)
mcm 0:0180d9905fe5 236 #define BME680_FILTER_SIZE_3 UINT8_C(2)
mcm 0:0180d9905fe5 237 #define BME680_FILTER_SIZE_7 UINT8_C(3)
mcm 0:0180d9905fe5 238 #define BME680_FILTER_SIZE_15 UINT8_C(4)
mcm 0:0180d9905fe5 239 #define BME680_FILTER_SIZE_31 UINT8_C(5)
mcm 0:0180d9905fe5 240 #define BME680_FILTER_SIZE_63 UINT8_C(6)
mcm 0:0180d9905fe5 241 #define BME680_FILTER_SIZE_127 UINT8_C(7)
mcm 0:0180d9905fe5 242
mcm 0:0180d9905fe5 243 /** Power mode settings */
mcm 0:0180d9905fe5 244 #define BME680_SLEEP_MODE UINT8_C(0)
mcm 0:0180d9905fe5 245 #define BME680_FORCED_MODE UINT8_C(1)
mcm 0:0180d9905fe5 246
mcm 0:0180d9905fe5 247 /** Delay related macro declaration */
mcm 0:0180d9905fe5 248 #define BME680_RESET_PERIOD UINT32_C(10)
mcm 0:0180d9905fe5 249
mcm 0:0180d9905fe5 250 /** SPI memory page settings */
mcm 0:0180d9905fe5 251 #define BME680_MEM_PAGE0 UINT8_C(0x10)
mcm 0:0180d9905fe5 252 #define BME680_MEM_PAGE1 UINT8_C(0x00)
mcm 0:0180d9905fe5 253
mcm 0:0180d9905fe5 254 /** Ambient humidity shift value for compensation */
mcm 0:0180d9905fe5 255 #define BME680_HUM_REG_SHIFT_VAL UINT8_C(4)
mcm 0:0180d9905fe5 256
mcm 0:0180d9905fe5 257 /** Run gas enable and disable settings */
mcm 0:0180d9905fe5 258 #define BME680_RUN_GAS_DISABLE UINT8_C(0)
mcm 0:0180d9905fe5 259 #define BME680_RUN_GAS_ENABLE UINT8_C(1)
mcm 0:0180d9905fe5 260
mcm 0:0180d9905fe5 261 /** Buffer length macro declaration */
mcm 0:0180d9905fe5 262 #define BME680_TMP_BUFFER_LENGTH UINT8_C(40)
mcm 0:0180d9905fe5 263 #define BME680_REG_BUFFER_LENGTH UINT8_C(6)
mcm 0:0180d9905fe5 264 #define BME680_FIELD_DATA_LENGTH UINT8_C(3)
mcm 0:0180d9905fe5 265 #define BME680_GAS_REG_BUF_LENGTH UINT8_C(20)
mcm 0:0180d9905fe5 266
mcm 0:0180d9905fe5 267 /** Settings selector */
mcm 0:0180d9905fe5 268 #define BME680_OST_SEL UINT16_C(1)
mcm 0:0180d9905fe5 269 #define BME680_OSP_SEL UINT16_C(2)
mcm 0:0180d9905fe5 270 #define BME680_OSH_SEL UINT16_C(4)
mcm 0:0180d9905fe5 271 #define BME680_GAS_MEAS_SEL UINT16_C(8)
mcm 0:0180d9905fe5 272 #define BME680_FILTER_SEL UINT16_C(16)
mcm 0:0180d9905fe5 273 #define BME680_HCNTRL_SEL UINT16_C(32)
mcm 0:0180d9905fe5 274 #define BME680_RUN_GAS_SEL UINT16_C(64)
mcm 0:0180d9905fe5 275 #define BME680_NBCONV_SEL UINT16_C(128)
mcm 0:0180d9905fe5 276 #define BME680_GAS_SENSOR_SEL (BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL)
mcm 0:0180d9905fe5 277
mcm 0:0180d9905fe5 278 /** Number of conversion settings*/
mcm 0:0180d9905fe5 279 #define BME680_NBCONV_MIN UINT8_C(0)
mcm 0:0180d9905fe5 280 #define BME680_NBCONV_MAX UINT8_C(10)
mcm 0:0180d9905fe5 281
mcm 0:0180d9905fe5 282 /** Mask definitions */
mcm 0:0180d9905fe5 283 #define BME680_GAS_MEAS_MSK UINT8_C(0x30)
mcm 0:0180d9905fe5 284 #define BME680_NBCONV_MSK UINT8_C(0X0F)
mcm 0:0180d9905fe5 285 #define BME680_FILTER_MSK UINT8_C(0X1C)
mcm 0:0180d9905fe5 286 #define BME680_OST_MSK UINT8_C(0XE0)
mcm 0:0180d9905fe5 287 #define BME680_OSP_MSK UINT8_C(0X1C)
mcm 0:0180d9905fe5 288 #define BME680_OSH_MSK UINT8_C(0X07)
mcm 0:0180d9905fe5 289 #define BME680_HCTRL_MSK UINT8_C(0x08)
mcm 0:0180d9905fe5 290 #define BME680_RUN_GAS_MSK UINT8_C(0x10)
mcm 0:0180d9905fe5 291 #define BME680_MODE_MSK UINT8_C(0x03)
mcm 0:0180d9905fe5 292 #define BME680_RHRANGE_MSK UINT8_C(0x30)
mcm 0:0180d9905fe5 293 #define BME680_RSERROR_MSK UINT8_C(0xf0)
mcm 0:0180d9905fe5 294 #define BME680_NEW_DATA_MSK UINT8_C(0x80)
mcm 0:0180d9905fe5 295 #define BME680_GAS_INDEX_MSK UINT8_C(0x0f)
mcm 0:0180d9905fe5 296 #define BME680_GAS_RANGE_MSK UINT8_C(0x0f)
mcm 0:0180d9905fe5 297 #define BME680_GASM_VALID_MSK UINT8_C(0x20)
mcm 0:0180d9905fe5 298 #define BME680_HEAT_STAB_MSK UINT8_C(0x10)
mcm 0:0180d9905fe5 299 #define BME680_MEM_PAGE_MSK UINT8_C(0x10)
mcm 0:0180d9905fe5 300 #define BME680_SPI_RD_MSK UINT8_C(0x80)
mcm 0:0180d9905fe5 301 #define BME680_SPI_WR_MSK UINT8_C(0x7f)
mcm 0:0180d9905fe5 302 #define BME680_BIT_H1_DATA_MSK UINT8_C(0x0F)
mcm 0:0180d9905fe5 303
mcm 0:0180d9905fe5 304 /** Bit position definitions for sensor settings */
mcm 0:0180d9905fe5 305 #define BME680_GAS_MEAS_POS UINT8_C(4)
mcm 0:0180d9905fe5 306 #define BME680_FILTER_POS UINT8_C(2)
mcm 0:0180d9905fe5 307 #define BME680_OST_POS UINT8_C(5)
mcm 0:0180d9905fe5 308 #define BME680_OSP_POS UINT8_C(2)
mcm 0:0180d9905fe5 309 #define BME680_RUN_GAS_POS UINT8_C(4)
mcm 0:0180d9905fe5 310
mcm 0:0180d9905fe5 311 /** Array Index to Field data mapping for Calibration Data*/
mcm 0:0180d9905fe5 312 #define BME680_T2_LSB_REG (1)
mcm 0:0180d9905fe5 313 #define BME680_T2_MSB_REG (2)
mcm 0:0180d9905fe5 314 #define BME680_T3_REG (3)
mcm 0:0180d9905fe5 315 #define BME680_P1_LSB_REG (5)
mcm 0:0180d9905fe5 316 #define BME680_P1_MSB_REG (6)
mcm 0:0180d9905fe5 317 #define BME680_P2_LSB_REG (7)
mcm 0:0180d9905fe5 318 #define BME680_P2_MSB_REG (8)
mcm 0:0180d9905fe5 319 #define BME680_P3_REG (9)
mcm 0:0180d9905fe5 320 #define BME680_P4_LSB_REG (11)
mcm 0:0180d9905fe5 321 #define BME680_P4_MSB_REG (12)
mcm 0:0180d9905fe5 322 #define BME680_P5_LSB_REG (13)
mcm 0:0180d9905fe5 323 #define BME680_P5_MSB_REG (14)
mcm 0:0180d9905fe5 324 #define BME680_P7_REG (15)
mcm 0:0180d9905fe5 325 #define BME680_P6_REG (16)
mcm 0:0180d9905fe5 326 #define BME680_P8_LSB_REG (19)
mcm 0:0180d9905fe5 327 #define BME680_P8_MSB_REG (20)
mcm 0:0180d9905fe5 328 #define BME680_P9_LSB_REG (21)
mcm 0:0180d9905fe5 329 #define BME680_P9_MSB_REG (22)
mcm 0:0180d9905fe5 330 #define BME680_P10_REG (23)
mcm 0:0180d9905fe5 331 #define BME680_H2_MSB_REG (25)
mcm 0:0180d9905fe5 332 #define BME680_H2_LSB_REG (26)
mcm 0:0180d9905fe5 333 #define BME680_H1_LSB_REG (26)
mcm 0:0180d9905fe5 334 #define BME680_H1_MSB_REG (27)
mcm 0:0180d9905fe5 335 #define BME680_H3_REG (28)
mcm 0:0180d9905fe5 336 #define BME680_H4_REG (29)
mcm 0:0180d9905fe5 337 #define BME680_H5_REG (30)
mcm 0:0180d9905fe5 338 #define BME680_H6_REG (31)
mcm 0:0180d9905fe5 339 #define BME680_H7_REG (32)
mcm 0:0180d9905fe5 340 #define BME680_T1_LSB_REG (33)
mcm 0:0180d9905fe5 341 #define BME680_T1_MSB_REG (34)
mcm 0:0180d9905fe5 342 #define BME680_GH2_LSB_REG (35)
mcm 0:0180d9905fe5 343 #define BME680_GH2_MSB_REG (36)
mcm 0:0180d9905fe5 344 #define BME680_GH1_REG (37)
mcm 0:0180d9905fe5 345 #define BME680_GH3_REG (38)
mcm 0:0180d9905fe5 346
mcm 0:0180d9905fe5 347 /** BME680 register buffer index settings*/
mcm 0:0180d9905fe5 348 #define BME680_REG_FILTER_INDEX UINT8_C(5)
mcm 0:0180d9905fe5 349 #define BME680_REG_TEMP_INDEX UINT8_C(4)
mcm 0:0180d9905fe5 350 #define BME680_REG_PRES_INDEX UINT8_C(4)
mcm 0:0180d9905fe5 351 #define BME680_REG_HUM_INDEX UINT8_C(2)
mcm 0:0180d9905fe5 352 #define BME680_REG_NBCONV_INDEX UINT8_C(1)
mcm 0:0180d9905fe5 353 #define BME680_REG_RUN_GAS_INDEX UINT8_C(1)
mcm 0:0180d9905fe5 354 #define BME680_REG_HCTRL_INDEX UINT8_C(0)
mcm 0:0180d9905fe5 355
mcm 0:0180d9905fe5 356 /** BME680 pressure calculation macros */
mcm 0:0180d9905fe5 357 /*! This max value is used to provide precedence to multiplication or division
mcm 0:0180d9905fe5 358 * in pressure compensation equation to achieve least loss of precision and
mcm 0:0180d9905fe5 359 * avoiding overflows.
mcm 0:0180d9905fe5 360 * i.e Comparing value, BME680_MAX_OVERFLOW_VAL = INT32_C(1 << 30)
mcm 0:0180d9905fe5 361 */
mcm 0:0180d9905fe5 362 #define BME680_MAX_OVERFLOW_VAL INT32_C(0x40000000)
mcm 0:0180d9905fe5 363
mcm 0:0180d9905fe5 364 /** Macro to combine two 8 bit data's to form a 16 bit data */
mcm 0:0180d9905fe5 365 #define BME680_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb)
mcm 0:0180d9905fe5 366
mcm 0:0180d9905fe5 367 /** Macro to SET and GET BITS of a register */
mcm 0:0180d9905fe5 368 #define BME680_SET_BITS(reg_data, bitname, data) \
mcm 0:0180d9905fe5 369 ((reg_data & ~(bitname##_MSK)) | \
mcm 0:0180d9905fe5 370 ((data << bitname##_POS) & bitname##_MSK))
mcm 0:0180d9905fe5 371 #define BME680_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \
mcm 0:0180d9905fe5 372 (bitname##_POS))
mcm 0:0180d9905fe5 373
mcm 0:0180d9905fe5 374 /** Macro variant to handle the bitname position if it is zero */
mcm 0:0180d9905fe5 375 #define BME680_SET_BITS_POS_0(reg_data, bitname, data) \
mcm 0:0180d9905fe5 376 ((reg_data & ~(bitname##_MSK)) | \
mcm 0:0180d9905fe5 377 (data & bitname##_MSK))
mcm 0:0180d9905fe5 378 #define BME680_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))
mcm 0:0180d9905fe5 379
mcm 0:0180d9905fe5 380 /** Type definitions */
mcm 0:0180d9905fe5 381 /*!
mcm 0:0180d9905fe5 382 * Generic communication function pointer
mcm 0:0180d9905fe5 383 * @param[in] dev_id: Place holder to store the id of the device structure
mcm 0:0180d9905fe5 384 * Can be used to store the index of the Chip select or
mcm 0:0180d9905fe5 385 * I2C address of the device.
mcm 0:0180d9905fe5 386 * @param[in] reg_addr: Used to select the register the where data needs to
mcm 0:0180d9905fe5 387 * be read from or written to.
mcm 0:0180d9905fe5 388 * @param[in/out] reg_data: Data array to read/write
mcm 0:0180d9905fe5 389 * @param[in] len: Length of the data array
mcm 0:0180d9905fe5 390 */
mcm 0:0180d9905fe5 391 typedef int8_t (*bme680_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len);
mcm 0:0180d9905fe5 392
mcm 0:0180d9905fe5 393 /*!
mcm 0:0180d9905fe5 394 * Delay function pointer
mcm 0:0180d9905fe5 395 * @param[in] period: Time period in milliseconds
mcm 0:0180d9905fe5 396 */
mcm 0:0180d9905fe5 397 typedef void (*bme680_delay_fptr_t)(uint32_t period);
mcm 0:0180d9905fe5 398
mcm 0:0180d9905fe5 399 /*!
mcm 0:0180d9905fe5 400 * @brief Interface selection Enumerations
mcm 0:0180d9905fe5 401 */
mcm 0:0180d9905fe5 402 enum bme680_intf {
mcm 0:0180d9905fe5 403 /*! SPI interface */
mcm 0:0180d9905fe5 404 BME680_SPI_INTF,
mcm 0:0180d9905fe5 405 /*! I2C interface */
mcm 0:0180d9905fe5 406 BME680_I2C_INTF
mcm 0:0180d9905fe5 407 };
mcm 0:0180d9905fe5 408
mcm 0:0180d9905fe5 409 /* structure definitions */
mcm 0:0180d9905fe5 410 /*!
mcm 0:0180d9905fe5 411 * @brief Sensor field data structure
mcm 0:0180d9905fe5 412 */
mcm 0:0180d9905fe5 413 struct bme680_field_data {
mcm 0:0180d9905fe5 414 /*! Contains new_data, gasm_valid & heat_stab */
mcm 0:0180d9905fe5 415 uint8_t status;
mcm 0:0180d9905fe5 416 /*! The index of the heater profile used */
mcm 0:0180d9905fe5 417 uint8_t gas_index;
mcm 0:0180d9905fe5 418 /*! Measurement index to track order */
mcm 0:0180d9905fe5 419 uint8_t meas_index;
mcm 0:0180d9905fe5 420
mcm 0:0180d9905fe5 421 #ifndef BME680_FLOAT_POINT_COMPENSATION
mcm 0:0180d9905fe5 422 /*! Temperature in degree celsius x100 */
mcm 0:0180d9905fe5 423 int16_t temperature;
mcm 0:0180d9905fe5 424 /*! Pressure in Pascal */
mcm 0:0180d9905fe5 425 uint32_t pressure;
mcm 0:0180d9905fe5 426 /*! Humidity in % relative humidity x1000 */
mcm 0:0180d9905fe5 427 uint32_t humidity;
mcm 0:0180d9905fe5 428 /*! Gas resistance in Ohms */
mcm 0:0180d9905fe5 429 uint32_t gas_resistance;
mcm 0:0180d9905fe5 430 #else
mcm 0:0180d9905fe5 431 /*! Temperature in degree celsius */
mcm 0:0180d9905fe5 432 float temperature;
mcm 0:0180d9905fe5 433 /*! Pressure in Pascal */
mcm 0:0180d9905fe5 434 float pressure;
mcm 0:0180d9905fe5 435 /*! Humidity in % relative humidity x1000 */
mcm 0:0180d9905fe5 436 float humidity;
mcm 0:0180d9905fe5 437 /*! Gas resistance in Ohms */
mcm 0:0180d9905fe5 438 float gas_resistance;
mcm 0:0180d9905fe5 439
mcm 0:0180d9905fe5 440 #endif
mcm 0:0180d9905fe5 441
mcm 0:0180d9905fe5 442 };
mcm 0:0180d9905fe5 443
mcm 0:0180d9905fe5 444 /*!
mcm 0:0180d9905fe5 445 * @brief Structure to hold the Calibration data
mcm 0:0180d9905fe5 446 */
mcm 0:0180d9905fe5 447 struct bme680_calib_data {
mcm 0:0180d9905fe5 448 /*! Variable to store calibrated humidity data */
mcm 0:0180d9905fe5 449 uint16_t par_h1;
mcm 0:0180d9905fe5 450 /*! Variable to store calibrated humidity data */
mcm 0:0180d9905fe5 451 uint16_t par_h2;
mcm 0:0180d9905fe5 452 /*! Variable to store calibrated humidity data */
mcm 0:0180d9905fe5 453 int8_t par_h3;
mcm 0:0180d9905fe5 454 /*! Variable to store calibrated humidity data */
mcm 0:0180d9905fe5 455 int8_t par_h4;
mcm 0:0180d9905fe5 456 /*! Variable to store calibrated humidity data */
mcm 0:0180d9905fe5 457 int8_t par_h5;
mcm 0:0180d9905fe5 458 /*! Variable to store calibrated humidity data */
mcm 0:0180d9905fe5 459 uint8_t par_h6;
mcm 0:0180d9905fe5 460 /*! Variable to store calibrated humidity data */
mcm 0:0180d9905fe5 461 int8_t par_h7;
mcm 0:0180d9905fe5 462 /*! Variable to store calibrated gas data */
mcm 0:0180d9905fe5 463 int8_t par_gh1;
mcm 0:0180d9905fe5 464 /*! Variable to store calibrated gas data */
mcm 0:0180d9905fe5 465 int16_t par_gh2;
mcm 0:0180d9905fe5 466 /*! Variable to store calibrated gas data */
mcm 0:0180d9905fe5 467 int8_t par_gh3;
mcm 0:0180d9905fe5 468 /*! Variable to store calibrated temperature data */
mcm 0:0180d9905fe5 469 uint16_t par_t1;
mcm 0:0180d9905fe5 470 /*! Variable to store calibrated temperature data */
mcm 0:0180d9905fe5 471 int16_t par_t2;
mcm 0:0180d9905fe5 472 /*! Variable to store calibrated temperature data */
mcm 0:0180d9905fe5 473 int8_t par_t3;
mcm 0:0180d9905fe5 474 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 475 uint16_t par_p1;
mcm 0:0180d9905fe5 476 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 477 int16_t par_p2;
mcm 0:0180d9905fe5 478 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 479 int8_t par_p3;
mcm 0:0180d9905fe5 480 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 481 int16_t par_p4;
mcm 0:0180d9905fe5 482 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 483 int16_t par_p5;
mcm 0:0180d9905fe5 484 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 485 int8_t par_p6;
mcm 0:0180d9905fe5 486 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 487 int8_t par_p7;
mcm 0:0180d9905fe5 488 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 489 int16_t par_p8;
mcm 0:0180d9905fe5 490 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 491 int16_t par_p9;
mcm 0:0180d9905fe5 492 /*! Variable to store calibrated pressure data */
mcm 0:0180d9905fe5 493 uint8_t par_p10;
mcm 0:0180d9905fe5 494
mcm 0:0180d9905fe5 495 #ifndef BME680_FLOAT_POINT_COMPENSATION
mcm 0:0180d9905fe5 496 /*! Variable to store t_fine size */
mcm 0:0180d9905fe5 497 int32_t t_fine;
mcm 0:0180d9905fe5 498 #else
mcm 0:0180d9905fe5 499 /*! Variable to store t_fine size */
mcm 0:0180d9905fe5 500 float t_fine;
mcm 0:0180d9905fe5 501 #endif
mcm 0:0180d9905fe5 502 /*! Variable to store heater resistance range */
mcm 0:0180d9905fe5 503 uint8_t res_heat_range;
mcm 0:0180d9905fe5 504 /*! Variable to store heater resistance value */
mcm 0:0180d9905fe5 505 int8_t res_heat_val;
mcm 0:0180d9905fe5 506 /*! Variable to store error range */
mcm 0:0180d9905fe5 507 int8_t range_sw_err;
mcm 0:0180d9905fe5 508 };
mcm 0:0180d9905fe5 509
mcm 0:0180d9905fe5 510 /*!
mcm 0:0180d9905fe5 511 * @brief BME680 sensor settings structure which comprises of ODR,
mcm 0:0180d9905fe5 512 * over-sampling and filter settings.
mcm 0:0180d9905fe5 513 */
mcm 0:0180d9905fe5 514 struct bme680_tph_sett {
mcm 0:0180d9905fe5 515 /*! Humidity oversampling */
mcm 0:0180d9905fe5 516 uint8_t os_hum;
mcm 0:0180d9905fe5 517 /*! Temperature oversampling */
mcm 0:0180d9905fe5 518 uint8_t os_temp;
mcm 0:0180d9905fe5 519 /*! Pressure oversampling */
mcm 0:0180d9905fe5 520 uint8_t os_pres;
mcm 0:0180d9905fe5 521 /*! Filter coefficient */
mcm 0:0180d9905fe5 522 uint8_t filter;
mcm 0:0180d9905fe5 523 };
mcm 0:0180d9905fe5 524
mcm 0:0180d9905fe5 525 /*!
mcm 0:0180d9905fe5 526 * @brief BME680 gas sensor which comprises of gas settings
mcm 0:0180d9905fe5 527 * and status parameters
mcm 0:0180d9905fe5 528 */
mcm 0:0180d9905fe5 529 struct bme680_gas_sett {
mcm 0:0180d9905fe5 530 /*! Variable to store nb conversion */
mcm 0:0180d9905fe5 531 uint8_t nb_conv;
mcm 0:0180d9905fe5 532 /*! Variable to store heater control */
mcm 0:0180d9905fe5 533 uint8_t heatr_ctrl;
mcm 0:0180d9905fe5 534 /*! Run gas enable value */
mcm 0:0180d9905fe5 535 uint8_t run_gas;
mcm 0:0180d9905fe5 536 /*! Heater temperature value */
mcm 0:0180d9905fe5 537 uint16_t heatr_temp;
mcm 0:0180d9905fe5 538 /*! Duration profile value */
mcm 0:0180d9905fe5 539 uint16_t heatr_dur;
mcm 0:0180d9905fe5 540 };
mcm 0:0180d9905fe5 541
mcm 0:0180d9905fe5 542 /*!
mcm 0:0180d9905fe5 543 * @brief BME680 device structure
mcm 0:0180d9905fe5 544 */
mcm 0:0180d9905fe5 545 struct bme680_dev {
mcm 0:0180d9905fe5 546 /*! Chip Id */
mcm 0:0180d9905fe5 547 uint8_t chip_id;
mcm 0:0180d9905fe5 548 /*! Device Id */
mcm 0:0180d9905fe5 549 uint8_t dev_id;
mcm 0:0180d9905fe5 550 /*! SPI/I2C interface */
mcm 0:0180d9905fe5 551 enum bme680_intf intf;
mcm 0:0180d9905fe5 552 /*! Memory page used */
mcm 0:0180d9905fe5 553 uint8_t mem_page;
mcm 0:0180d9905fe5 554 /*! Ambient temperature in Degree C */
mcm 0:0180d9905fe5 555 int8_t amb_temp;
mcm 0:0180d9905fe5 556 /*! Sensor calibration data */
mcm 0:0180d9905fe5 557 struct bme680_calib_data calib;
mcm 0:0180d9905fe5 558 /*! Sensor settings */
mcm 0:0180d9905fe5 559 struct bme680_tph_sett tph_sett;
mcm 0:0180d9905fe5 560 /*! Gas Sensor settings */
mcm 0:0180d9905fe5 561 struct bme680_gas_sett gas_sett;
mcm 0:0180d9905fe5 562 /*! Sensor power modes */
mcm 0:0180d9905fe5 563 uint8_t power_mode;
mcm 0:0180d9905fe5 564 /*! New sensor fields */
mcm 0:0180d9905fe5 565 uint8_t new_fields;
mcm 0:0180d9905fe5 566 /*! Store the info messages */
mcm 0:0180d9905fe5 567 uint8_t info_msg;
mcm 0:0180d9905fe5 568 /*! Bus read function pointer */
mcm 0:0180d9905fe5 569 bme680_com_fptr_t read;
mcm 0:0180d9905fe5 570 /*! Bus write function pointer */
mcm 0:0180d9905fe5 571 bme680_com_fptr_t write;
mcm 0:0180d9905fe5 572 /*! delay function pointer */
mcm 0:0180d9905fe5 573 bme680_delay_fptr_t delay_ms;
mcm 0:0180d9905fe5 574 /*! Communication function result */
mcm 0:0180d9905fe5 575 int8_t com_rslt;
mcm 0:0180d9905fe5 576 };
mcm 0:0180d9905fe5 577
mcm 0:0180d9905fe5 578
mcm 0:0180d9905fe5 579
mcm 0:0180d9905fe5 580 #endif /* BME680_DEFS_H_ */
mcm 0:0180d9905fe5 581 /** @}*/
mcm 0:0180d9905fe5 582 /** @}*/