This commit is contained in:
William Clark 2023-11-06 23:26:52 +00:00
parent 9e67234a31
commit ad9ad1ed24
4 changed files with 40 additions and 38 deletions

View File

@ -43,12 +43,14 @@ range_switching_error: 19
res_heat_range: 1 res_heat_range: 1
res_heat_val: 46 res_heat_val: 46
float mode float mode
tfine: 104478.758986 tfine: 104906.162500
temp: 20.406008 degC temp: 20.489485 degC
press: 99649.423644 Pa press: 100089.609193 Pa
humidity: 65.368724 % RH humidity: 64.456540 % RH
gas resistance: 10989.279979 Ohm gas resistance: 12100.310308 Ohm
== for heater target=300.0 and ambient temp=19.0 (degC) == for heater target=300.0 and ambient temp=19.0 (degC)
=== gas_valid_r: 1
=== heat_stab_r: 1
``` ```
## i2c demo ## i2c demo
@ -80,13 +82,14 @@ range_switching_error: 19
res_heat_range: 1 res_heat_range: 1
res_heat_val: 39 res_heat_val: 39
float mode float mode
tfine: 102706.944886 tfine: 97289.819111
temp: 20.059950 degC temp: 19.001918 degC
press: 99783.521673 Pa press: 100226.479673 Pa
humidity: 63.931961 % RH humidity: 67.022216 % RH
gas resistance: 12028.902897 Ohm gas resistance: 14702.868852 Ohm
== for heater target=300.0 and ambient temp=19.0 (degC) == 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. Perhaps they'd read closer to eachother following a burn-in or something.
Note: Two different BME680 devices, one on each type of bus. Low air pressure due to storm not bad sensor.

View File

@ -12,6 +12,7 @@ static void calc_press_comp(bme680_t *bme680);
static void calc_hum_comp(bme680_t *bme680); static void calc_hum_comp(bme680_t *bme680);
static void calc_gas_res(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); 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); return bme680->dev.write(reg, value);
} }
/********************************************************************/ /********************************************************************/
static int read_dev(bme680_t *bme680, uint8_t reg, uint8_t *dst, uint32_t size) { 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 (BME680_IS_SPI(bme680->mode)) {
check_spi_page(bme680, reg);
if (req_page != bme680->spi_page) {
set_spi_page(bme680, req_page);
bme680->spi_page = req_page;
}
reg |= 0x80; reg |= 0x80;
} }
return bme680->dev.read(reg, dst, size); 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) { static int set_spi_page(bme680_t *bme680, uint8_t page_no) {
uint8_t status_reg = page_no << 4; 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); return bme680->dev.write(REG_STATUS, status_reg);
} }
/********************************************************************/ /********************************************************************/
static int read_id(bme680_t *bme680, uint8_t *id) { static int read_id(bme680_t *bme680, uint8_t *id) {
@ -183,6 +185,7 @@ SKIP_GAS:
return err; return err;
} }
/********************************************************************/
/* To start forced mode, you just have to set the lsb=1 of REG_CTRL_MEAS */ /* To start forced mode, you just have to set the lsb=1 of REG_CTRL_MEAS */
int bme680_start(bme680_t *bme680) { int bme680_start(bme680_t *bme680) {
@ -193,9 +196,8 @@ int bme680_start(bme680_t *bme680) {
return err; 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. * don't call out of order.
*/ */
int bme680_poll(bme680_t *bme680) { int bme680_poll(bme680_t *bme680) {
@ -209,8 +211,8 @@ int bme680_poll(bme680_t *bme680) {
do { do {
usleep(5000); /* 5 ms */ usleep(5000); /* 5 ms */
err |= read_dev(bme680, REG_EAS_STATUS, &meas_status, 1); err |= read_dev(bme680, REG_EAS_STATUS, &meas_status, 1);
gas_measuring = ((meas_status >> 6) & 1) == 1; gas_measuring = (meas_status >> 6) & 1;
any_measuring = ((meas_status >> 5) & 1) == 1; any_measuring = (meas_status >> 5) & 1;
} while ((gas_measuring || any_measuring) && !err); } while ((gas_measuring || any_measuring) && !err);
@ -246,22 +248,20 @@ int bme680_read(bme680_t *bme680) {
bme680->adc.press >>= (bme680->cfg.osrs_p - 1); bme680->adc.press >>= (bme680->cfg.osrs_p - 1);
} }
/* read gas adc ?*/ /* read gas adc values and check error bits */
// TODO: read 2 bytes once
if (BME680_GAS_ENABLED(bme680->mode)) { 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); err |= read_dev(bme680, 0x2A, buffer, 2);
bme680->adc.gas_range = buffer[0] & 0xF;
/* 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 ??? ) */ /* check gas validity status (if one actually took place ??? ) */
err |= read_dev(bme680, 0x2B, buffer, 1); bme680->gas_valid = (buffer[1] >> 5) & 1;
bme680->gas_valid = (buffer[0] >> 5) & 1 ;
/* check heater stability. if it managed to get to temp within given time + preload current */ /* 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[1] >> 4) & 1;
bme680->heat_stab = (buffer[0] >> 4) & 1;
} }
/* read/convert in order ..*/ /* 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) { int bme680_calibrate(bme680_t *bme680) {
uint8_t buffer[3] = {0, 0 ,0}; uint8_t buffer[3] = {0, 0 ,0};

View File

@ -3,7 +3,6 @@
/* SPI page number 0 => 0x00 to 0x7F */ /* SPI page number 0 => 0x00 to 0x7F */
/* SPI page number 1 => 0x80 to 0xFF */ /* 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(v) ((v > 0x7F) ? 0 : 1)
#define REG_SPI_PAGE_MAP(v) (v == 0 ? "LOW" : "HIGH") #define REG_SPI_PAGE_MAP(v) (v == 0 ? "LOW" : "HIGH")

1
spi.c
View File

@ -42,7 +42,6 @@ int spi_init(void) {
return SPI_ERR; return SPI_ERR;
} }
if (ioctl(fd, SPI_IOC_RD_MODE, &mode) == -1) { if (ioctl(fd, SPI_IOC_RD_MODE, &mode) == -1) {
fprintf(stderr, "SPI_IOC_RD_MODE\n"); fprintf(stderr, "SPI_IOC_RD_MODE\n");
return SPI_ERR; return SPI_ERR;