SPI的DMA传输函数(HAL_SPI_Transmit_DMA())时出错
本帖最后由 内核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);}
你这 SPI 用 DMA 是不是忘了先把 NVIC 中断优先级配好了? 我以前遇到过,SPI 的 DMA 如果没开 DMA 的时钟或者通道搞错了,也会一直 busy。 看下是不是 SPI 的 DMA 传输需要的回调函数你没实现? 你这个 while 等待状态 READY,如果 DMA 出错或者没触发完成中断,就***卡住了。 试试先 HAL_SPI_Abort() 看能不能清掉 busy 状态,强行复位一下看看。 SPI 和 UART 的 DMA 用法有点差别,UART 有空闲中断,SPI 要靠传输完成回调。 你在循环里一直 HAL_SPI_Transmit_DMA,会不会 DMA 还没完成又启动了新的? 用 DMA 的话,SPI 的 NSS 管脚和 DMA 缓冲区最好检查一下配置对不对。 你能把 HAL_SPI_TxCpltCallback 打印出来,看看到底进没进中断。 我之前也踩过坑,最后发现是 SPI 的 DMA 中断优先级被别的高优先级中断抢占了,搞半天没触发。
页:
[1]