12-22-2020 10:08 AM
Hello, I am using the BMP388 sensor to read the temperature and pressure data.The temperature value is displayed normally, but the corrected pressure value is wrong and below 900 hPa.I experimented with the BMP3-Sensor-API V2.0.1 code on the gitub website.Reading the chip ID number is relatively normal, but reading back the pressure value is wrong.My SPI configuration is as follows.
/* 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;
}
The experimental results are as follows. I don't know why the pressure value is wrong. Thank you for your answer.
temperature : 2731.000000
pressure : 7831998.000000
12-22-2020 10:26 AM
Hello yuxinmiao,
You could set a breakpoint before reading data, capture SPI waveform and check if low layer communication is ok first.