初级会员
- 积分
- 132
- 金钱
- 132
- 注册时间
- 2019-12-2
- 在线时间
- 27 小时
|
发表于 2024-9-2 17:34:05
|
显示全部楼层
遇到过相同问题,应该是上一次没传输完成(发送缓冲区非空),你再次触发传输就可能出现busy位异常。
恢复不了可以force reset spi,代码参考如下:
void spi_status_resume(SPI_HandleTypeDef *hspi)
{
if((hspi->Instance->SR & SPI_FLAG_TXE) == RESET)
{
//force reset
SPI_ERR("[SPI]force reset start SR: %08x\r\n", hspi->Instance->SR);
HAL_SPI_DeInit(&spihdl);
__HAL_RCC_SPI3_FORCE_RESET();
__HAL_RCC_SPI3_RELEASE_RESET();
HAL_SPI_Init(&spihdl);
SPI_ERR("[SPI]force reset finish SR: %08x\r\n", hspi->Instance->SR);
}
if((hspi->Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY)
{
/* Wait until TXE flag is set */
__IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);
do
{
if (count == 0U)
{
//force reset
SPI_ERR("[SPI]wait clear busy timeout, force reset SR: %08x\r\n", hspi->Instance->SR);
HAL_SPI_DeInit(&spihdl);
__HAL_RCC_SPI3_FORCE_RESET();
__HAL_RCC_SPI3_RELEASE_RESET();
HAL_SPI_Init(&spihdl);
SPI_ERR("[SPI]force reset finish SR: %08x\r\n", hspi->Instance->SR);
break;
}
count--;
} while ((hspi->Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY);
}
} |
|