初级会员

- 积分
- 152
- 金钱
- 152
- 注册时间
- 2019-4-25
- 在线时间
- 47 小时
|
10金钱
本帖最后由 crx156 于 2021-4-14 20:41 编辑
本人最近在调试H7的SPI_DMA,配置通过CubeMx直接生成,DMA模式设置为NORMAL,通过外部中断触发DMA的传输,然而在调试中碰到一些问题,苦思无果,论坛中也没找到类似经历的帖子,所以在此发布求助帖,现将设计思路和遇到的问题以及程序一一罗列如下所示,请大牛指正解惑,不胜感激!
程序设计思路大致如下:
定时器控制外设AD7606采样频率,通过外部中断感知AD7606是否数据转换完成,完成后在外部中断函数中通过 HAL_SPI_Transmit_DMA(&hspi2,Tx_Buffer,16); 和 HAL_SPI_Receive_DMA(&hspi2,Rx_Buffer,16);这两个库函数读取AD数据(SPI传输数据收发要同步,所以同时开了收发DMA), SPI设置为全双工通信主机,DMA数据流分别为接收DMA1_Stream0,发送DMA1_Stream1(之前用的是3和4,但不知为何中断标志位都无法清除,换成0和1就好了,没有深究),模式均为NORMAL模式。配置如下所示,由CubeMx直接生成:
现在的问题是,第一次进外部中断调用HAL_SPI_Transmit_DMA(&hspi2,Tx_Buffer,16); 和 HAL_SPI_Receive_DMA(&hspi2,Rx_Buffer,16);这两个函数,发送接收中断均可以进入,但是发送中断寄存器中出现FIFO错误中断,但是配置中已经关闭了FIFO模式,接收中没有,中断处理完清除标志位后第二次外部中断调用HAL_SPI_Transmit_DMA(&hspi2,Tx_Buffer,16); 和 HAL_SPI_Receive_DMA(&hspi2,Rx_Buffer,16);时发现DMA中断进不去了,单步调试发现好像这两个函数直接被略过了,第二步直接跳到函数最末尾跳出,中断处理函数中只进行了清除标志位操作,之前搜索的帖子资料中说DMA在NORMAL模式下要在中断中重启,重设传输数量,这些操作在中断中加上后也无效,且我在HAL_SPI_Transmit_DMA()函数中发现好像有相应的操作。
这是中断处理函数。
再有一个,虽然只进了一次中断,那么也是有一次数据传输的过程的,但是收到的数据全是0,也就是接收错误,SCB_EnableDCache()这句话已经屏蔽掉了。
现在的我不明白的问题大致有以下几点:
1.DMA在NORMAL模式下为什么中断只进一次;
2.在关闭FIFO模式的情况下为什么发送FEIF错误中断标志位会置1,这是否是影响传输的原因;
3.在关闭SCB_EnableDCache()的情况下为什么接收不到正确的数据;
第一次发帖子,写的有点多有点绕,希望大佬可以帮我解惑,我被这东西卡了好久了。
|
|