STM32
直播中

杨丽

8年用户 1399经验值
私信 关注
[问答]

用STM32F103ZET6作为主机和外设通信,将SPI速率从9MHz改成18MHz,DMA就一直停在while出不来怎么解决?

我现在用STM32F103ZET6作为主机和外设通信,采用SPI_DMA模式接收数据,将SPI速率从9MHz改成18MHz,DMA就一直停在while( !DMA_GetFlagStatus(DMA1_FLAG_TC4))出不来,如果不用DMA模式接收数据,将SPI速率从9MHz改成18MHz是可以的,所以怀疑是用来DMA才导致现在的问题,不知是否还有其他的可能性,谢谢!

回帖(2)

李泳瑜

2024-4-3 09:32:34
建议调试检查一下DMA是否有结果,比如接收数据内容,接收数据个数等信息来判读DMA是否启动工作了。 通常容易忽略DMA配置内存增加模式这一项。 手册上有吧配置的程序介绍,一共6步,逐步对照或许比较容易发现问题
举报

小香干

2024-4-3 15:43:50
问题的根本原因是DMA的传输速度没有跟上SPI的速率变化。通过增加DMA的传输速度,可以解决该问题。以下是一些可能的解决方法:

1. 增加DMA数据传输的速率:可以通过增加DMA的优先级、增加数据宽度或调整数据传输长度来提高DMA的传输速率。可以尝试将SPI的数据宽度设置为16位,并增加DMA的优先级。

2. 调整SPI的时钟极性和相位:SPI的时钟极性和相位在不同的外设上可能有不同的要求。检查外设的规格书,确保SPI的时钟极性和相位设置正确。

3. 调整SPI数据帧大小:根据SPI外设的规格书,将SPI数据帧大小设置为正确的大小。有些外设可能要求8位数据帧,而某些外设可能要求16位数据帧。

4. 修改DMA触发源:根据外设的要求,更改DMA触发源。确保DMA触发源与外设的传输方式匹配。

5. 检查硬件连接:检查SPI和DMA的硬件连接,确保连接正确且稳定。

如果以上方法都尝试过之后仍然无法解决问题,可能需要对代码进行进一步调试和优化。可以尝试使用逐步调试和代码性能分析来找出可能的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分