/* * bme680.c * * Created on: Feb 11, 2020 * Author: KamilB */ #include "bme680.h" void BME680_write8(uint8_t reg, uint8_t val){ HAL_GPIO_WritePin(NSS_PORT, NSS_PIN, GPIO_PIN_RESET); reg = reg & ~0x80; uint8_t tx_buf[] = {reg, val}; HAL_SPI_Transmit(&hspi2, tx_buf, 2, HAL_MAX_DELAY); HAL_GPIO_WritePin(NSS_PORT, NSS_PIN, GPIO_PIN_SET); } uint8_t BME680_read8(uint8_t reg){ HAL_GPIO_WritePin(NSS_PORT, NSS_PIN, GPIO_PIN_RESET); reg = reg|0x80; uint8_t answer; HAL_SPI_Transmit(&hspi2, ®, 1, HAL_MAX_DELAY); HAL_SPI_Receive(&hspi2, &answer, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(NSS_PORT, NSS_PIN, GPIO_PIN_SET); return answer; } uint8_t BME680_sread8(uint8_t reg){ HAL_GPIO_WritePin(NSS_PORT, NSS_PIN, GPIO_PIN_RESET); reg = reg|0x80; uint8_t answer; HAL_SPI_TransmitReceive(&hspi2, ®, &answer, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(NSS_PORT, NSS_PIN, GPIO_PIN_SET); return answer; } bool BME680_begin(){ BME680_write8(RESET_REG, SOFT_RESET_MODE); HAL_Delay(500); uint8_t val; val = BME680_read8(ID_REG); if(val==0x61){ return true; } return false; } uint8_t BME680_sample(){ par_g[0] = BME680_read8(0xED); par_g[1] = BME680_read8(0xEC); par_g[1] <<= 8; par_g[1] += BME680_read8(0xEB); par_g[2] = BME680_read8(0xEE); res_heat_range = BME680_read8(0x02); res_heat_range <<=2; res_heat_range >>=6; res_heat_val = (int8_t)BME680_read8(0xEE); double var[5]; var[0] = ((double)par_g[0]/16.0)+49.0; var[1] = (((double)par_g[1]/32768.0)*0.0005)+0.00235; var[2] = (double)par_g[2]/1024.0; var[3] = var[0]*(1.0+(var[1]*(double)300)); var[4] = var[3] + (var[2]*18.0); uint8_t res_heat_x = (uint8_t)(3.4*((var[4]*(4.0/(4.0+(double)res_heat_range))*(1.0/(1.0+((double)res_heat_val*0.002))))-25)); BME680_write8(GAS_WAIT0_REG, 0x87); BME680_write8(RES_HEAT0_REG, res_heat_x); BME680_write8(CTRL_GAS1_REG, 0x10); BME680_write8(CTRL_GAS0_REG, 0x00); BME680_write8(CTRL_HUM_REG, 0x01); BME680_write8(CONFIG_REG, 0x08); BME680_write8(CTRL_MEAS_REG, 0x55); res_heat_x = BME680_read8(GAS_WAIT0_REG); return res_heat_x; } uint8_t BME680_readgas(){ uint8_t valid = BME680_read8(GAS_R_LSB_REG); return valid; }