OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7992|回复: 9

STM32H743 SPI_DMA 中断问题

[复制链接]

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2019-4-25
在线时间
47 小时
发表于 2021-4-14 16:41:26 | 显示全部楼层 |阅读模式
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()的情况下为什么接收不到正确的数据;
第一次发帖子,写的有点多有点绕,希望大佬可以帮我解惑,我被这东西卡了好久了。

下载.png
下载 (5).png
下载 (4).png
下载 (3).png
下载 (1).png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3606
金钱
3606
注册时间
2019-8-14
在线时间
1052 小时
发表于 2021-4-14 17:27:06 | 显示全部楼层
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2019-4-25
在线时间
47 小时
 楼主| 发表于 2021-4-14 20:36:21 | 显示全部楼层
咦?怎么粘贴进去的图片没显示出来0.0
回复

使用道具 举报

3

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2021-1-30
在线时间
68 小时
发表于 2021-4-15 09:48:39 | 显示全部楼层
你的数据流和通道对了吗?
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2019-4-25
在线时间
47 小时
 楼主| 发表于 2021-4-15 14:55:43 | 显示全部楼层
mmd 发表于 2021-4-15 09:48
你的数据流和通道对了吗?

H7的DMA初始化结构体中没有定义通道,只有数据流,我之前看的F1,F4的例子中DMA结构体有通道和数据量、目标内存地址什么的,之前上百度看了看,说是H7比较自由,可以任意设置DMA请求。
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2019-4-25
在线时间
47 小时
 楼主| 发表于 2021-4-15 15:00:23 | 显示全部楼层
mmd 发表于 2021-4-15 09:48
你的数据流和通道对了吗?

而且DMA配置是通过CubeMx直接生成的,应该是对的
QQ图片20210415145925.png
回复

使用道具 举报

3

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2021-1-30
在线时间
68 小时
发表于 2021-4-15 18:00:06 | 显示全部楼层
crx156 发表于 2021-4-15 15:00
而且DMA配置是通过CubeMx直接生成的,应该是对的

老哥我没法帮你,我是用的库函数的,没用过HAL的,前几天也是卡这里的,刚调通由SPI2 DMA读写FLASH内的数据,主要传输方向,地址是否递增,字节数有没相等,还有先使能DMA,再使能SPI的DMA模式
回复

使用道具 举报

3

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2021-1-30
在线时间
68 小时
发表于 2021-4-15 18:02:35 | 显示全部楼层
crx156 发表于 2021-4-15 15:00
而且DMA配置是通过CubeMx直接生成的,应该是对的

你可以看看安富莱的例程,他那都是H7的板子和HAL的例程
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2019-4-25
在线时间
47 小时
 楼主| 发表于 2021-4-15 19:52:11 | 显示全部楼层
mmd 发表于 2021-4-15 18:02
你可以看看安富莱的例程,他那都是H7的板子和HAL的例程

好的!十分感谢
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-11-14
在线时间
6 小时
发表于 2022-5-6 15:18:39 | 显示全部楼层
mmd 发表于 2021-4-15 18:00
老哥我没法帮你,我是用的库函数的,没用过HAL的,前几天也是卡这里的,刚调通由SPI2 DMA读写FLASH内的数 ...

你的STM32H7  SPI +DMA   整好了吗?想你学习一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 18:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表