[STM32F4] SPI的DMA传输函数(HAL_SPI_Transmit_DMA())时出错

[复制链接]
 楼主| 内核558 发表于 2025-7-23 22:55 | 显示全部楼层 |阅读模式
本帖最后由 内核558 于 2025-7-30 21:01 编辑


在使用SPI的DMA传输函数(HAL_SPI_Transmit_DMA())时需要注意什么?我正在用STM32F405的SPI接口控制一个屏幕。我试过"HAL_SPI_Transmit()"和"HAL_SPI_Transmit_IT()",都能正常工作。但当我尝试"HAL_SPI_Transmit_DMA()"时却不行。于是我写了以下代码来比较UART和SPI的DMA传输功能,发现"hspix.State"始终是"HAL_SPI_STATE_BUSY_TX",而UART却没有任何问题。
有人知道我的代码哪里出错了吗?或者使用"HAL_SPI_Transmit_DMA()"有什么需要特别注意的地方吗?
char debugInfo[] = "Debug Info\r\n";  while (1)  {#if 1    // testing SPI transmitting function in DMA mode    HAL_SPI_Transmit_DMA(&hspi4, (uint8_t *)debugInfo, strlen(debugInfo) + 1);    while(hspi4.State != HAL_SPI_STATE_READY);    // program will stuck here#else    // testing UART transmitting function in DMA mode    HAL_UART_Transmit_DMA(&huart1, (uint8_t *)debugInfo, strlen(debugInfo) + 1);    while(huart1.gState != HAL_UART_STATE_READY || huart1.RxState != HAL_UART_STATE_READY);    // program won't stuck#endif     HAL_Delay(500);  }
公羊子丹 发表于 2025-7-24 07:18 | 显示全部楼层
你这 SPI 用 DMA 是不是忘了先把 NVIC 中断优先级配好了?
周半梅 发表于 2025-7-24 07:19 | 显示全部楼层
我以前遇到过,SPI 的 DMA 如果没开 DMA 的时钟或者通道搞错了,也会一直 busy。
帛灿灿 发表于 2025-7-24 07:20 | 显示全部楼层
看下是不是 SPI 的 DMA 传输需要的回调函数你没实现?
童雨竹 发表于 2025-7-24 07:22 | 显示全部楼层
你这个 while 等待状态 READY,如果 DMA 出错或者没触发完成中断,就***卡住了。
万图 发表于 2025-7-24 07:25 | 显示全部楼层
试试先 HAL_SPI_Abort() 看能不能清掉 busy 状态,强行复位一下看看。
Wordsworth 发表于 2025-7-24 07:29 | 显示全部楼层
SPI 和 UART 的 DMA 用法有点差别,UART 有空闲中断,SPI 要靠传输完成回调。
Bblythe 发表于 2025-7-24 07:31 | 显示全部楼层
你在循环里一直 HAL_SPI_Transmit_DMA,会不会 DMA 还没完成又启动了新的?
Pulitzer 发表于 2025-7-24 07:32 | 显示全部楼层
用 DMA 的话,SPI 的 NSS 管脚和 DMA 缓冲区最好检查一下配置对不对。
Uriah 发表于 2025-7-24 07:33 | 显示全部楼层
你能把 HAL_SPI_TxCpltCallback 打印出来,看看到底进没进中断。
Clyde011 发表于 2025-7-24 07:34 | 显示全部楼层
我之前也踩过坑,最后发现是 SPI 的 DMA 中断优先级被别的高优先级中断抢占了,搞半天没触发。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

37

帖子

0

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