[其他ST产品] STM2 SPI状态机HAL_BUSY

[复制链接]
 楼主| 柴库柴库 发表于 2025-6-13 22:26 | 显示全部楼层 |阅读模式
看到SPI传输/接收有不同的状态。
使用HAL_SPI_Transmit_ReceiveDMA()时有4种不同的状态
如果收到的状态为HAL_忙碌、HAL_ERROR、HAL_TIMEOUT,
接收到这些状态后下一步如何操作?

公羊子丹 发表于 2025-7-31 15:43 | 显示全部楼层
一般遇到 HAL_BUSY,我会等一等再重试,或者先调用 HAL_SPI_DeInit 然后重新 Init 一下 SPI。
周半梅 发表于 2025-7-31 15:48 | 显示全部楼层
HAL_ERROR 通常是配置问题,可能DMA参数没对上,先查查SPI、DMA初始化是不是一一对应。
帛灿灿 发表于 2025-7-31 15:49 | 显示全部楼层
如果你是连续发数据,HAL_BUSY 有可能是上次DMA还没跑完,建议用中断或回调机制等它完成。
童雨竹 发表于 2025-7-31 15:50 | 显示全部楼层
HAL_TIMEOUT 出现过一次是因为我传输长度太长了,但没等够时间,增大超时参数就好了。
万图 发表于 2025-7-31 15:51 | 显示全部楼层
HAL_BUSY 不建议强行中断,要么等,要么清状态,有时候 __HAL_LOCK() 和 __HAL_UNLOCK() 管得太死。
Wordsworth 发表于 2025-7-31 15:52 | 显示全部楼层
我建议你用 HAL_SPI_GetState() 看一下是不是卡在 HAL_SPI_STATE_BUSY_TX_RX 状态,确认到底哪里卡住了。
Bblythe 发表于 2025-7-31 15:52 | 显示全部楼层
我之前用 HAL_SPI_TransmitReceive_DMA 时是每次收完数据在回调函数里再开启下一次,这样就不会碰到 HAL_BUSY。
Pulitzer 发表于 2025-7-31 15:53 | 显示全部楼层
其实用 DMA 最好配合信号量或者事件组,等通知再发下一帧数据,忙碌状态自己就规避掉了。
Uriah 发表于 2025-7-31 15:54 | 显示全部楼层
有时候 HAL_BUSY 是中断优先级设置不对,DMA中断没法触发,SPI就一直卡住等不到完成。
Clyde011 发表于 2025-7-31 15:55 | 显示全部楼层
如果实在搞不定 HAL 的状态机,干脆直接用 LL 库重写 SPI 通信,状态你自己控制更清晰。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

68

帖子

0

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