[STM32H7] 用STM32H743 与 BMP280 传感器进行spi通信

[复制链接]
14|0
梧桐uuu 发表于 2026-9-5 13:44 | 显示全部楼层 |阅读模式


我用STM32H743 与 BMP280 传感器进行spi通信。首先是读取 DevID。通过写入 0xD0 然后读取一个字节。但读不到数据。
使用逻辑分析仪测量发现SPI 发送的字节延迟了大约信号半个周期。
我在 STM32H7 和分析仪上都设置了 CPOL=CPHA=0。如果我将一侧改为 CPOL=0 && CPHA=1,有时能得到预期的数据。

我的Nucleo-H743ZI2大部分代码是由 CubeMX 生成的。
如下:int main(void)
{
/* MCU Configuration--------------------------------------------------------*/
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART3_UART_Init();
MX_SPI2_Init();
printf("Start\n");
HAL_Delay(1000);
while (!((SPI2->SR)&SPI_SR_TXP)) {};
SPI2->CR2 |= (SPI_CR2_TSIZE & 2); // Config size 1
SPI2->CR1 |= SPI_CR1_SPE; //Enable SPI
SPI2->CR1 |= SPI_CR1_CSTART; //Start transaction
HAL_GPIO_WritePin(BMP_CS_GPIO_Port, BMP_CS_Pin, 0);
HAL_Delay(1);
printf("CS 0\n");
uint8_t temp = 0;
if(SPI2->SR & SPI_SR_TXP) // Enough space in FIFO
{
SPI2->TXDR = 0xd0 | 0x80;
while (!((SPI2->SR)&SPI_SR_TXP)) {};
SPI2->TXDR = 0xff;
printf("DR loaded 0x0d\n");
while (!((SPI2->SR)&SPI_SR_RXP)) {}; //Waiting for rcv in fifo
temp = SPI2->RXDR;
printf("Dummy 0x%02x\n", temp);
temp = SPI2->RXDR;
printf("Got 0x%02x\n", temp);
}
while(!(SPI2->SR & SPI_SR_EOT)){}; //Wait for end of transaction
printf("SR empty EOT flag\n");
SPI2->CR1 &= ~SPI_CR1_SPE; //Disable SPI
while (1)
{
}
}



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();
}
}


您需要登录后才可以回帖 登录 | 注册

本版积分规则

198

主题

202

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0