97 lines
2.9 KiB
C
97 lines
2.9 KiB
C
/**
|
|
* @file bsp_bmp280.c
|
|
* @brief BMP280 sensor driver implementation (BSP layer)
|
|
*/
|
|
|
|
#include "bsp_bmp280.h"
|
|
#include "driver_bmp280_interface.h"
|
|
|
|
/* Private variables ----------------------------------------------------------*/
|
|
static bmp280_handle_t gs_bmp280_handle;
|
|
static uint8_t gs_bmp280_inited = 0;
|
|
|
|
/**
|
|
* @brief Initialize BMP280 sensor
|
|
* @retval 0: success
|
|
* other: error code
|
|
*/
|
|
uint8_t BSP_BMP280_Init(void)
|
|
{
|
|
uint8_t res;
|
|
|
|
/* Initialize handle */
|
|
DRIVER_BMP280_LINK_INIT(&gs_bmp280_handle, bmp280_handle_t);
|
|
|
|
/* Link interface functions */
|
|
DRIVER_BMP280_LINK_IIC_INIT(&gs_bmp280_handle, bmp280_interface_iic_init);
|
|
DRIVER_BMP280_LINK_IIC_DEINIT(&gs_bmp280_handle, bmp280_interface_iic_deinit);
|
|
DRIVER_BMP280_LINK_IIC_READ(&gs_bmp280_handle, bmp280_interface_iic_read);
|
|
DRIVER_BMP280_LINK_IIC_WRITE(&gs_bmp280_handle, bmp280_interface_iic_write);
|
|
DRIVER_BMP280_LINK_SPI_INIT(&gs_bmp280_handle, bmp280_interface_spi_init);
|
|
DRIVER_BMP280_LINK_SPI_DEINIT(&gs_bmp280_handle, bmp280_interface_spi_deinit);
|
|
DRIVER_BMP280_LINK_SPI_READ(&gs_bmp280_handle, bmp280_interface_spi_read);
|
|
DRIVER_BMP280_LINK_SPI_WRITE(&gs_bmp280_handle, bmp280_interface_spi_write);
|
|
DRIVER_BMP280_LINK_DELAY_MS(&gs_bmp280_handle, bmp280_interface_delay_ms);
|
|
DRIVER_BMP280_LINK_DEBUG_PRINT(&gs_bmp280_handle, bmp280_interface_debug_print);
|
|
|
|
/* Set I2C interface */
|
|
bmp280_set_interface(&gs_bmp280_handle, BMP280_INTERFACE_IIC);
|
|
|
|
/* Set I2C address (SDO pin grounded: 0x76) */
|
|
bmp280_set_addr_pin(&gs_bmp280_handle, BMP280_ADDRESS_ADO_LOW);
|
|
|
|
/* Initialize BMP280 */
|
|
res = bmp280_init(&gs_bmp280_handle);
|
|
if (res != 0)
|
|
{
|
|
gs_bmp280_inited = 0;
|
|
return res;
|
|
}
|
|
|
|
/* Configure sensor */
|
|
bmp280_set_temperatue_oversampling(&gs_bmp280_handle, BMP280_OVERSAMPLING_x2);
|
|
bmp280_set_pressure_oversampling(&gs_bmp280_handle, BMP280_OVERSAMPLING_x2);
|
|
bmp280_set_filter(&gs_bmp280_handle, BMP280_FILTER_COEFF_16);
|
|
bmp280_set_standby_time(&gs_bmp280_handle, BMP280_STANDBY_TIME_500_MS);
|
|
bmp280_set_mode(&gs_bmp280_handle, BMP280_MODE_NORMAL);
|
|
|
|
gs_bmp280_inited = 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Read temperature and pressure data
|
|
* @param data: pointer to store sensor data
|
|
* @retval 0: success
|
|
* other: error code
|
|
*/
|
|
uint8_t BSP_BMP280_Read(bsp_bmp280_data_t *data)
|
|
{
|
|
uint8_t res;
|
|
uint32_t temp_raw;
|
|
uint32_t press_raw;
|
|
|
|
if (gs_bmp280_inited == 0)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (data == NULL)
|
|
{
|
|
return 2;
|
|
}
|
|
|
|
res = bmp280_read_temperature_pressure(&gs_bmp280_handle,
|
|
&temp_raw, &data->temperature,
|
|
&press_raw, &data->pressure);
|
|
if (res != 0)
|
|
{
|
|
data->is_ready = 0;
|
|
return res;
|
|
}
|
|
|
|
data->is_ready = 1;
|
|
return 0;
|
|
}
|