BMP390 STM32 Data Issue

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

Best reply by natjohnw

Issue solved. Was a fab issue -- the BMP390 worked on half the boards I had manufactured. Likely the pad size was too small for the board house tolerances.

View original
2 replies
Resolved