bme680-air-meter-sw/meas.c

132 lines
3.0 KiB
C

#include <meas.h>
#include <stm32f0xx.h>
#include <delay.h>
#include "bme680-driver-fork/bme680.h"
static struct bme680_dev gas_sensor;
static uint8_t spi_transfer(uint8_t out_data)
{
while(SPI1->SR & SPI_SR_BSY);
SPI1->DR.DR8.DR8_1 = out_data;
__DSB();
while((SPI1->SR & SPI_SR_BSY) || !(SPI1->SR & SPI_SR_TXE));
return (uint8_t)(SPI1->DR.DR8.DR8_1 & 0xFF);
}
static int8_t write_spi(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
(void)dev_id;
int i;
GPIOA->ODR &= ~(1U<<4);
spi_transfer(reg_addr);
for (i = 0; i < len; i++)
spi_transfer(reg_data[i]);
GPIOA->ODR |= (1U<<4);
return 0;
}
static int8_t read_spi(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
(void)dev_id;
int i;
GPIOA->ODR &= ~(1U<<4);
spi_transfer(reg_addr);
for (i = 0; i < len; i++)
reg_data[i] = spi_transfer(0x00);
GPIOA->ODR |= (1U<<4);
return 0;
}
int meas_init_without_gas(void)
{
int ret;
gas_sensor.dev_id = 0;
gas_sensor.intf = BME680_SPI_INTF;
gas_sensor.read = read_spi;
gas_sensor.write = write_spi;
gas_sensor.delay_ms = delay_ms;
gas_sensor.amb_temp = 25;
ret = (int)bme680_init(&gas_sensor);
if (ret)
return ret;
uint8_t set_required_settings;
/* Set the temperature, pressure and humidity settings */
gas_sensor.tph_sett.os_hum = BME680_OS_8X;
gas_sensor.tph_sett.os_pres = BME680_OS_8X;
gas_sensor.tph_sett.os_temp = BME680_OS_8X;
gas_sensor.tph_sett.filter = BME680_FILTER_SIZE_7;
/* Set the remaining gas sensor settings and link the heating profile */
gas_sensor.gas_sett.run_gas = BME680_DISABLE_GAS_MEAS;
/* Create a ramp heat waveform in 3 steps */
gas_sensor.gas_sett.heatr_temp = 320; /* degree Celsius */
gas_sensor.gas_sett.heatr_dur = 150; /* milliseconds */
/* Select the power mode */
/* Must be set before writing the sensor configuration */
gas_sensor.power_mode = BME680_FORCED_MODE;
/* Set the required sensor settings needed */
set_required_settings = BME680_OST_SEL | BME680_OSP_SEL | BME680_OSH_SEL | BME680_FILTER_SEL | BME680_GAS_SENSOR_SEL;
/* Set the desired sensor configuration */
ret = (int)bme680_set_sensor_settings(set_required_settings,&gas_sensor);
return ret;
}
int meas_do(bool gas_enable, struct bme680_field_data *meas_data, int8_t ambient_temp)
{
uint16_t meas_duration;
int res;
if (!meas_data)
return -100;
gas_sensor.power_mode = BME680_FORCED_MODE;
gas_sensor.gas_sett.run_gas = (gas_enable ? BME680_RUN_GAS_ENABLE : BME680_RUN_GAS_DISABLE);
gas_sensor.amb_temp = ambient_temp;
res = (int)bme680_set_sensor_settings(BME680_OST_SEL | BME680_OSP_SEL | BME680_OSH_SEL |
BME680_FILTER_SEL | BME680_GAS_SENSOR_SEL,
&gas_sensor);
/* Set the power mode */
res = (int)bme680_set_sensor_mode(&gas_sensor);
if (res)
return res;
bme680_get_profile_dur(&meas_duration, &gas_sensor);
delay_ms(meas_duration);
res = (int)bme680_get_sensor_data(meas_data, &gas_sensor);
if (res)
return res;
gas_sensor.power_mode = BME680_SLEEP_MODE;
res = (int)bme680_set_sensor_mode(&gas_sensor);
return res;
}