From ad9ad1ed24d14f3fc233a9f4973aa5dca031ec67 Mon Sep 17 00:00:00 2001 From: William Clark Date: Mon, 6 Nov 2023 23:26:52 +0000 Subject: [PATCH] cleanup --- README.md | 27 +++++++++++++++------------ bme680.c | 49 +++++++++++++++++++++++++------------------------ registers.h | 1 - spi.c | 1 - 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index b8027e4..5dec118 100644 --- a/README.md +++ b/README.md @@ -43,12 +43,14 @@ range_switching_error: 19 res_heat_range: 1 res_heat_val: 46 float mode -tfine: 104478.758986 -temp: 20.406008 degC -press: 99649.423644 Pa -humidity: 65.368724 % RH -gas resistance: 10989.279979 Ohm +tfine: 104906.162500 +temp: 20.489485 degC +press: 100089.609193 Pa +humidity: 64.456540 % RH +gas resistance: 12100.310308 Ohm == for heater target=300.0 and ambient temp=19.0 (degC) +=== gas_valid_r: 1 +=== heat_stab_r: 1 ``` ## i2c demo @@ -80,13 +82,14 @@ range_switching_error: 19 res_heat_range: 1 res_heat_val: 39 float mode -tfine: 102706.944886 -temp: 20.059950 degC -press: 99783.521673 Pa -humidity: 63.931961 % RH -gas resistance: 12028.902897 Ohm +tfine: 97289.819111 +temp: 19.001918 degC +press: 100226.479673 Pa +humidity: 67.022216 % RH +gas resistance: 14702.868852 Ohm == for heater target=300.0 and ambient temp=19.0 (degC) +=== gas_valid_r: 1 +=== heat_stab_r: 1 ``` - -Note: Two different BME680 devices, one on each type of bus. Low air pressure due to storm not bad sensor. +Note: Two different BME680 devices, one on each type of bus. Perhaps they'd read closer to eachother following a burn-in or something. diff --git a/bme680.c b/bme680.c index 0e833d3..263fba7 100644 --- a/bme680.c +++ b/bme680.c @@ -12,6 +12,7 @@ static void calc_press_comp(bme680_t *bme680); static void calc_hum_comp(bme680_t *bme680); static void calc_gas_res(bme680_t *bme680); +static void check_spi_page(bme680_t *bme680, uint8_t reg); static int set_spi_page(bme680_t *bme680, uint8_t no); @@ -31,33 +32,34 @@ static int write_dev(bme680_t *bme680, uint8_t reg, uint8_t value) { return bme680->dev.write(reg, value); } - /********************************************************************/ static int read_dev(bme680_t *bme680, uint8_t reg, uint8_t *dst, uint32_t size) { - uint8_t req_page = REG_SPI_PAGE(reg); - if (BME680_IS_SPI(bme680->mode)) { - - if (req_page != bme680->spi_page) { - set_spi_page(bme680, req_page); - bme680->spi_page = req_page; - } + check_spi_page(bme680, reg); reg |= 0x80; } return bme680->dev.read(reg, dst, size); } +/********************************************************************/ +/* change spi page if necessary */ +static void check_spi_page(bme680_t *bme680, uint8_t reg) { + uint8_t required_page = REG_SPI_PAGE(reg); + + if (required_page != bme680->spi_page) { + set_spi_page(bme680, required_page); + bme680->spi_page = required_page; + } +} /********************************************************************/ static int set_spi_page(bme680_t *bme680, uint8_t page_no) { uint8_t status_reg = page_no << 4; -// printf("page=%d (%s)\n", page_no, REG_SPI_PAGE_MAP(page_no)); return bme680->dev.write(REG_STATUS, status_reg); } - /********************************************************************/ static int read_id(bme680_t *bme680, uint8_t *id) { @@ -183,6 +185,7 @@ SKIP_GAS: return err; } +/********************************************************************/ /* To start forced mode, you just have to set the lsb=1 of REG_CTRL_MEAS */ int bme680_start(bme680_t *bme680) { @@ -193,9 +196,8 @@ int bme680_start(bme680_t *bme680) { return err; } - /********************************************************************/ -/* blocks until the device claims all scheduled conversions are done. +/* blocks until the device all scheduled conversions are done. * don't call out of order. */ int bme680_poll(bme680_t *bme680) { @@ -209,8 +211,8 @@ int bme680_poll(bme680_t *bme680) { do { usleep(5000); /* 5 ms */ err |= read_dev(bme680, REG_EAS_STATUS, &meas_status, 1); - gas_measuring = ((meas_status >> 6) & 1) == 1; - any_measuring = ((meas_status >> 5) & 1) == 1; + gas_measuring = (meas_status >> 6) & 1; + any_measuring = (meas_status >> 5) & 1; } while ((gas_measuring || any_measuring) && !err); @@ -246,22 +248,20 @@ int bme680_read(bme680_t *bme680) { bme680->adc.press >>= (bme680->cfg.osrs_p - 1); } - /* read gas adc ?*/ - // TODO: read 2 bytes once + /* read gas adc values and check error bits */ if (BME680_GAS_ENABLED(bme680->mode)) { - err |= read_dev(bme680, 0x2A, buffer, 2); - bme680->adc.gas = (buffer[0] << 2) | (buffer[1] >> 6); - err |= read_dev(bme680, 0x2B, buffer, 1); - bme680->adc.gas_range = buffer[0] & 0xF; + err |= read_dev(bme680, 0x2A, buffer, 2); + + /* read gas-related adc values */ + bme680->adc.gas = (buffer[0] << 2) | (buffer[1] >> 6); + bme680->adc.gas_range = buffer[1] & 0xF; /* check gas validity status (if one actually took place ??? ) */ - err |= read_dev(bme680, 0x2B, buffer, 1); - bme680->gas_valid = (buffer[0] >> 5) & 1 ; + bme680->gas_valid = (buffer[1] >> 5) & 1; /* check heater stability. if it managed to get to temp within given time + preload current */ - err |= read_dev(bme680, 0x2B, buffer, 1); - bme680->heat_stab = (buffer[0] >> 4) & 1; + bme680->heat_stab = (buffer[1] >> 4) & 1; } /* read/convert in order ..*/ @@ -451,6 +451,7 @@ static void calc_hum_comp (bme680_t *bme680) { } /********************************************************************/ +// TODO: read one big contiguous block int bme680_calibrate(bme680_t *bme680) { uint8_t buffer[3] = {0, 0 ,0}; diff --git a/registers.h b/registers.h index 1873200..ccaeed0 100644 --- a/registers.h +++ b/registers.h @@ -3,7 +3,6 @@ /* SPI page number 0 => 0x00 to 0x7F */ /* SPI page number 1 => 0x80 to 0xFF */ -/* SPECIAL CASE: 0x73 is reachable in both page 1 and 0 !!!!*/ #define REG_SPI_PAGE(v) ((v > 0x7F) ? 0 : 1) #define REG_SPI_PAGE_MAP(v) (v == 0 ? "LOW" : "HIGH") diff --git a/spi.c b/spi.c index 3a6caad..5e31024 100644 --- a/spi.c +++ b/spi.c @@ -42,7 +42,6 @@ int spi_init(void) { return SPI_ERR; } - if (ioctl(fd, SPI_IOC_RD_MODE, &mode) == -1) { fprintf(stderr, "SPI_IOC_RD_MODE\n"); return SPI_ERR;