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_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.

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_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};

View File

@ -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")

1
spi.c
View File

@ -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;