Files
3d_contorl/Core/Bsp/bsp_bmp280.c
2026-03-21 01:49:41 +08:00

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