mirror of https://github.com/arendst/Tasmota.git
973 lines
28 KiB
C
973 lines
28 KiB
C
|
/**
|
||
|
* Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved.
|
||
|
*
|
||
|
* BSD-3-Clause
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions are met:
|
||
|
*
|
||
|
* 1. Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
*
|
||
|
* 2. 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.
|
||
|
*
|
||
|
* 3. Neither the name of the copyright holder nor the names of its
|
||
|
* 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 THE
|
||
|
* 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.
|
||
|
*
|
||
|
* @file bme68x_defs.h
|
||
|
* @date 2021-11-09
|
||
|
* @version v4.4.7
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*! @cond DOXYGEN_SUPRESS */
|
||
|
|
||
|
#ifndef BME68X_DEFS_H_
|
||
|
#define BME68X_DEFS_H_
|
||
|
|
||
|
/********************************************************* */
|
||
|
/*! Header includes */
|
||
|
/********************************************************* */
|
||
|
#ifdef __KERNEL__
|
||
|
#include <linux/types.h>
|
||
|
#include <linux/kernel.h>
|
||
|
#else
|
||
|
#include <stdint.h>
|
||
|
#include <stddef.h>
|
||
|
#endif
|
||
|
|
||
|
/********************************************************* */
|
||
|
/*! Common Macros */
|
||
|
/********************************************************* */
|
||
|
#ifdef __KERNEL__
|
||
|
#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
|
||
|
#endif
|
||
|
|
||
|
/*! C standard macros */
|
||
|
#ifndef NULL
|
||
|
#ifdef __cplusplus
|
||
|
#define NULL 0
|
||
|
#else
|
||
|
#define NULL ((void *) 0)
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifndef BME68X_DO_NOT_USE_FPU
|
||
|
|
||
|
/* Comment or un-comment the macro to provide floating point data output */
|
||
|
#define BME68X_USE_FPU
|
||
|
#endif
|
||
|
|
||
|
/* Period between two polls (value can be given by user) */
|
||
|
#ifndef BME68X_PERIOD_POLL
|
||
|
#define BME68X_PERIOD_POLL UINT32_C(10000)
|
||
|
#endif
|
||
|
|
||
|
/* BME68X unique chip identifier */
|
||
|
#define BME68X_CHIP_ID UINT8_C(0x61)
|
||
|
|
||
|
/* Period for a soft reset */
|
||
|
#define BME68X_PERIOD_RESET UINT32_C(10000)
|
||
|
|
||
|
/* BME68X lower I2C address */
|
||
|
#define BME68X_I2C_ADDR_LOW UINT8_C(0x76)
|
||
|
|
||
|
/* BME68X higher I2C address */
|
||
|
#define BME68X_I2C_ADDR_HIGH UINT8_C(0x77)
|
||
|
|
||
|
/* Soft reset command */
|
||
|
#define BME68X_SOFT_RESET_CMD UINT8_C(0xb6)
|
||
|
|
||
|
/* Return code definitions */
|
||
|
/* Success */
|
||
|
#define BME68X_OK INT8_C(0)
|
||
|
|
||
|
/* Errors */
|
||
|
/* Null pointer passed */
|
||
|
#define BME68X_E_NULL_PTR INT8_C(-1)
|
||
|
|
||
|
/* Communication failure */
|
||
|
#define BME68X_E_COM_FAIL INT8_C(-2)
|
||
|
|
||
|
/* Sensor not found */
|
||
|
#define BME68X_E_DEV_NOT_FOUND INT8_C(-3)
|
||
|
|
||
|
/* Incorrect length parameter */
|
||
|
#define BME68X_E_INVALID_LENGTH INT8_C(-4)
|
||
|
|
||
|
/* Self test fail error */
|
||
|
#define BME68X_E_SELF_TEST INT8_C(-5)
|
||
|
|
||
|
/* Warnings */
|
||
|
/* Define a valid operation mode */
|
||
|
#define BME68X_W_DEFINE_OP_MODE INT8_C(1)
|
||
|
|
||
|
/* No new data was found */
|
||
|
#define BME68X_W_NO_NEW_DATA INT8_C(2)
|
||
|
|
||
|
/* Define the shared heating duration */
|
||
|
#define BME68X_W_DEFINE_SHD_HEATR_DUR INT8_C(3)
|
||
|
|
||
|
/* Information - only available via bme68x_dev.info_msg */
|
||
|
#define BME68X_I_PARAM_CORR UINT8_C(1)
|
||
|
|
||
|
/* Register map addresses in I2C */
|
||
|
/* Register for 3rd group of coefficients */
|
||
|
#define BME68X_REG_COEFF3 UINT8_C(0x00)
|
||
|
|
||
|
/* 0th Field address*/
|
||
|
#define BME68X_REG_FIELD0 UINT8_C(0x1d)
|
||
|
|
||
|
/* 0th Current DAC address*/
|
||
|
#define BME68X_REG_IDAC_HEAT0 UINT8_C(0x50)
|
||
|
|
||
|
/* 0th Res heat address */
|
||
|
#define BME68X_REG_RES_HEAT0 UINT8_C(0x5a)
|
||
|
|
||
|
/* 0th Gas wait address */
|
||
|
#define BME68X_REG_GAS_WAIT0 UINT8_C(0x64)
|
||
|
|
||
|
/* Shared heating duration address */
|
||
|
#define BME68X_REG_SHD_HEATR_DUR UINT8_C(0x6E)
|
||
|
|
||
|
/* CTRL_GAS_0 address */
|
||
|
#define BME68X_REG_CTRL_GAS_0 UINT8_C(0x70)
|
||
|
|
||
|
/* CTRL_GAS_1 address */
|
||
|
#define BME68X_REG_CTRL_GAS_1 UINT8_C(0x71)
|
||
|
|
||
|
/* CTRL_HUM address */
|
||
|
#define BME68X_REG_CTRL_HUM UINT8_C(0x72)
|
||
|
|
||
|
/* CTRL_MEAS address */
|
||
|
#define BME68X_REG_CTRL_MEAS UINT8_C(0x74)
|
||
|
|
||
|
/* CONFIG address */
|
||
|
#define BME68X_REG_CONFIG UINT8_C(0x75)
|
||
|
|
||
|
/* MEM_PAGE address */
|
||
|
#define BME68X_REG_MEM_PAGE UINT8_C(0xf3)
|
||
|
|
||
|
/* Unique ID address */
|
||
|
#define BME68X_REG_UNIQUE_ID UINT8_C(0x83)
|
||
|
|
||
|
/* Register for 1st group of coefficients */
|
||
|
#define BME68X_REG_COEFF1 UINT8_C(0x8a)
|
||
|
|
||
|
/* Chip ID address */
|
||
|
#define BME68X_REG_CHIP_ID UINT8_C(0xd0)
|
||
|
|
||
|
/* Soft reset address */
|
||
|
#define BME68X_REG_SOFT_RESET UINT8_C(0xe0)
|
||
|
|
||
|
/* Register for 2nd group of coefficients */
|
||
|
#define BME68X_REG_COEFF2 UINT8_C(0xe1)
|
||
|
|
||
|
/* Variant ID Register */
|
||
|
#define BME68X_REG_VARIANT_ID UINT8_C(0xF0)
|
||
|
|
||
|
/* Enable/Disable macros */
|
||
|
|
||
|
/* Enable */
|
||
|
#define BME68X_ENABLE UINT8_C(0x01)
|
||
|
|
||
|
/* Disable */
|
||
|
#define BME68X_DISABLE UINT8_C(0x00)
|
||
|
|
||
|
/* Variant ID macros */
|
||
|
|
||
|
/* Low Gas variant */
|
||
|
#define BME68X_VARIANT_GAS_LOW UINT8_C(0x00)
|
||
|
|
||
|
/* High Gas variant */
|
||
|
#define BME68X_VARIANT_GAS_HIGH UINT8_C(0x01)
|
||
|
|
||
|
/* Oversampling setting macros */
|
||
|
|
||
|
/* Switch off measurement */
|
||
|
#define BME68X_OS_NONE UINT8_C(0)
|
||
|
|
||
|
/* Perform 1 measurement */
|
||
|
#define BME68X_OS_1X UINT8_C(1)
|
||
|
|
||
|
/* Perform 2 measurements */
|
||
|
#define BME68X_OS_2X UINT8_C(2)
|
||
|
|
||
|
/* Perform 4 measurements */
|
||
|
#define BME68X_OS_4X UINT8_C(3)
|
||
|
|
||
|
/* Perform 8 measurements */
|
||
|
#define BME68X_OS_8X UINT8_C(4)
|
||
|
|
||
|
/* Perform 16 measurements */
|
||
|
#define BME68X_OS_16X UINT8_C(5)
|
||
|
|
||
|
/* IIR Filter settings */
|
||
|
|
||
|
/* Switch off the filter */
|
||
|
#define BME68X_FILTER_OFF UINT8_C(0)
|
||
|
|
||
|
/* Filter coefficient of 2 */
|
||
|
#define BME68X_FILTER_SIZE_1 UINT8_C(1)
|
||
|
|
||
|
/* Filter coefficient of 4 */
|
||
|
#define BME68X_FILTER_SIZE_3 UINT8_C(2)
|
||
|
|
||
|
/* Filter coefficient of 8 */
|
||
|
#define BME68X_FILTER_SIZE_7 UINT8_C(3)
|
||
|
|
||
|
/* Filter coefficient of 16 */
|
||
|
#define BME68X_FILTER_SIZE_15 UINT8_C(4)
|
||
|
|
||
|
/* Filter coefficient of 32 */
|
||
|
#define BME68X_FILTER_SIZE_31 UINT8_C(5)
|
||
|
|
||
|
/* Filter coefficient of 64 */
|
||
|
#define BME68X_FILTER_SIZE_63 UINT8_C(6)
|
||
|
|
||
|
/* Filter coefficient of 128 */
|
||
|
#define BME68X_FILTER_SIZE_127 UINT8_C(7)
|
||
|
|
||
|
/* ODR/Standby time macros */
|
||
|
|
||
|
/* Standby time of 0.59ms */
|
||
|
#define BME68X_ODR_0_59_MS UINT8_C(0)
|
||
|
|
||
|
/* Standby time of 62.5ms */
|
||
|
#define BME68X_ODR_62_5_MS UINT8_C(1)
|
||
|
|
||
|
/* Standby time of 125ms */
|
||
|
#define BME68X_ODR_125_MS UINT8_C(2)
|
||
|
|
||
|
/* Standby time of 250ms */
|
||
|
#define BME68X_ODR_250_MS UINT8_C(3)
|
||
|
|
||
|
/* Standby time of 500ms */
|
||
|
#define BME68X_ODR_500_MS UINT8_C(4)
|
||
|
|
||
|
/* Standby time of 1s */
|
||
|
#define BME68X_ODR_1000_MS UINT8_C(5)
|
||
|
|
||
|
/* Standby time of 10ms */
|
||
|
#define BME68X_ODR_10_MS UINT8_C(6)
|
||
|
|
||
|
/* Standby time of 20ms */
|
||
|
#define BME68X_ODR_20_MS UINT8_C(7)
|
||
|
|
||
|
/* No standby time */
|
||
|
#define BME68X_ODR_NONE UINT8_C(8)
|
||
|
|
||
|
/* Operating mode macros */
|
||
|
|
||
|
/* Sleep operation mode */
|
||
|
#define BME68X_SLEEP_MODE UINT8_C(0)
|
||
|
|
||
|
/* Forced operation mode */
|
||
|
#define BME68X_FORCED_MODE UINT8_C(1)
|
||
|
|
||
|
/* Parallel operation mode */
|
||
|
#define BME68X_PARALLEL_MODE UINT8_C(2)
|
||
|
|
||
|
/* Sequential operation mode */
|
||
|
#define BME68X_SEQUENTIAL_MODE UINT8_C(3)
|
||
|
|
||
|
/* SPI page macros */
|
||
|
|
||
|
/* SPI memory page 0 */
|
||
|
#define BME68X_MEM_PAGE0 UINT8_C(0x10)
|
||
|
|
||
|
/* SPI memory page 1 */
|
||
|
#define BME68X_MEM_PAGE1 UINT8_C(0x00)
|
||
|
|
||
|
/* Coefficient index macros */
|
||
|
|
||
|
/* Length for all coefficients */
|
||
|
#define BME68X_LEN_COEFF_ALL UINT8_C(42)
|
||
|
|
||
|
/* Length for 1st group of coefficients */
|
||
|
#define BME68X_LEN_COEFF1 UINT8_C(23)
|
||
|
|
||
|
/* Length for 2nd group of coefficients */
|
||
|
#define BME68X_LEN_COEFF2 UINT8_C(14)
|
||
|
|
||
|
/* Length for 3rd group of coefficients */
|
||
|
#define BME68X_LEN_COEFF3 UINT8_C(5)
|
||
|
|
||
|
/* Length of the field */
|
||
|
#define BME68X_LEN_FIELD UINT8_C(17)
|
||
|
|
||
|
/* Length between two fields */
|
||
|
#define BME68X_LEN_FIELD_OFFSET UINT8_C(17)
|
||
|
|
||
|
/* Length of the configuration register */
|
||
|
#define BME68X_LEN_CONFIG UINT8_C(5)
|
||
|
|
||
|
/* Length of the interleaved buffer */
|
||
|
#define BME68X_LEN_INTERLEAVE_BUFF UINT8_C(20)
|
||
|
|
||
|
/* Coefficient index macros */
|
||
|
|
||
|
/* Coefficient T2 LSB position */
|
||
|
#define BME68X_IDX_T2_LSB (0)
|
||
|
|
||
|
/* Coefficient T2 MSB position */
|
||
|
#define BME68X_IDX_T2_MSB (1)
|
||
|
|
||
|
/* Coefficient T3 position */
|
||
|
#define BME68X_IDX_T3 (2)
|
||
|
|
||
|
/* Coefficient P1 LSB position */
|
||
|
#define BME68X_IDX_P1_LSB (4)
|
||
|
|
||
|
/* Coefficient P1 MSB position */
|
||
|
#define BME68X_IDX_P1_MSB (5)
|
||
|
|
||
|
/* Coefficient P2 LSB position */
|
||
|
#define BME68X_IDX_P2_LSB (6)
|
||
|
|
||
|
/* Coefficient P2 MSB position */
|
||
|
#define BME68X_IDX_P2_MSB (7)
|
||
|
|
||
|
/* Coefficient P3 position */
|
||
|
#define BME68X_IDX_P3 (8)
|
||
|
|
||
|
/* Coefficient P4 LSB position */
|
||
|
#define BME68X_IDX_P4_LSB (10)
|
||
|
|
||
|
/* Coefficient P4 MSB position */
|
||
|
#define BME68X_IDX_P4_MSB (11)
|
||
|
|
||
|
/* Coefficient P5 LSB position */
|
||
|
#define BME68X_IDX_P5_LSB (12)
|
||
|
|
||
|
/* Coefficient P5 MSB position */
|
||
|
#define BME68X_IDX_P5_MSB (13)
|
||
|
|
||
|
/* Coefficient P7 position */
|
||
|
#define BME68X_IDX_P7 (14)
|
||
|
|
||
|
/* Coefficient P6 position */
|
||
|
#define BME68X_IDX_P6 (15)
|
||
|
|
||
|
/* Coefficient P8 LSB position */
|
||
|
#define BME68X_IDX_P8_LSB (18)
|
||
|
|
||
|
/* Coefficient P8 MSB position */
|
||
|
#define BME68X_IDX_P8_MSB (19)
|
||
|
|
||
|
/* Coefficient P9 LSB position */
|
||
|
#define BME68X_IDX_P9_LSB (20)
|
||
|
|
||
|
/* Coefficient P9 MSB position */
|
||
|
#define BME68X_IDX_P9_MSB (21)
|
||
|
|
||
|
/* Coefficient P10 position */
|
||
|
#define BME68X_IDX_P10 (22)
|
||
|
|
||
|
/* Coefficient H2 MSB position */
|
||
|
#define BME68X_IDX_H2_MSB (23)
|
||
|
|
||
|
/* Coefficient H2 LSB position */
|
||
|
#define BME68X_IDX_H2_LSB (24)
|
||
|
|
||
|
/* Coefficient H1 LSB position */
|
||
|
#define BME68X_IDX_H1_LSB (24)
|
||
|
|
||
|
/* Coefficient H1 MSB position */
|
||
|
#define BME68X_IDX_H1_MSB (25)
|
||
|
|
||
|
/* Coefficient H3 position */
|
||
|
#define BME68X_IDX_H3 (26)
|
||
|
|
||
|
/* Coefficient H4 position */
|
||
|
#define BME68X_IDX_H4 (27)
|
||
|
|
||
|
/* Coefficient H5 position */
|
||
|
#define BME68X_IDX_H5 (28)
|
||
|
|
||
|
/* Coefficient H6 position */
|
||
|
#define BME68X_IDX_H6 (29)
|
||
|
|
||
|
/* Coefficient H7 position */
|
||
|
#define BME68X_IDX_H7 (30)
|
||
|
|
||
|
/* Coefficient T1 LSB position */
|
||
|
#define BME68X_IDX_T1_LSB (31)
|
||
|
|
||
|
/* Coefficient T1 MSB position */
|
||
|
#define BME68X_IDX_T1_MSB (32)
|
||
|
|
||
|
/* Coefficient GH2 LSB position */
|
||
|
#define BME68X_IDX_GH2_LSB (33)
|
||
|
|
||
|
/* Coefficient GH2 MSB position */
|
||
|
#define BME68X_IDX_GH2_MSB (34)
|
||
|
|
||
|
/* Coefficient GH1 position */
|
||
|
#define BME68X_IDX_GH1 (35)
|
||
|
|
||
|
/* Coefficient GH3 position */
|
||
|
#define BME68X_IDX_GH3 (36)
|
||
|
|
||
|
/* Coefficient res heat value position */
|
||
|
#define BME68X_IDX_RES_HEAT_VAL (37)
|
||
|
|
||
|
/* Coefficient res heat range position */
|
||
|
#define BME68X_IDX_RES_HEAT_RANGE (39)
|
||
|
|
||
|
/* Coefficient range switching error position */
|
||
|
#define BME68X_IDX_RANGE_SW_ERR (41)
|
||
|
|
||
|
/* Gas measurement macros */
|
||
|
|
||
|
/* Disable gas measurement */
|
||
|
#define BME68X_DISABLE_GAS_MEAS UINT8_C(0x00)
|
||
|
|
||
|
/* Enable gas measurement low */
|
||
|
#define BME68X_ENABLE_GAS_MEAS_L UINT8_C(0x01)
|
||
|
|
||
|
/* Enable gas measurement high */
|
||
|
#define BME68X_ENABLE_GAS_MEAS_H UINT8_C(0x02)
|
||
|
|
||
|
/* Heater control macros */
|
||
|
|
||
|
/* Enable heater */
|
||
|
#define BME68X_ENABLE_HEATER UINT8_C(0x00)
|
||
|
|
||
|
/* Disable heater */
|
||
|
#define BME68X_DISABLE_HEATER UINT8_C(0x01)
|
||
|
|
||
|
#ifdef BME68X_USE_FPU
|
||
|
|
||
|
/* 0 degree Celsius */
|
||
|
#define BME68X_MIN_TEMPERATURE INT16_C(0)
|
||
|
|
||
|
/* 60 degree Celsius */
|
||
|
#define BME68X_MAX_TEMPERATURE INT16_C(60)
|
||
|
|
||
|
/* 900 hecto Pascals */
|
||
|
#define BME68X_MIN_PRESSURE UINT32_C(90000)
|
||
|
|
||
|
/* 1100 hecto Pascals */
|
||
|
#define BME68X_MAX_PRESSURE UINT32_C(110000)
|
||
|
|
||
|
/* 20% relative humidity */
|
||
|
#define BME68X_MIN_HUMIDITY UINT32_C(20)
|
||
|
|
||
|
/* 80% relative humidity*/
|
||
|
#define BME68X_MAX_HUMIDITY UINT32_C(80)
|
||
|
#else
|
||
|
|
||
|
/* 0 degree Celsius */
|
||
|
#define BME68X_MIN_TEMPERATURE INT16_C(0)
|
||
|
|
||
|
/* 60 degree Celsius */
|
||
|
#define BME68X_MAX_TEMPERATURE INT16_C(6000)
|
||
|
|
||
|
/* 900 hecto Pascals */
|
||
|
#define BME68X_MIN_PRESSURE UINT32_C(90000)
|
||
|
|
||
|
/* 1100 hecto Pascals */
|
||
|
#define BME68X_MAX_PRESSURE UINT32_C(110000)
|
||
|
|
||
|
/* 20% relative humidity */
|
||
|
#define BME68X_MIN_HUMIDITY UINT32_C(20000)
|
||
|
|
||
|
/* 80% relative humidity*/
|
||
|
#define BME68X_MAX_HUMIDITY UINT32_C(80000)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#define BME68X_HEATR_DUR1 UINT16_C(1000)
|
||
|
#define BME68X_HEATR_DUR2 UINT16_C(2000)
|
||
|
#define BME68X_HEATR_DUR1_DELAY UINT32_C(1000000)
|
||
|
#define BME68X_HEATR_DUR2_DELAY UINT32_C(2000000)
|
||
|
#define BME68X_N_MEAS UINT8_C(6)
|
||
|
#define BME68X_LOW_TEMP UINT8_C(150)
|
||
|
#define BME68X_HIGH_TEMP UINT16_C(350)
|
||
|
|
||
|
/* Mask macros */
|
||
|
/* Mask for number of conversions */
|
||
|
#define BME68X_NBCONV_MSK UINT8_C(0X0f)
|
||
|
|
||
|
/* Mask for IIR filter */
|
||
|
#define BME68X_FILTER_MSK UINT8_C(0X1c)
|
||
|
|
||
|
/* Mask for ODR[3] */
|
||
|
#define BME68X_ODR3_MSK UINT8_C(0x80)
|
||
|
|
||
|
/* Mask for ODR[2:0] */
|
||
|
#define BME68X_ODR20_MSK UINT8_C(0xe0)
|
||
|
|
||
|
/* Mask for temperature oversampling */
|
||
|
#define BME68X_OST_MSK UINT8_C(0Xe0)
|
||
|
|
||
|
/* Mask for pressure oversampling */
|
||
|
#define BME68X_OSP_MSK UINT8_C(0X1c)
|
||
|
|
||
|
/* Mask for humidity oversampling */
|
||
|
#define BME68X_OSH_MSK UINT8_C(0X07)
|
||
|
|
||
|
/* Mask for heater control */
|
||
|
#define BME68X_HCTRL_MSK UINT8_C(0x08)
|
||
|
|
||
|
/* Mask for run gas */
|
||
|
#define BME68X_RUN_GAS_MSK UINT8_C(0x30)
|
||
|
|
||
|
/* Mask for operation mode */
|
||
|
#define BME68X_MODE_MSK UINT8_C(0x03)
|
||
|
|
||
|
/* Mask for res heat range */
|
||
|
#define BME68X_RHRANGE_MSK UINT8_C(0x30)
|
||
|
|
||
|
/* Mask for range switching error */
|
||
|
#define BME68X_RSERROR_MSK UINT8_C(0xf0)
|
||
|
|
||
|
/* Mask for new data */
|
||
|
#define BME68X_NEW_DATA_MSK UINT8_C(0x80)
|
||
|
|
||
|
/* Mask for gas index */
|
||
|
#define BME68X_GAS_INDEX_MSK UINT8_C(0x0f)
|
||
|
|
||
|
/* Mask for gas range */
|
||
|
#define BME68X_GAS_RANGE_MSK UINT8_C(0x0f)
|
||
|
|
||
|
/* Mask for gas measurement valid */
|
||
|
#define BME68X_GASM_VALID_MSK UINT8_C(0x20)
|
||
|
|
||
|
/* Mask for heater stability */
|
||
|
#define BME68X_HEAT_STAB_MSK UINT8_C(0x10)
|
||
|
|
||
|
/* Mask for SPI memory page */
|
||
|
#define BME68X_MEM_PAGE_MSK UINT8_C(0x10)
|
||
|
|
||
|
/* Mask for reading a register in SPI */
|
||
|
#define BME68X_SPI_RD_MSK UINT8_C(0x80)
|
||
|
|
||
|
/* Mask for writing a register in SPI */
|
||
|
#define BME68X_SPI_WR_MSK UINT8_C(0x7f)
|
||
|
|
||
|
/* Mask for the H1 calibration coefficient */
|
||
|
#define BME68X_BIT_H1_DATA_MSK UINT8_C(0x0f)
|
||
|
|
||
|
/* Position macros */
|
||
|
|
||
|
/* Filter bit position */
|
||
|
#define BME68X_FILTER_POS UINT8_C(2)
|
||
|
|
||
|
/* Temperature oversampling bit position */
|
||
|
#define BME68X_OST_POS UINT8_C(5)
|
||
|
|
||
|
/* Pressure oversampling bit position */
|
||
|
#define BME68X_OSP_POS UINT8_C(2)
|
||
|
|
||
|
/* ODR[3] bit position */
|
||
|
#define BME68X_ODR3_POS UINT8_C(7)
|
||
|
|
||
|
/* ODR[2:0] bit position */
|
||
|
#define BME68X_ODR20_POS UINT8_C(5)
|
||
|
|
||
|
/* Run gas bit position */
|
||
|
#define BME68X_RUN_GAS_POS UINT8_C(4)
|
||
|
|
||
|
/* Heater control bit position */
|
||
|
#define BME68X_HCTRL_POS UINT8_C(3)
|
||
|
|
||
|
/* Macro to combine two 8 bit data's to form a 16 bit data */
|
||
|
#define BME68X_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb)
|
||
|
|
||
|
/* Macro to set bits */
|
||
|
#define BME68X_SET_BITS(reg_data, bitname, data) \
|
||
|
((reg_data & ~(bitname##_MSK)) | \
|
||
|
((data << bitname##_POS) & bitname##_MSK))
|
||
|
|
||
|
/* Macro to get bits */
|
||
|
#define BME68X_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \
|
||
|
(bitname##_POS))
|
||
|
|
||
|
/* Macro to set bits starting from position 0 */
|
||
|
#define BME68X_SET_BITS_POS_0(reg_data, bitname, data) \
|
||
|
((reg_data & ~(bitname##_MSK)) | \
|
||
|
(data & bitname##_MSK))
|
||
|
|
||
|
/* Macro to get bits starting from position 0 */
|
||
|
#define BME68X_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))
|
||
|
|
||
|
/**
|
||
|
* BME68X_INTF_RET_TYPE is the read/write interface return type which can be overwritten by the build system.
|
||
|
* The default is set to int8_t.
|
||
|
*/
|
||
|
#ifndef BME68X_INTF_RET_TYPE
|
||
|
#define BME68X_INTF_RET_TYPE int8_t
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
* BME68X_INTF_RET_SUCCESS is the success return value read/write interface return type which can be
|
||
|
* overwritten by the build system. The default is set to 0. It is used to check for a successful
|
||
|
* execution of the read/write functions
|
||
|
*/
|
||
|
#ifndef BME68X_INTF_RET_SUCCESS
|
||
|
#define BME68X_INTF_RET_SUCCESS INT8_C(0)
|
||
|
#endif
|
||
|
|
||
|
/********************************************************* */
|
||
|
/*! Function Pointers */
|
||
|
/********************************************************* */
|
||
|
|
||
|
/*!
|
||
|
* @brief Bus communication function pointer which should be mapped to
|
||
|
* the platform specific read functions of the user
|
||
|
*
|
||
|
* @param[in] reg_addr : 8bit register address of the sensor
|
||
|
* @param[out] reg_data : Data from the specified address
|
||
|
* @param[in] length : Length of the reg_data array
|
||
|
* @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors
|
||
|
* for interface related callbacks
|
||
|
* @retval 0 for Success
|
||
|
* @retval Non-zero for Failure
|
||
|
*/
|
||
|
typedef BME68X_INTF_RET_TYPE (*bme68x_read_fptr_t)(uint8_t reg_addr, uint8_t *reg_data, uint32_t length,
|
||
|
void *intf_ptr);
|
||
|
|
||
|
/*!
|
||
|
* @brief Bus communication function pointer which should be mapped to
|
||
|
* the platform specific write functions of the user
|
||
|
*
|
||
|
* @param[in] reg_addr : 8bit register address of the sensor
|
||
|
* @param[out] reg_data : Data to the specified address
|
||
|
* @param[in] length : Length of the reg_data array
|
||
|
* @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors
|
||
|
* for interface related callbacks
|
||
|
* @retval 0 for Success
|
||
|
* @retval Non-zero for Failure
|
||
|
*
|
||
|
*/
|
||
|
typedef BME68X_INTF_RET_TYPE (*bme68x_write_fptr_t)(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length,
|
||
|
void *intf_ptr);
|
||
|
|
||
|
/*!
|
||
|
* @brief Delay function pointer which should be mapped to
|
||
|
* delay function of the user
|
||
|
*
|
||
|
* @param period - The time period in microseconds
|
||
|
* @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors
|
||
|
* for interface related callbacks
|
||
|
*/
|
||
|
typedef void (*bme68x_delay_us_fptr_t)(uint32_t period, void *intf_ptr);
|
||
|
|
||
|
/*
|
||
|
* @brief Generic communication function pointer
|
||
|
* @param[in] dev_id: Place holder to store the id of the device structure
|
||
|
* Can be used to store the index of the Chip select or
|
||
|
* I2C address of the device.
|
||
|
* @param[in] reg_addr: Used to select the register the where data needs to
|
||
|
* be read from or written to.
|
||
|
* @param[in,out] reg_data: Data array to read/write
|
||
|
* @param[in] len: Length of the data array
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* @brief Interface selection Enumerations
|
||
|
*/
|
||
|
enum bme68x_intf {
|
||
|
/*! SPI interface */
|
||
|
BME68X_SPI_INTF,
|
||
|
/*! I2C interface */
|
||
|
BME68X_I2C_INTF
|
||
|
};
|
||
|
|
||
|
/* Structure definitions */
|
||
|
|
||
|
/*
|
||
|
* @brief Sensor field data structure
|
||
|
*/
|
||
|
struct bme68x_data
|
||
|
{
|
||
|
/*! Contains new_data, gasm_valid & heat_stab */
|
||
|
uint8_t status;
|
||
|
|
||
|
/*! The index of the heater profile used */
|
||
|
uint8_t gas_index;
|
||
|
|
||
|
/*! Measurement index to track order */
|
||
|
uint8_t meas_index;
|
||
|
|
||
|
/*! Heater resistance */
|
||
|
uint8_t res_heat;
|
||
|
|
||
|
/*! Current DAC */
|
||
|
uint8_t idac;
|
||
|
|
||
|
/*! Gas wait period */
|
||
|
uint8_t gas_wait;
|
||
|
#ifndef BME68X_USE_FPU
|
||
|
|
||
|
/*! Temperature in degree celsius x100 */
|
||
|
int16_t temperature;
|
||
|
|
||
|
/*! Pressure in Pascal */
|
||
|
uint32_t pressure;
|
||
|
|
||
|
/*! Humidity in % relative humidity x1000 */
|
||
|
uint32_t humidity;
|
||
|
|
||
|
/*! Gas resistance in Ohms */
|
||
|
uint32_t gas_resistance;
|
||
|
#else
|
||
|
|
||
|
/*! Temperature in degree celsius */
|
||
|
float temperature;
|
||
|
|
||
|
/*! Pressure in Pascal */
|
||
|
float pressure;
|
||
|
|
||
|
/*! Humidity in % relative humidity x1000 */
|
||
|
float humidity;
|
||
|
|
||
|
/*! Gas resistance in Ohms */
|
||
|
float gas_resistance;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* @brief Structure to hold the calibration coefficients
|
||
|
*/
|
||
|
struct bme68x_calib_data
|
||
|
{
|
||
|
/*! Calibration coefficient for the humidity sensor */
|
||
|
uint16_t par_h1;
|
||
|
|
||
|
/*! Calibration coefficient for the humidity sensor */
|
||
|
uint16_t par_h2;
|
||
|
|
||
|
/*! Calibration coefficient for the humidity sensor */
|
||
|
int8_t par_h3;
|
||
|
|
||
|
/*! Calibration coefficient for the humidity sensor */
|
||
|
int8_t par_h4;
|
||
|
|
||
|
/*! Calibration coefficient for the humidity sensor */
|
||
|
int8_t par_h5;
|
||
|
|
||
|
/*! Calibration coefficient for the humidity sensor */
|
||
|
uint8_t par_h6;
|
||
|
|
||
|
/*! Calibration coefficient for the humidity sensor */
|
||
|
int8_t par_h7;
|
||
|
|
||
|
/*! Calibration coefficient for the gas sensor */
|
||
|
int8_t par_gh1;
|
||
|
|
||
|
/*! Calibration coefficient for the gas sensor */
|
||
|
int16_t par_gh2;
|
||
|
|
||
|
/*! Calibration coefficient for the gas sensor */
|
||
|
int8_t par_gh3;
|
||
|
|
||
|
/*! Calibration coefficient for the temperature sensor */
|
||
|
uint16_t par_t1;
|
||
|
|
||
|
/*! Calibration coefficient for the temperature sensor */
|
||
|
int16_t par_t2;
|
||
|
|
||
|
/*! Calibration coefficient for the temperature sensor */
|
||
|
int8_t par_t3;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
uint16_t par_p1;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
int16_t par_p2;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
int8_t par_p3;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
int16_t par_p4;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
int16_t par_p5;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
int8_t par_p6;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
int8_t par_p7;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
int16_t par_p8;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
int16_t par_p9;
|
||
|
|
||
|
/*! Calibration coefficient for the pressure sensor */
|
||
|
uint8_t par_p10;
|
||
|
#ifndef BME68X_USE_FPU
|
||
|
|
||
|
/*! Variable to store the intermediate temperature coefficient */
|
||
|
int32_t t_fine;
|
||
|
#else
|
||
|
|
||
|
/*! Variable to store the intermediate temperature coefficient */
|
||
|
float t_fine;
|
||
|
#endif
|
||
|
|
||
|
/*! Heater resistance range coefficient */
|
||
|
uint8_t res_heat_range;
|
||
|
|
||
|
/*! Heater resistance value coefficient */
|
||
|
int8_t res_heat_val;
|
||
|
|
||
|
/*! Gas resistance range switching error coefficient */
|
||
|
int8_t range_sw_err;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* @brief BME68X sensor settings structure which comprises of ODR,
|
||
|
* over-sampling and filter settings.
|
||
|
*/
|
||
|
struct bme68x_conf
|
||
|
{
|
||
|
/*! Humidity oversampling. Refer @ref osx*/
|
||
|
uint8_t os_hum;
|
||
|
|
||
|
/*! Temperature oversampling. Refer @ref osx */
|
||
|
uint8_t os_temp;
|
||
|
|
||
|
/*! Pressure oversampling. Refer @ref osx */
|
||
|
uint8_t os_pres;
|
||
|
|
||
|
/*! Filter coefficient. Refer @ref filter*/
|
||
|
uint8_t filter;
|
||
|
|
||
|
/*!
|
||
|
* Standby time between sequential mode measurement profiles.
|
||
|
* Refer @ref odr
|
||
|
*/
|
||
|
uint8_t odr;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* @brief BME68X gas heater configuration
|
||
|
*/
|
||
|
struct bme68x_heatr_conf
|
||
|
{
|
||
|
/*! Enable gas measurement. Refer @ref en_dis */
|
||
|
uint8_t enable;
|
||
|
|
||
|
/*! Store the heater temperature for forced mode degree Celsius */
|
||
|
uint16_t heatr_temp;
|
||
|
|
||
|
/*! Store the heating duration for forced mode in milliseconds */
|
||
|
uint16_t heatr_dur;
|
||
|
|
||
|
/*! Store the heater temperature profile in degree Celsius */
|
||
|
uint16_t *heatr_temp_prof;
|
||
|
|
||
|
/*! Store the heating duration profile in milliseconds */
|
||
|
uint16_t *heatr_dur_prof;
|
||
|
|
||
|
/*! Variable to store the length of the heating profile */
|
||
|
uint8_t profile_len;
|
||
|
|
||
|
/*!
|
||
|
* Variable to store heating duration for parallel mode
|
||
|
* in milliseconds
|
||
|
*/
|
||
|
uint16_t shared_heatr_dur;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* @brief BME68X device structure
|
||
|
*/
|
||
|
struct bme68x_dev
|
||
|
{
|
||
|
/*! Chip Id */
|
||
|
uint8_t chip_id;
|
||
|
|
||
|
/*!
|
||
|
* The interface pointer is used to enable the user
|
||
|
* to link their interface descriptors for reference during the
|
||
|
* implementation of the read and write interfaces to the
|
||
|
* hardware.
|
||
|
*/
|
||
|
void *intf_ptr;
|
||
|
|
||
|
/*!
|
||
|
* Variant id
|
||
|
* ----------------------------------------
|
||
|
* Value | Variant
|
||
|
* ----------------------------------------
|
||
|
* 0 | BME68X_VARIANT_GAS_LOW
|
||
|
* 1 | BME68X_VARIANT_GAS_HIGH
|
||
|
* ----------------------------------------
|
||
|
*/
|
||
|
uint32_t variant_id;
|
||
|
|
||
|
/*! SPI/I2C interface */
|
||
|
enum bme68x_intf intf;
|
||
|
|
||
|
/*! Memory page used */
|
||
|
uint8_t mem_page;
|
||
|
|
||
|
/*! Ambient temperature in Degree C*/
|
||
|
int8_t amb_temp;
|
||
|
|
||
|
/*! Sensor calibration data */
|
||
|
struct bme68x_calib_data calib;
|
||
|
|
||
|
/*! Read function pointer */
|
||
|
bme68x_read_fptr_t read;
|
||
|
|
||
|
/*! Write function pointer */
|
||
|
bme68x_write_fptr_t write;
|
||
|
|
||
|
/*! Delay function pointer */
|
||
|
bme68x_delay_us_fptr_t delay_us;
|
||
|
|
||
|
/*! To store interface pointer error */
|
||
|
BME68X_INTF_RET_TYPE intf_rslt;
|
||
|
|
||
|
/*! Store the info messages */
|
||
|
uint8_t info_msg;
|
||
|
};
|
||
|
|
||
|
#endif /* BME68X_DEFS_H_ */
|
||
|
/*! @endcond */
|