Update sensor driver for BME680 to 3.5.9 (#2969)
This commit is contained in:
parent
9a2579d971
commit
c7d0f83625
|
@ -68,7 +68,10 @@ static uint8_t r8u(uint8_t reg) {
|
|||
return ret[0];
|
||||
}
|
||||
|
||||
/* This part of code is coming from the original bme680.c driver by Bosch.
|
||||
// replace 'dev->calib.' with 'bme680_data.'
|
||||
// replace 'dev->amb_temp' with 'amb_temp'
|
||||
|
||||
/**\mainpage
|
||||
* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -108,20 +111,13 @@ static uint8_t r8u(uint8_t reg) {
|
|||
* 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 bme680.c
|
||||
* @date 19 Jun 2018
|
||||
* @version 3.5.9
|
||||
*
|
||||
*/
|
||||
|
||||
/**static variables */
|
||||
/**Look up table for the possible gas range values */
|
||||
uint32_t lookupTable1[16] = { UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647),
|
||||
UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2130303777), UINT32_C(2147483647),
|
||||
UINT32_C(2147483647), UINT32_C(2143188679), UINT32_C(2136746228), UINT32_C(2147483647), UINT32_C(2126008810),
|
||||
UINT32_C(2147483647), UINT32_C(2147483647) };
|
||||
/**Look up table for the possible gas range values */
|
||||
uint32_t lookupTable2[16] = { UINT32_C(4096000000), UINT32_C(2048000000), UINT32_C(1024000000), UINT32_C(512000000),
|
||||
UINT32_C(255744255), UINT32_C(127110228), UINT32_C(64000000), UINT32_C(32258064), UINT32_C(16016016), UINT32_C(
|
||||
8000000), UINT32_C(4000000), UINT32_C(2000000), UINT32_C(1000000), UINT32_C(500000), UINT32_C(250000),
|
||||
UINT32_C(125000) };
|
||||
|
||||
static uint8_t calc_heater_res(uint16_t temp)
|
||||
{
|
||||
uint8_t heatr_res;
|
||||
|
@ -132,9 +128,7 @@ static uint8_t calc_heater_res(uint16_t temp)
|
|||
int32_t var5;
|
||||
int32_t heatr_res_x100;
|
||||
|
||||
if (temp < 200) /* Cap temperature */
|
||||
temp = 200;
|
||||
else if (temp > 400)
|
||||
if (temp > 400) /* Cap temperature */
|
||||
temp = 400;
|
||||
|
||||
var1 = (((int32_t) amb_temp * bme680_data.par_gh3) / 1000) * 256;
|
||||
|
@ -173,12 +167,12 @@ static int16_t calc_temperature(uint32_t temp_adc)
|
|||
int64_t var3;
|
||||
int16_t calc_temp;
|
||||
|
||||
var1 = ((int32_t) temp_adc / 8) - ((int32_t) bme680_data.par_t1 * 2);
|
||||
var2 = (var1 * (int32_t) bme680_data.par_t2) / 2048;
|
||||
var3 = ((var1 / 2) * (var1 / 2)) / 4096;
|
||||
var3 = ((var3) * ((int32_t) bme680_data.par_t3 * 16)) / 16384;
|
||||
var1 = ((int32_t) temp_adc >> 3) - ((int32_t) bme680_data.par_t1 << 1);
|
||||
var2 = (var1 * (int32_t) bme680_data.par_t2) >> 11;
|
||||
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
|
||||
var3 = ((var3) * ((int32_t) bme680_data.par_t3 << 4)) >> 14;
|
||||
bme680_data.t_fine = (int32_t) (var2 + var3);
|
||||
calc_temp = (int16_t) (((bme680_data.t_fine * 5) + 128) / 256);
|
||||
calc_temp = (int16_t) (((bme680_data.t_fine * 5) + 128) >> 8);
|
||||
|
||||
return calc_temp;
|
||||
}
|
||||
|
@ -188,27 +182,37 @@ static uint32_t calc_pressure(uint32_t pres_adc)
|
|||
int32_t var1;
|
||||
int32_t var2;
|
||||
int32_t var3;
|
||||
int32_t calc_pres;
|
||||
int32_t pressure_comp;
|
||||
|
||||
var1 = (((int32_t) bme680_data.t_fine) / 2) - 64000;
|
||||
var2 = ((var1 / 4) * (var1 / 4)) / 2048;
|
||||
var2 = ((var2) * (int32_t) bme680_data.par_p6) / 4;
|
||||
var2 = var2 + ((var1 * (int32_t) bme680_data.par_p5) * 2);
|
||||
var2 = (var2 / 4) + ((int32_t) bme680_data.par_p4 * 65536);
|
||||
var1 = ((var1 / 4) * (var1 / 4)) / 8192;
|
||||
var1 = (((var1) * ((int32_t) bme680_data.par_p3 * 32)) / 8) + (((int32_t) bme680_data.par_p2 * var1) / 2);
|
||||
var1 = var1 / 262144;
|
||||
var1 = ((32768 + var1) * (int32_t) bme680_data.par_p1) / 32768;
|
||||
calc_pres = (int32_t) (1048576 - pres_adc);
|
||||
calc_pres = (int32_t) ((calc_pres - (var2 / 4096)) * (3125));
|
||||
calc_pres = ((calc_pres / var1) * 2);
|
||||
var1 = ((int32_t) bme680_data.par_p9 * (int32_t) (((calc_pres / 8) * (calc_pres / 8)) / 8192)) / 4096;
|
||||
var2 = ((int32_t) (calc_pres / 4) * (int32_t) bme680_data.par_p8) / 8192;
|
||||
var3 = ((int32_t) (calc_pres / 256) * (int32_t) (calc_pres / 256) * (int32_t) (calc_pres / 256)
|
||||
* (int32_t) bme680_data.par_p10) / 131072;
|
||||
calc_pres = (int32_t) (calc_pres) + ((var1 + var2 + var3 + ((int32_t) bme680_data.par_p7 * 128)) / 16);
|
||||
var1 = (((int32_t)bme680_data.t_fine) >> 1) - 64000;
|
||||
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) *
|
||||
(int32_t)bme680_data.par_p6) >> 2;
|
||||
var2 = var2 + ((var1 * (int32_t)bme680_data.par_p5) << 1);
|
||||
var2 = (var2 >> 2) + ((int32_t)bme680_data.par_p4 << 16);
|
||||
var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
|
||||
((int32_t)bme680_data.par_p3 << 5)) >> 3) +
|
||||
(((int32_t)bme680_data.par_p2 * var1) >> 1);
|
||||
var1 = var1 >> 18;
|
||||
var1 = ((32768 + var1) * (int32_t)bme680_data.par_p1) >> 15;
|
||||
pressure_comp = 1048576 - pres_adc;
|
||||
pressure_comp = (int32_t)((pressure_comp - (var2 >> 12)) * ((uint32_t)3125));
|
||||
if (pressure_comp >= BME680_MAX_OVERFLOW_VAL)
|
||||
pressure_comp = ((pressure_comp / var1) << 1);
|
||||
else
|
||||
pressure_comp = ((pressure_comp << 1) / var1);
|
||||
var1 = ((int32_t)bme680_data.par_p9 * (int32_t)(((pressure_comp >> 3) *
|
||||
(pressure_comp >> 3)) >> 13)) >> 12;
|
||||
var2 = ((int32_t)(pressure_comp >> 2) *
|
||||
(int32_t)bme680_data.par_p8) >> 13;
|
||||
var3 = ((int32_t)(pressure_comp >> 8) * (int32_t)(pressure_comp >> 8) *
|
||||
(int32_t)(pressure_comp >> 8) *
|
||||
(int32_t)bme680_data.par_p10) >> 17;
|
||||
|
||||
pressure_comp = (int32_t)(pressure_comp) + ((var1 + var2 + var3 +
|
||||
((int32_t)bme680_data.par_p7 << 7)) >> 4);
|
||||
|
||||
return (uint32_t)pressure_comp;
|
||||
|
||||
return (uint32_t) calc_pres;
|
||||
}
|
||||
|
||||
static uint32_t calc_humidity(uint16_t hum_adc)
|
||||
|
@ -222,19 +226,19 @@ static uint32_t calc_humidity(uint16_t hum_adc)
|
|||
int32_t temp_scaled;
|
||||
int32_t calc_hum;
|
||||
|
||||
temp_scaled = (((int32_t) bme680_data.t_fine * 5) + 128) / 256;
|
||||
temp_scaled = (((int32_t) bme680_data.t_fine * 5) + 128) >> 8;
|
||||
var1 = (int32_t) (hum_adc - ((int32_t) ((int32_t) bme680_data.par_h1 * 16)))
|
||||
- (((temp_scaled * (int32_t) bme680_data.par_h3) / ((int32_t) 100)) / 2);
|
||||
- (((temp_scaled * (int32_t) bme680_data.par_h3) / ((int32_t) 100)) >> 1);
|
||||
var2 = ((int32_t) bme680_data.par_h2
|
||||
* (((temp_scaled * (int32_t) bme680_data.par_h4) / ((int32_t) 100))
|
||||
+ (((temp_scaled * ((temp_scaled * (int32_t) bme680_data.par_h5) / ((int32_t) 100))) / 64)
|
||||
/ ((int32_t) 100)) + (int32_t) (1 * 16384))) / 1024;
|
||||
* (((temp_scaled * (int32_t) bme680_data.par_h4) / ((int32_t) 100))
|
||||
+ (((temp_scaled * ((temp_scaled * (int32_t) bme680_data.par_h5) / ((int32_t) 100))) >> 6)
|
||||
/ ((int32_t) 100)) + (int32_t) (1 << 14))) >> 10;
|
||||
var3 = var1 * var2;
|
||||
var4 = (int32_t) bme680_data.par_h6 * 128;
|
||||
var4 = ((var4) + ((temp_scaled * (int32_t) bme680_data.par_h7) / ((int32_t) 100))) / 16;
|
||||
var5 = ((var3 / 16384) * (var3 / 16384)) / 1024;
|
||||
var6 = (var4 * var5) / 2;
|
||||
calc_hum = (((var3 + var6) / 1024) * ((int32_t) 1000)) / 4096;
|
||||
var4 = (int32_t) bme680_data.par_h6 << 7;
|
||||
var4 = ((var4) + ((temp_scaled * (int32_t) bme680_data.par_h7) / ((int32_t) 100))) >> 4;
|
||||
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
|
||||
var6 = (var4 * var5) >> 1;
|
||||
calc_hum = (((var3 + var6) >> 10) * ((int32_t) 1000)) >> 12;
|
||||
|
||||
if (calc_hum > 100000) /* Cap at 100%rH */
|
||||
calc_hum = 100000;
|
||||
|
@ -244,6 +248,19 @@ static uint32_t calc_humidity(uint16_t hum_adc)
|
|||
return (uint32_t) calc_hum;
|
||||
}
|
||||
|
||||
|
||||
/**static variables */
|
||||
/**Look up table 1 for the possible gas range values */
|
||||
uint32_t lookupTable1[16] = { UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647),
|
||||
UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2130303777),
|
||||
UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2143188679), UINT32_C(2136746228),
|
||||
UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2147483647) };
|
||||
/**Look up table 2 for the possible gas range values */
|
||||
uint32_t lookupTable2[16] = { UINT32_C(4096000000), UINT32_C(2048000000), UINT32_C(1024000000), UINT32_C(512000000),
|
||||
UINT32_C(255744255), UINT32_C(127110228), UINT32_C(64000000), UINT32_C(32258064), UINT32_C(16016016),
|
||||
UINT32_C(8000000), UINT32_C(4000000), UINT32_C(2000000), UINT32_C(1000000), UINT32_C(500000),
|
||||
UINT32_C(250000), UINT32_C(125000) };
|
||||
|
||||
static uint32_t calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range)
|
||||
{
|
||||
int64_t var1;
|
||||
|
@ -251,14 +268,16 @@ static uint32_t calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range)
|
|||
int64_t var3;
|
||||
uint32_t calc_gas_res;
|
||||
|
||||
var1 = (int64_t) ((1340 + (5 * (int64_t) bme680_data.range_sw_err)) * ((int64_t) lookupTable1[gas_range])) / 65536;
|
||||
var2 = (((int64_t) ((int64_t) gas_res_adc * 32768) - (int64_t) (16777216)) + var1);
|
||||
var3 = (((int64_t) lookupTable2[gas_range] * (int64_t) var1) / 512);
|
||||
calc_gas_res = (uint32_t) ((var3 + ((int64_t) var2 / 2)) / (int64_t) var2);
|
||||
var1 = (int64_t) ((1340 + (5 * (int64_t) bme680_data.range_sw_err)) *
|
||||
((int64_t) lookupTable1[gas_range])) >> 16;
|
||||
var2 = (((int64_t) ((int64_t) gas_res_adc << 15) - (int64_t) (16777216)) + var1);
|
||||
var3 = (((int64_t) lookupTable2[gas_range] * (int64_t) var1) >> 9);
|
||||
calc_gas_res = (uint32_t) ((var3 + ((int64_t) var2 >> 1)) / (int64_t) var2);
|
||||
|
||||
return calc_gas_res;
|
||||
}
|
||||
|
||||
|
||||
uint16_t calc_dur()
|
||||
{
|
||||
uint32_t tph_dur; /* Calculate in us */
|
||||
|
|
|
@ -39,78 +39,47 @@
|
|||
* No license is granted by implication or otherwise under any patent or
|
||||
* patent rights of the copyright holder.
|
||||
*
|
||||
* @file bme680_defs.h
|
||||
* @date 5 Jul 2017
|
||||
* @version 3.5.1
|
||||
* @brief
|
||||
*
|
||||
* @file bme680_defs.h
|
||||
* @date 19 Jun 2018
|
||||
* @version 3.5.9
|
||||
* @brief Sensor driver for BME680 sensor
|
||||
*/
|
||||
|
||||
/*! @file bme680_defs.h
|
||||
@brief Sensor driver for BME680 sensor */
|
||||
/*!
|
||||
* @defgroup BME680 SENSOR API
|
||||
* @brief
|
||||
* @{*/
|
||||
#ifndef BME680_DEFS_H_
|
||||
#define BME680_DEFS_H_
|
||||
|
||||
/********************************************************/
|
||||
/* header includes */
|
||||
/** header includes **/
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#if (LONG_MAX) > 0x7fffffff
|
||||
#define __have_long64 1
|
||||
#elif (LONG_MAX) == 0x7fffffff
|
||||
#define __have_long32 1
|
||||
/** 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(UINT8_C)
|
||||
#define INT8_C(x) x
|
||||
#if (INT_MAX) > 0x7f
|
||||
#define UINT8_C(x) x
|
||||
#else
|
||||
#define UINT8_C(x) x##U
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(UINT16_C)
|
||||
#define INT16_C(x) x
|
||||
#if (INT_MAX) > 0x7fff
|
||||
#define UINT16_C(x) x
|
||||
#else
|
||||
#define UINT16_C(x) x##U
|
||||
#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)
|
||||
#if __have_long32
|
||||
#define INT32_C(x) x##L
|
||||
#define UINT32_C(x) x##UL
|
||||
#else
|
||||
#define INT32_C(x) x
|
||||
#define UINT32_C(x) x##U
|
||||
#endif
|
||||
#define INT32_C(x) S32_C(x)
|
||||
#define UINT32_C(x) U32_C(x)
|
||||
#endif
|
||||
|
||||
#if !defined(INT64_C) && !defined(UINT64_C)
|
||||
#if __have_long64
|
||||
#define INT64_C(x) x##L
|
||||
#define UINT64_C(x) x##UL
|
||||
#else
|
||||
#define INT64_C(x) x##LL
|
||||
#define UINT64_C(x) x##ULL
|
||||
#define INT64_C(x) S64_C(x)
|
||||
#define UINT64_C(x) U64_C(x)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
/**@}*/
|
||||
|
||||
/**\name C standard macros */
|
||||
/** C standard macros **/
|
||||
#ifndef NULL
|
||||
#ifdef __cplusplus
|
||||
#define NULL 0
|
||||
|
@ -119,29 +88,35 @@
|
|||
#endif
|
||||
#endif
|
||||
|
||||
/** BME680 General config */
|
||||
/** BME680 configuration macros */
|
||||
/** Enable or un-comment the macro to provide floating point data output **/
|
||||
#ifndef BME680_FLOAT_POINT_COMPENSATION
|
||||
/* #define BME680_FLOAT_POINT_COMPENSATION **/
|
||||
#endif
|
||||
|
||||
/** BME680 General config **/
|
||||
#define BME680_POLL_PERIOD_MS UINT8_C(10)
|
||||
|
||||
/** BME680 I2C addresses */
|
||||
/** BME680 I2C addresses **/
|
||||
#define BME680_I2C_ADDR_PRIMARY UINT8_C(0x76)
|
||||
#define BME680_I2C_ADDR_SECONDARY UINT8_C(0x77)
|
||||
|
||||
/** BME680 unique chip identifier */
|
||||
/** BME680 unique chip identifier **/
|
||||
#define BME680_CHIP_ID UINT8_C(0x61)
|
||||
|
||||
/** BME680 coefficients related defines */
|
||||
#define BME680_COEFF_SIZE UINT8_C(0x41)
|
||||
/** BME680 coefficients related defines **/
|
||||
#define BME680_COEFF_SIZE UINT8_C(41)
|
||||
#define BME680_COEFF_ADDR1_LEN UINT8_C(25)
|
||||
#define BME680_COEFF_ADDR2_LEN UINT8_C(16)
|
||||
|
||||
/** BME680 field_x related defines */
|
||||
/** BME680 field_x related defines **/
|
||||
#define BME680_FIELD_LENGTH UINT8_C(15)
|
||||
#define BME680_FIELD_ADDR_OFFSET UINT8_C(17)
|
||||
|
||||
/** Soft reset command */
|
||||
/** Soft reset command **/
|
||||
#define BME680_SOFT_RESET_CMD UINT8_C(0xb6)
|
||||
|
||||
/** Error code definitions */
|
||||
/** Error code definitions **/
|
||||
#define BME680_OK INT8_C(0)
|
||||
/* Errors */
|
||||
#define BME680_E_NULL_PTR INT8_C(-1)
|
||||
|
@ -157,22 +132,22 @@
|
|||
#define BME680_I_MIN_CORRECTION UINT8_C(1)
|
||||
#define BME680_I_MAX_CORRECTION UINT8_C(2)
|
||||
|
||||
/** Register map */
|
||||
/** Other coefficient's address */
|
||||
/** Register map **/
|
||||
/** Other coefficient's address **/
|
||||
#define BME680_ADDR_RES_HEAT_VAL_ADDR UINT8_C(0x00)
|
||||
#define BME680_ADDR_RES_HEAT_RANGE_ADDR UINT8_C(0x02)
|
||||
#define BME680_ADDR_RANGE_SW_ERR_ADDR UINT8_C(0x04)
|
||||
#define BME680_ADDR_SENS_CONF_START UINT8_C(0x5A)
|
||||
#define BME680_ADDR_GAS_CONF_START UINT8_C(0x64)
|
||||
|
||||
/** Field settings */
|
||||
/** Field settings **/
|
||||
#define BME680_FIELD0_ADDR UINT8_C(0x1d)
|
||||
|
||||
/** Heater settings */
|
||||
/** Heater settings **/
|
||||
#define BME680_RES_HEAT0_ADDR UINT8_C(0x5a)
|
||||
#define BME680_GAS_WAIT0_ADDR UINT8_C(0x64)
|
||||
|
||||
/** Sensor configuration registers */
|
||||
/** Sensor configuration registers **/
|
||||
#define BME680_CONF_HEAT_CTRL_ADDR UINT8_C(0x70)
|
||||
#define BME680_CONF_ODR_RUN_GAS_NBC_ADDR UINT8_C(0x71)
|
||||
#define BME680_CONF_OS_H_ADDR UINT8_C(0x72)
|
||||
|
@ -180,25 +155,25 @@
|
|||
#define BME680_CONF_T_P_MODE_ADDR UINT8_C(0x74)
|
||||
#define BME680_CONF_ODR_FILT_ADDR UINT8_C(0x75)
|
||||
|
||||
/** Coefficient's address */
|
||||
/** Coefficient's address **/
|
||||
#define BME680_COEFF_ADDR1 UINT8_C(0x89)
|
||||
#define BME680_COEFF_ADDR2 UINT8_C(0xe1)
|
||||
|
||||
/** Chip identifier */
|
||||
/** Chip identifier **/
|
||||
#define BME680_CHIP_ID_ADDR UINT8_C(0xd0)
|
||||
|
||||
/** Soft reset register */
|
||||
/** Soft reset register **/
|
||||
#define BME680_SOFT_RESET_ADDR UINT8_C(0xe0)
|
||||
|
||||
/** Heater control settings */
|
||||
/** Heater control settings **/
|
||||
#define BME680_ENABLE_HEATER UINT8_C(0x00)
|
||||
#define BME680_DISABLE_HEATER UINT8_C(0x08)
|
||||
|
||||
/** Gas measurement settings */
|
||||
/** Gas measurement settings **/
|
||||
#define BME680_DISABLE_GAS_MEAS UINT8_C(0x00)
|
||||
#define BME680_ENABLE_GAS_MEAS UINT8_C(0x01)
|
||||
|
||||
/** Over-sampling settings */
|
||||
/** Over-sampling settings **/
|
||||
#define BME680_OS_NONE UINT8_C(0)
|
||||
#define BME680_OS_1X UINT8_C(1)
|
||||
#define BME680_OS_2X UINT8_C(2)
|
||||
|
@ -206,7 +181,7 @@
|
|||
#define BME680_OS_8X UINT8_C(4)
|
||||
#define BME680_OS_16X UINT8_C(5)
|
||||
|
||||
/** IIR filter settings */
|
||||
/** IIR filter settings **/
|
||||
#define BME680_FILTER_SIZE_0 UINT8_C(0)
|
||||
#define BME680_FILTER_SIZE_1 UINT8_C(1)
|
||||
#define BME680_FILTER_SIZE_3 UINT8_C(2)
|
||||
|
@ -220,28 +195,27 @@
|
|||
#define BME680_SLEEP_MODE UINT8_C(0)
|
||||
#define BME680_FORCED_MODE UINT8_C(1)
|
||||
|
||||
/** Delay related macro declaration */
|
||||
#define BME680_RESET_PERIOD UINT32_C(10)
|
||||
/** Delay related macro declaration **/
|
||||
#define BME680_RESET_PERIOD UINT32_C(10)
|
||||
|
||||
/** SPI memory page settings */
|
||||
/** SPI memory page settings **/
|
||||
#define BME680_MEM_PAGE0 UINT8_C(0x10)
|
||||
#define BME680_MEM_PAGE1 UINT8_C(0x00)
|
||||
|
||||
/** Ambient humidity shift value for compensation */
|
||||
/** Ambient humidity shift value for compensation **/
|
||||
#define BME680_HUM_REG_SHIFT_VAL UINT8_C(4)
|
||||
|
||||
/** Run gas enable and disable settings */
|
||||
/** Run gas enable and disable settings **/
|
||||
#define BME680_RUN_GAS_DISABLE UINT8_C(0)
|
||||
#define BME680_RUN_GAS_ENABLE UINT8_C(1)
|
||||
|
||||
/** Buffer length macro declaration */
|
||||
/** Buffer length macro declaration **/
|
||||
#define BME680_TMP_BUFFER_LENGTH UINT8_C(40)
|
||||
#define BME680_REG_BUFFER_LENGTH UINT8_C(6)
|
||||
#define BME680_FIELD_DATA_LENGTH UINT8_C(3)
|
||||
#define BME680_GAS_REG_BUF_LENGTH UINT8_C(20)
|
||||
#define BME680_GAS_HEATER_PROF_LEN_MAX UINT8_C(10)
|
||||
|
||||
/** Settings selector */
|
||||
/** Settings selector **/
|
||||
#define BME680_OST_SEL UINT16_C(1)
|
||||
#define BME680_OSP_SEL UINT16_C(2)
|
||||
#define BME680_OSH_SEL UINT16_C(4)
|
||||
|
@ -250,13 +224,13 @@
|
|||
#define BME680_HCNTRL_SEL UINT16_C(32)
|
||||
#define BME680_RUN_GAS_SEL UINT16_C(64)
|
||||
#define BME680_NBCONV_SEL UINT16_C(128)
|
||||
#define BME680_GAS_SENSOR_SEL UINT16_C(BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL)
|
||||
#define BME680_GAS_SENSOR_SEL (BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL)
|
||||
|
||||
/** Number of conversion settings*/
|
||||
/** Number of conversion settings **/
|
||||
#define BME680_NBCONV_MIN UINT8_C(0)
|
||||
#define BME680_NBCONV_MAX UINT8_C(10)
|
||||
|
||||
/** Mask definitions */
|
||||
/** Mask definitions **/
|
||||
#define BME680_GAS_MEAS_MSK UINT8_C(0x30)
|
||||
#define BME680_NBCONV_MSK UINT8_C(0X0F)
|
||||
#define BME680_FILTER_MSK UINT8_C(0X1C)
|
||||
|
@ -278,14 +252,14 @@
|
|||
#define BME680_SPI_WR_MSK UINT8_C(0x7f)
|
||||
#define BME680_BIT_H1_DATA_MSK UINT8_C(0x0F)
|
||||
|
||||
/** Bit position definitions for sensor settings */
|
||||
/** Bit position definitions for sensor settings **/
|
||||
#define BME680_GAS_MEAS_POS UINT8_C(4)
|
||||
#define BME680_FILTER_POS UINT8_C(2)
|
||||
#define BME680_OST_POS UINT8_C(5)
|
||||
#define BME680_OSP_POS UINT8_C(2)
|
||||
#define BME680_RUN_GAS_POS UINT8_C(4)
|
||||
|
||||
/** Array Index to Field data mapping for Calibration Data*/
|
||||
/** Array Index to Field data mapping for Calibration Data **/
|
||||
#define BME680_T2_LSB_REG (1)
|
||||
#define BME680_T2_MSB_REG (2)
|
||||
#define BME680_T3_REG (3)
|
||||
|
@ -321,7 +295,7 @@
|
|||
#define BME680_GH1_REG (37)
|
||||
#define BME680_GH3_REG (38)
|
||||
|
||||
/** BME680 register buffer index settings*/
|
||||
/** BME680 register buffer index settings **/
|
||||
#define BME680_REG_FILTER_INDEX UINT8_C(5)
|
||||
#define BME680_REG_TEMP_INDEX UINT8_C(4)
|
||||
#define BME680_REG_PRES_INDEX UINT8_C(4)
|
||||
|
@ -330,38 +304,51 @@
|
|||
#define BME680_REG_RUN_GAS_INDEX UINT8_C(1)
|
||||
#define BME680_REG_HCTRL_INDEX UINT8_C(0)
|
||||
|
||||
/** Macro to combine two 8 bit data's to form a 16 bit data */
|
||||
/** BME680 pressure calculation macros **/
|
||||
/*! This max value is used to provide precedence to multiplication or division
|
||||
* in pressure compensation equation to achieve least loss of precision and
|
||||
* avoiding overflows.
|
||||
* i.e Comparing value, BME680_MAX_OVERFLOW_VAL = INT32_C(1 << 30)
|
||||
*/
|
||||
#define BME680_MAX_OVERFLOW_VAL INT32_C(0x40000000)
|
||||
|
||||
/** Macro to combine two 8 bit data's to form a 16 bit data **/
|
||||
#define BME680_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb)
|
||||
|
||||
/** Macro to SET and GET BITS of a register */
|
||||
/** Macro to SET and GET BITS of a register **/
|
||||
#define BME680_SET_BITS(reg_data, bitname, data) \
|
||||
((reg_data & ~(bitname##_MSK)) | \
|
||||
((data << bitname##_POS) & bitname##_MSK))
|
||||
#define BME680_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \
|
||||
(bitname##_POS))
|
||||
|
||||
/** Macro variant to handle the bitname position if it is zero */
|
||||
/** Macro variant to handle the bitname position if it is zero **/
|
||||
#define BME680_SET_BITS_POS_0(reg_data, bitname, data) \
|
||||
((reg_data & ~(bitname##_MSK)) | \
|
||||
(data & bitname##_MSK))
|
||||
#define BME680_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))
|
||||
|
||||
/** Type definitions */
|
||||
/*
|
||||
* 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
|
||||
/** Type definitions **/
|
||||
/*!
|
||||
* @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
|
||||
*/
|
||||
typedef int8_t (*bme680_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len);
|
||||
|
||||
/*
|
||||
* Delay function pointer
|
||||
* @param[in] period: Time period in milliseconds
|
||||
/*!
|
||||
* @brief Delay function pointer
|
||||
* @param[in] period
|
||||
* Time period in milliseconds
|
||||
*/
|
||||
typedef void (*bme680_delay_fptr_t)(uint32_t period);
|
||||
|
||||
|
@ -375,7 +362,7 @@ enum bme680_intf {
|
|||
BME680_I2C_INTF
|
||||
};
|
||||
|
||||
/* structure definitions */
|
||||
/** structure definitions **/
|
||||
/*!
|
||||
* @brief Sensor field data structure
|
||||
*/
|
||||
|
@ -386,6 +373,8 @@ struct bme680_field_data {
|
|||
uint8_t gas_index;
|
||||
/*! Measurement index to track order */
|
||||
uint8_t meas_index;
|
||||
|
||||
#ifndef BME680_FLOAT_POINT_COMPENSATION
|
||||
/*! Temperature in degree celsius x100 */
|
||||
int16_t temperature;
|
||||
/*! Pressure in Pascal */
|
||||
|
@ -394,6 +383,18 @@ struct bme680_field_data {
|
|||
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
|
||||
|
||||
};
|
||||
|
||||
/*!
|
||||
|
@ -446,8 +447,14 @@ struct bme680_calib_data {
|
|||
int16_t par_p9;
|
||||
/*! Variable to store calibrated pressure data */
|
||||
uint8_t par_p10;
|
||||
|
||||
#ifndef BME680_FLOAT_POINT_COMPENSATION
|
||||
/*! Variable to store t_fine size */
|
||||
int32_t t_fine;
|
||||
#else
|
||||
/*! Variable to store t_fine size */
|
||||
float t_fine;
|
||||
#endif
|
||||
/*! Variable to store heater resistance range */
|
||||
uint8_t res_heat_range;
|
||||
/*! Variable to store heater resistance value */
|
||||
|
@ -458,7 +465,7 @@ struct bme680_calib_data {
|
|||
|
||||
/*!
|
||||
* @brief BME680 sensor settings structure which comprises of ODR,
|
||||
* over-sampling and filter settings.
|
||||
* over-sampling and filter settings.
|
||||
*/
|
||||
struct bme680_tph_sett {
|
||||
/*! Humidity oversampling */
|
||||
|
@ -473,7 +480,7 @@ struct bme680_tph_sett {
|
|||
|
||||
/*!
|
||||
* @brief BME680 gas sensor which comprises of gas settings
|
||||
* and status parameters
|
||||
* and status parameters
|
||||
*/
|
||||
struct bme680_gas_sett {
|
||||
/*! Variable to store nb conversion */
|
||||
|
@ -482,9 +489,9 @@ struct bme680_gas_sett {
|
|||
uint8_t heatr_ctrl;
|
||||
/*! Run gas enable value */
|
||||
uint8_t run_gas;
|
||||
/*! Pointer to store heater temperature */
|
||||
/*! Heater temperature value */
|
||||
uint16_t heatr_temp;
|
||||
/*! Pointer to store duration profile */
|
||||
/*! Duration profile value */
|
||||
uint16_t heatr_dur;
|
||||
};
|
||||
|
||||
|
@ -500,7 +507,7 @@ struct bme680_dev {
|
|||
enum bme680_intf intf;
|
||||
/*! Memory page used */
|
||||
uint8_t mem_page;
|
||||
/*! Ambient temperature in Degree C*/
|
||||
/*! Ambient temperature in Degree C */
|
||||
int8_t amb_temp;
|
||||
/*! Sensor calibration data */
|
||||
struct bme680_calib_data calib;
|
||||
|
@ -514,16 +521,18 @@ struct bme680_dev {
|
|||
uint8_t new_fields;
|
||||
/*! Store the info messages */
|
||||
uint8_t info_msg;
|
||||
/*! Burst read structure */
|
||||
/*! Bus read function pointer */
|
||||
bme680_com_fptr_t read;
|
||||
/*! Burst write structure */
|
||||
/*! Bus write function pointer */
|
||||
bme680_com_fptr_t write;
|
||||
/*! Delay in ms */
|
||||
/*! delay function pointer */
|
||||
bme680_delay_fptr_t delay_ms;
|
||||
/*! Communication function result */
|
||||
int8_t com_rslt;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* BME680_DEFS_H_ */
|
||||
/** @}*/
|
||||
/** @}*/
|
||||
|
|
Loading…
Reference in New Issue