From e7367d1ceca27aa28c8062b92aacf3c4de98bde9 Mon Sep 17 00:00:00 2001 From: Pim van Pelt Date: Sun, 22 Apr 2018 10:23:05 +0200 Subject: [PATCH] Attempt to run BME280 in default 'Android' mode -- See datasheet para 3.5.3 --- src/mgos_barometer_bme280.c | 23 +++++++++-------------- src/mgos_barometer_bme280.h | 7 ++++++- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/mgos_barometer_bme280.c b/src/mgos_barometer_bme280.c index 77f9089..b144d9a 100644 --- a/src/mgos_barometer_bme280.c +++ b/src/mgos_barometer_bme280.c @@ -37,21 +37,22 @@ bool mgos_barometer_bme280_create(struct mgos_barometer *dev) { if (!bme280_data) return false; dev->user_data=bme280_data; + // Reset device + if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, BME280_REG_RESET, 0xB6)) + return false; + mgos_usleep(10000); + + // Read calibration data if (!mgos_i2c_read_reg_n(dev->i2c, dev->i2caddr, BME280_REG_TEMPERATURE_CALIB_DIG_T1_LSB, 24, (uint8_t *)bme280_data)) return false; - // Mode | Pressure OS | Temp OS - if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, BME280_REG_CTRL_MEAS, BME280_MODE_SLEEP | BME280_OVERSAMP_1X << 2 | BME280_OVERSAMP_1X << 5)) - return false; - mgos_usleep(10000); - - // SPI | 250ms period | no filter - if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, BME280_REG_CONFIG, 0x00 | 0x04 << 2 | 0x00 << 5)) + // SPI | 0.5ms period | 16X IIR filter + if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, BME280_REG_CONFIG, 0x00 | BME280_STANDBY_500us << 2 | BME280_FILTER_16X << 5)) return false; mgos_usleep(10000); // Mode | Pressure OS | Temp OS - if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, BME280_REG_CTRL_MEAS, BME280_MODE_NORMAL | BME280_OVERSAMP_1X << 2 | BME280_OVERSAMP_1X << 5)) + if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, BME280_REG_CTRL_MEAS, BME280_MODE_NORMAL | BME280_OVERSAMP_16X << 2 | BME280_OVERSAMP_2X << 5)) return false; dev->capabilities|=MGOS_BAROMETER_CAP_BAROMETER; @@ -76,12 +77,6 @@ bool mgos_barometer_bme280_read(struct mgos_barometer *dev) { bme280_data=(struct mgos_barometer_bme280_data *) dev->user_data; if (!bme280_data) return false; - // Forced Mode | 8x OS Pressure | 1x OS Temp - // 0x01 | 0x04 << 2 | 0x01 << 5 - if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, BME280_REG_CTRL_MEAS, 0x01 | 0x04 << 2 | 0x01 << 5)) - return false; - mgos_usleep(10000); - // read data from sensor uint8_t data[6]; if (!mgos_i2c_read_reg_n(dev->i2c, dev->i2caddr, BME280_REG_PRESSURE_MSB, 6, data)) diff --git a/src/mgos_barometer_bme280.h b/src/mgos_barometer_bme280.h index 938e954..ec7dd72 100644 --- a/src/mgos_barometer_bme280.h +++ b/src/mgos_barometer_bme280.h @@ -23,7 +23,7 @@ #define BME280_REG_TEMPERATURE_CALIB_DIG_T1_LSB (0x88) -#define BME280_OVERSAMP_NONE (0x00) +#define BME280_OVERSAMP_SKIPPED (0x00) #define BME280_OVERSAMP_1X (0x01) #define BME280_OVERSAMP_2X (0x02) #define BME280_OVERSAMP_4X (0x03) @@ -38,6 +38,11 @@ #define BME280_STANDBY_1000ms (0x05) // Note: Datasheet defines 110 == 10ms, 111 == 20ms, but BME280 and BMP280 // implement this differently. +#define BME280_FILTER_OFF (0x00) +#define BME280_FILTER_2X (0x01) +#define BME280_FILTER_4X (0x02) +#define BME280_FILTER_8X (0x03) +#define BME280_FILTER_16X (0x04) struct mgos_barometer_bme280_calib_data {