/** * @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; }