Having trouble with integrating BMP390 on an STM32 board. My issue is as follows:
- Attempting to interface STM32F103 to BMP390 via I2C
- BMP390 is wired per attached schematic
- I am using the BMP390 c library provided by Bosch
- I am able to run initialization functions without issue (bmp3_interface_init, bmp3_set_sensor_settings, bmp3_set_op_mode)
- ISSUE: bmp3_get_sensor data is not working; the returned integer indicates BMP3_W_MIN_TEMP or BMP3_W_MIN_PRES warnings
- I am using a wrapper written by BSTRobin
Attached the relevant portion of code. Open to any suggestions. Thanks!
// SENSOR CODE BEGIN
int8_t rslt = 0;
#if defined(READ_SENSOR_DATA)
/* Iteration count to run example code */
#define ITERATION UINT8_C(100)
uint8_t loop = 0;
uint8_t settings_sel;
struct bmp3_dev dev;
struct bmp3_data data = { 0 };
struct bmp3_settings settings = { 0 };
struct bmp3_status status = { { 0 } };
char output_msg[256];
/* Interface reference is given as a parameter
* For I2C : BMP3_I2C_INTF
* For SPI : BMP3_SPI_INTF
*/
rslt = bmp3_interface_init(&dev, BMP3_I2C_INTF);
bmp3_check_rslt("bmp3_interface_init", rslt);
const char *error_msg = bmp3_get_rslt("bmp3_interface_init", rslt);
f_puts(error_msg, &fil);
rslt = bmp3_init(&dev);
bmp3_check_rslt("bmp3_init", rslt);
// settings.int_settings.drdy_en = BMP3_ENABLE;
settings.press_en = BMP3_ENABLE;
settings.temp_en = BMP3_ENABLE;
settings.odr_filter.press_os = BMP3_OVERSAMPLING_2X;
settings.odr_filter.temp_os = BMP3_OVERSAMPLING_2X;
settings.odr_filter.odr = BMP3_ODR_100_HZ;
settings_sel = BMP3_SEL_PRESS_EN | BMP3_SEL_TEMP_EN | BMP3_SEL_PRESS_OS | BMP3_SEL_TEMP_OS | BMP3_SEL_ODR |
BMP3_SEL_DRDY_EN;
rslt = bmp3_set_sensor_settings(settings_sel, &settings, &dev);
bmp3_check_rslt("bmp3_set_sensor_settings", rslt);
settings.op_mode = BMP3_MODE_NORMAL;
rslt = bmp3_set_op_mode(&settings, &dev);
bmp3_check_rslt("bmp3_set_op_mode", rslt);
while (loop < ITERATION)
{
rslt = bmp3_get_status(&status, &dev);
// Debug begin
char bugStr[5]; // Buffer to hold the string representation of the integer
sprintf(bugStr, "%d", rslt); // Convert the integer to a string
f_puts(bugStr, &fil);
// Debug end
bmp3_check_rslt("bmp3_get_status", rslt);
error_msg = bmp3_get_rslt("bmp3_interface_init", rslt);
f_puts(error_msg, &fil);
//Debug begin
rslt = bmp3_get_sensor_data(BMP3_PRESS_TEMP, &data, &dev);
sprintf(bugStr, "%d", rslt); // Convert the integer to a string
f_puts(bugStr, &fil);
f_close(&fil);
//Debug end
/* Read temperature and pressure data iteratively based on data ready interrupt */
if ((rslt == BMP3_OK) && (status.intr.drdy == BMP3_ENABLE))
{
/*
* First parameter indicates the type of data to be read
* BMP3_PRESS_TEMP : To read pressure and temperature data
* BMP3_TEMP : To read only temperature data
* BMP3_PRESS : To read only pressure data
*/
rslt = bmp3_get_sensor_data(BMP3_PRESS_TEMP, &data, &dev);
bmp3_check_rslt("bmp3_get_sensor_data", rslt);
/* NOTE : Read status register again to clear data ready interrupt status */
rslt = bmp3_get_status(&status, &dev);
bmp3_check_rslt("bmp3_get_status", rslt);
#ifdef BMP3_FLOAT_COMPENSATION
// output_msg = PSTRING("Data[%d] T: %.2f deg C, P: %.2f Pa\n", loop, (data.temperature), (data.pressure));
// generate_string(output_msg, sizeof(output_msg), "Data[%d] T: %.2f deg C, P: %.2f Pa\n", loop, data.temperature, data.pressure);
doubleToString(data.temperature, output_msg, sizeof(output_msg), 4);
f_puts(output_msg, &fil);
#else
// f_puts(PSTRING("Data[] T: %ld deg C, P: %lu Pa\n", (long int)(int32_t)(data.temperature / 100),
// (long unsigned int)(uint32_t)(data.pressure / 100)), &fil);
#endif
loop = loop + 1;
}
}
f_puts("CLOSING FILE\n", &fil);
HAL_Delay(500);
f_close(&fil);
#endif
// SENSOR CODE END