Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions Core/Inc/bme280.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* bme280.h
*
* Created on: Jul. 23, 2022
* Author: bossm
*/

#ifndef INC_BME280_H_
#define INC_BME280_H_

#include "main.h"
#define MAX_RAW_HUM_BYTES 3
#define MAX_RAW_TEMP_BYTES 3
#define SPI_BUFF_LEN 5
#define DOUBLE_BYTE_LEN 2

const uint8_t ctrl_meas = 0x74;
const uint8_t ctrl_hum = 0x72;
const uint8_t config = 0x75;
const uint8_t status = 0xF3;
const uint8_t hum_msb = 0xFD;
const uint8_t temp_msb = 0xFA;
const uint8_t dig_h1_addr = 0xA1;
const uint8_t dig_h2_addr = 0xE1;
const uint8_t dig_h3_addr = 0xE3;
const uint8_t dig_h4_addr = 0xE4;
const uint8_t dig_h5_addr = 0xE5;
const uint8_t dig_h6_addr = 0xE7;
const uint8_t dig_t1_addr = 0x88;
const uint8_t dig_t2_addr = 0x8A;
const uint8_t dig_t3_addr = 0x8C;

typedef int32_t bme280_s32_t;
typedef uint32_t bme280_u32_t;
bme280_s32_t t_fine, adc_t, adc_h;
void bme280CompensateT(bme280_s32_t adc_t);
bme280_u32_t bme280CompensateH(bme280_s32_t adc_h);

uint8_t t1[DOUBLE_BYTE_LEN];
uint16_t dig_t1;
int8_t t2[DOUBLE_BYTE_LEN], t3[DOUBLE_BYTE_LEN], h2[DOUBLE_BYTE_LEN];
int16_t dig_t2, dig_t3, dig_h2, dig_h4, dig_h5, dig_h4_ls[DOUBLE_BYTE_LEN], dig_h5_ls[DOUBLE_BYTE_LEN];
unsigned char dig_h1, dig_h3, h6;
char dig_h6;

uint8_t spi_buff[SPI_BUFF_LEN];
uint8_t hum_osrs = 0x1; //enable humidity with x1 oversampling
uint8_t meas_val = 0x21; //set forced mode and turn off pressure
uint8_t filter_off = 0x0;
uint8_t hum_raw_val[MAX_RAW_HUM_BYTES];
uint8_t temp_raw_val[MAX_RAW_TEMP_BYTES];
HAL_StatusTypeDef ret;

#endif /* INC_BME280_H_ */
166 changes: 166 additions & 0 deletions Core/Src/bme280.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
/*
* bme280.c
*
* Created on: Jul. 23, 2022
* Author: bossm
*/

#include "bme280.h"
#include <string.h>

bme280_u32_t bme280(SPI_HandleTypeDef hspi2){
//select mode 0
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);

//write settings
HAL_SPI_Transmit(&hspi2, (uint8_t *)&ctrl_hum, 1, 100);
HAL_SPI_Transmit(&hspi2, (uint8_t *)&hum_osrs, 1, 100);
HAL_SPI_Transmit(&hspi2, (uint8_t *)&ctrl_meas, 1, 100);
HAL_SPI_Transmit(&hspi2, (uint8_t *)&meas_val, 1, 100);
HAL_SPI_Transmit(&hspi2, (uint8_t *)&config, 1, 100);
HAL_SPI_Transmit(&hspi2, (uint8_t *)&filter_off, 1, 100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);

memset(spi_buff, 0, sizeof(spi_buff));
spi_buff[0]=1;

//check status
while(spi_buff[0] & (1<<3)){ //bit masking need bit 3
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
HAL_SPI_Transmit(&hspi2, (uint8_t *)&status, 1, 100);
HAL_SPI_Receive(&hspi2, (uint8_t *)spi_buff, 1, 100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
}

//read hum data
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
HAL_SPI_Transmit(&hspi2, (uint8_t *)&hum_msb, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)hum_raw_val, 2, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)hum_raw_val, 2, 100);
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
adc_h = (hum_raw_val[1]>>8)|(hum_raw_val[0]);

