After powering-on the sensor, and before every measurement, it loads the NMV. We must wait until this process is completed otherwise we will read weird values. Since it was observed that the time may be a bit long after a cold start, it is more convinient to just wait until the sensor iready, without a timout. Signed-off-by: Efrain Calderon <efrain.calderon@aquarobur.com>
165 lines
5.4 KiB
C
165 lines
5.4 KiB
C
/*
|
|
* Copyright (c) 2016, 2017 Intel Corporation
|
|
* Copyright (c) 2017 IpTronix S.r.l.
|
|
* Copyright (c) 2021 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_DRIVERS_SENSOR_BME280_BME280_H_
|
|
#define ZEPHYR_DRIVERS_SENSOR_BME280_BME280_H_
|
|
|
|
#include <zephyr/types.h>
|
|
#include <device.h>
|
|
#include <devicetree.h>
|
|
#include <drivers/spi.h>
|
|
#include <drivers/i2c.h>
|
|
|
|
#define DT_DRV_COMPAT bosch_bme280
|
|
|
|
#define BME280_BUS_SPI DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
|
|
#define BME280_BUS_I2C DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c)
|
|
|
|
union bme280_bus_config {
|
|
#if BME280_BUS_SPI
|
|
struct spi_config spi_cfg;
|
|
#endif
|
|
#if BME280_BUS_I2C
|
|
uint16_t i2c_addr;
|
|
#endif
|
|
};
|
|
|
|
typedef int (*bme280_bus_check_fn)(const struct device *bus,
|
|
const union bme280_bus_config *bus_config);
|
|
typedef int (*bme280_reg_read_fn)(const struct device *bus,
|
|
const union bme280_bus_config *bus_config,
|
|
uint8_t start, uint8_t *buf, int size);
|
|
typedef int (*bme280_reg_write_fn)(const struct device *bus,
|
|
const union bme280_bus_config *bus_config,
|
|
uint8_t reg, uint8_t val);
|
|
|
|
struct bme280_bus_io {
|
|
bme280_bus_check_fn check;
|
|
bme280_reg_read_fn read;
|
|
bme280_reg_write_fn write;
|
|
};
|
|
|
|
#if BME280_BUS_SPI
|
|
#define BME280_SPI_OPERATION (SPI_WORD_SET(8) | SPI_TRANSFER_MSB | \
|
|
SPI_MODE_CPOL | SPI_MODE_CPHA)
|
|
extern const struct bme280_bus_io bme280_bus_io_spi;
|
|
#endif
|
|
|
|
#if BME280_BUS_I2C
|
|
extern const struct bme280_bus_io bme280_bus_io_i2c;
|
|
#endif
|
|
|
|
#define BME280_REG_PRESS_MSB 0xF7
|
|
#define BME280_REG_COMP_START 0x88
|
|
#define BME280_REG_HUM_COMP_PART1 0xA1
|
|
#define BME280_REG_HUM_COMP_PART2 0xE1
|
|
#define BME280_REG_ID 0xD0
|
|
#define BME280_REG_CONFIG 0xF5
|
|
#define BME280_REG_CTRL_MEAS 0xF4
|
|
#define BME280_REG_CTRL_HUM 0xF2
|
|
#define BME280_REG_STATUS 0xF3
|
|
#define BME280_REG_RESET 0xE0
|
|
|
|
#define BMP280_CHIP_ID_SAMPLE_1 0x56
|
|
#define BMP280_CHIP_ID_SAMPLE_2 0x57
|
|
#define BMP280_CHIP_ID_MP 0x58
|
|
#define BME280_CHIP_ID 0x60
|
|
#define BME280_MODE_SLEEP 0x00
|
|
#define BME280_MODE_FORCED 0x01
|
|
#define BME280_MODE_NORMAL 0x03
|
|
#define BME280_SPI_3W_DISABLE 0x00
|
|
#define BME280_CMD_SOFT_RESET 0xB6
|
|
#define BME280_STATUS_MEASURING 0x08
|
|
#define BME280_STATUS_IM_UPDATE 0x01
|
|
|
|
#if defined CONFIG_BME280_MODE_NORMAL
|
|
#define BME280_MODE BME280_MODE_NORMAL
|
|
#elif defined CONFIG_BME280_MODE_FORCED
|
|
#define BME280_MODE BME280_MODE_FORCED
|
|
#endif
|
|
|
|
#if defined CONFIG_BME280_TEMP_OVER_1X
|
|
#define BME280_TEMP_OVER (1 << 5)
|
|
#elif defined CONFIG_BME280_TEMP_OVER_2X
|
|
#define BME280_TEMP_OVER (2 << 5)
|
|
#elif defined CONFIG_BME280_TEMP_OVER_4X
|
|
#define BME280_TEMP_OVER (3 << 5)
|
|
#elif defined CONFIG_BME280_TEMP_OVER_8X
|
|
#define BME280_TEMP_OVER (4 << 5)
|
|
#elif defined CONFIG_BME280_TEMP_OVER_16X
|
|
#define BME280_TEMP_OVER (5 << 5)
|
|
#endif
|
|
|
|
#if defined CONFIG_BME280_PRESS_OVER_1X
|
|
#define BME280_PRESS_OVER (1 << 2)
|
|
#elif defined CONFIG_BME280_PRESS_OVER_2X
|
|
#define BME280_PRESS_OVER (2 << 2)
|
|
#elif defined CONFIG_BME280_PRESS_OVER_4X
|
|
#define BME280_PRESS_OVER (3 << 2)
|
|
#elif defined CONFIG_BME280_PRESS_OVER_8X
|
|
#define BME280_PRESS_OVER (4 << 2)
|
|
#elif defined CONFIG_BME280_PRESS_OVER_16X
|
|
#define BME280_PRESS_OVER (5 << 2)
|
|
#endif
|
|
|
|
#if defined CONFIG_BME280_HUMIDITY_OVER_1X
|
|
#define BME280_HUMIDITY_OVER 1
|
|
#elif defined CONFIG_BME280_HUMIDITY_OVER_2X
|
|
#define BME280_HUMIDITY_OVER 2
|
|
#elif defined CONFIG_BME280_HUMIDITY_OVER_4X
|
|
#define BME280_HUMIDITY_OVER 3
|
|
#elif defined CONFIG_BME280_HUMIDITY_OVER_8X
|
|
#define BME280_HUMIDITY_OVER 4
|
|
#elif defined CONFIG_BME280_HUMIDITY_OVER_16X
|
|
#define BME280_HUMIDITY_OVER 5
|
|
#endif
|
|
|
|
#if defined CONFIG_BME280_STANDBY_05MS
|
|
#define BME280_STANDBY 0
|
|
#elif defined CONFIG_BME280_STANDBY_62MS
|
|
#define BME280_STANDBY (1 << 5)
|
|
#elif defined CONFIG_BME280_STANDBY_125MS
|
|
#define BME280_STANDBY (2 << 5)
|
|
#elif defined CONFIG_BME280_STANDBY_250MS
|
|
#define BME280_STANDBY (3 << 5)
|
|
#elif defined CONFIG_BME280_STANDBY_500MS
|
|
#define BME280_STANDBY (4 << 5)
|
|
#elif defined CONFIG_BME280_STANDBY_1000MS
|
|
#define BME280_STANDBY (5 << 5)
|
|
#elif defined CONFIG_BME280_STANDBY_2000MS
|
|
#define BME280_STANDBY (6 << 5)
|
|
#elif defined CONFIG_BME280_STANDBY_4000MS
|
|
#define BME280_STANDBY (7 << 5)
|
|
#endif
|
|
|
|
#if defined CONFIG_BME280_FILTER_OFF
|
|
#define BME280_FILTER 0
|
|
#elif defined CONFIG_BME280_FILTER_2
|
|
#define BME280_FILTER (1 << 2)
|
|
#elif defined CONFIG_BME280_FILTER_4
|
|
#define BME280_FILTER (2 << 2)
|
|
#elif defined CONFIG_BME280_FILTER_8
|
|
#define BME280_FILTER (3 << 2)
|
|
#elif defined CONFIG_BME280_FILTER_16
|
|
#define BME280_FILTER (4 << 2)
|
|
#endif
|
|
|
|
#define BME280_CTRL_MEAS_VAL (BME280_PRESS_OVER | \
|
|
BME280_TEMP_OVER | \
|
|
BME280_MODE)
|
|
#define BME280_CONFIG_VAL (BME280_STANDBY | \
|
|
BME280_FILTER | \
|
|
BME280_SPI_3W_DISABLE)
|
|
|
|
|
|
#define BME280_CTRL_MEAS_OFF_VAL (BME280_PRESS_OVER | \
|
|
BME280_TEMP_OVER | \
|
|
BME280_MODE_SLEEP)
|
|
|
|
#endif /* ZEPHYR_DRIVERS_SENSOR_BME280_BME280_H_ */
|