12-22-2020 10:29 AM
Hello, I am using the BMP388 sensor. The temperature value is OK. , but pressure value is wrong, it is below 900 hPa.I use the BMP3-Sensor-API V2.0.1 code on the gitub website.
https://github.com/BoschSensortec/BMP3-Sensor-API
The experimental results are as follows.
temperature : 2731.000000
pressure : 7831998.000000
The spi communication is working well as the chip ID number is correctly get. My code is below , where is wrong?
/* SPI2 init function */
void MX_SPI2_Init(void)
{
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 0x0;
hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
hspi2.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hspi2.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
hspi2.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi2.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi2.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
hspi2.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
hspi2.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
hspi2.Init.IOSwap = SPI_IO_SWAP_DISABLE;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}
}
uint8_t stm32_spi_writeBMP388(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr)
{
reg_addr &= 0x7f;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi2, ®_addr, 1, 50);
while(HAL_SPI_GetState(&hspi2) == HAL_SPI_STATE_BUSY);
HAL_SPI_Transmit(&hspi2, (uint8_t *)reg_data, length, 50);
while(HAL_SPI_GetState(&hspi2) == HAL_SPI_STATE_BUSY);
HAL_SPI_Transmit(&hspi2, ®_addr, 1, 50);
while(HAL_SPI_GetState(&hspi2) == HAL_SPI_STATE_BUSY);
HAL_SPI_Transmit(&hspi2, (uint8_t *)reg_data, length, 50);
while(HAL_SPI_GetState(&hspi2) == HAL_SPI_STATE_BUSY);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
return 0;
}
uint8_t stm32_spi_readBMP388(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr)
{
reg_addr |= 0x80;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
delay_ms(5);
// HAL_SPI_TransmitReceive(&hspi2, ®_addr, (uint8_t*)reg_data, length, 0xffff);
HAL_SPI_Transmit(&hspi2, ®_addr, 1, 50);
while(HAL_SPI_GetState(&hspi2) == HAL_SPI_STATE_BUSY);
HAL_SPI_Receive(&hspi2, (uint8_t *)reg_data, length, 50);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
return 0;
}
int8_t user_spi_readBMP388(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr)
{
stm32_spi_readBMP388(reg_addr, reg_data, length, intf_ptr);
return 0;
}
int8_t user_spi_writeBMP388(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr)
{
stm32_spi_writeBMP388(reg_addr, reg_data, length, intf_ptr);
return 0;
}
void user_delayBMP388(uint32_t period_us, void *intf_ptr)
{
delay_us(period_us);
}
void BMP388Init(void)
{
bmp388.intf = BMP3_SPI_INTF;
bmp388.write = user_spi_writeBMP388;
bmp388.read = user_spi_readBMP388;
bmp388.delay_us = user_delayBMP388;
bmp388.intf_ptr = &bmp388_addr;
bmp388.dummy_byte = 1;
}
Solved! Go to Solution.
12-23-2020 10:08 AM
Hi Sir:
If possible, please offer us the raw data and trim values, first we will confirm your results by my STM32F4 platform.
Thank you.
12-29-2020 02:07 PM
Thank you for your reply and help.I've run the same code on different boards.The experimental results confirmed that it was a hardware problem.
Thanks for your help!
Good luck!