//read temp data
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
HAL_SPI_Transmit(&hspi2, (uint8_t *)&temp_msb, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)temp_raw_val, 1, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)temp_raw_val, 1, 100);
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);

//correct temp data
adc_t = (temp_raw_val[2] >> 24)|(temp_raw_val[1] >> 21)|temp_raw_val[0];

//read data
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_t1_addr, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t1, 2, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t1, 2, 100);
}

dig_t1 = (t1[1] << 8) | t1[0];

HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_t2_addr, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t2, 2, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t2, 2, 100);
}

dig_t2 = (int)(t2[1] << 8) | (int) t2[0];

HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_t3_addr, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t3, 2, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t3, 2, 100);
}

dig_t3 = (int) ((t3[1] << 8) | t3[0]);

HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h1_addr, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_h1, 1, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_h1, 1, 100);
}

HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h2_addr, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)h2, 2, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)h2, 2, 100);
}

dig_h2 = (int) ((h2[1] << 8) | h2[0]);

HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h3_addr, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_h3, 1, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_h3, 1, 100);
}

HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h4_addr, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_h4_ls, 2, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_h4_ls, 2, 100);
}

dig_h4_ls[1] = dig_h4_ls[1] & 0xF;
dig_h4 = (int) (dig_h4_ls[0] | dig_h4_ls[1]);

HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h5_addr, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_h5_ls, 2, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_h5_ls, 2, 100);
}

dig_h5_ls[0] = (dig_h5_ls[0] & 0xF000) >> 12;
dig_h5_ls[1] = dig_h5_ls[1] << 8;
dig_h5 = (int) (dig_h5_ls[1] | dig_h5_ls[0]);

HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h6_addr, 1, 100);
ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&h6, 1, 100);
while(ret != HAL_OK){
ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&h6, 1, 100);
}

dig_h6 = (char) h6;

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);

return bme280CompensateH(adc_h);
}

// Returns temperature in DegC, resolution is 0.01 DegC. Output value of “5123” equals 51.23 DegC.
// t_fine carries fine temperature as global value
void bme280CompensateT(bme280_s32_t adc_t){
bme280_s32_t var1, var2;
var1 = ((((adc_t>>3) - ((bme280_s32_t)dig_t1<<1))) * ((bme280_s32_t)dig_t2)) >> 11;
var2 = (((((adc_t>>4) - ((bme280_s32_t)dig_t1)) * ((adc_t>>4) - ((bme280_s32_t)dig_t1))) >> 12) *
((bme280_s32_t)dig_t3)) >> 14;
t_fine = var1 + var2;
//T = (t_fine * 5 + 128) >> 8;
//return T;
}

// Returns humidity in %RH as unsigned 32 bit integer in Q22.10 format (22 integer and 10 fractional bits).
// Output value of “47445” represents 47445/1024 = 46.333 %RH
bme280_u32_t bme280CompensateH(bme280_s32_t adc_h){
bme280CompensateT(adc_t);
bme280_s32_t v_x1_u32r;
v_x1_u32r = (t_fine - ((bme280_s32_t)76800));
v_x1_u32r = (((((adc_h << 14) - (((bme280_s32_t)dig_h4) << 20) - (((bme280_s32_t)dig_h5) * v_x1_u32r)) +
((bme280_s32_t)16384)) >> 15) * (((((((v_x1_u32r * ((bme280_s32_t)dig_h6)) >> 10) * (((v_x1_u32r *
((bme280_s32_t)dig_h3)) >> 11) + ((bme280_s32_t)32768))) >> 10) + ((bme280_s32_t)2097152)) *
((bme280_s32_t)dig_h2) + 8192) >> 14));
v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((bme280_s32_t)dig_h1)) >> 4));
v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r);
v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);
return (bme280_u32_t)(v_x1_u32r>>12);
}
Loading