硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1569|回复: 17
收起左侧

[SPI/QSPI] H743的SPI使用DMA模式的话,DMA通道的选择有要求吗?

[复制链接]

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2022-11-4 12:31:49 | 显示全部楼层 |阅读模式
最近在使用SPI来传输数据,工程通过cubeMX配置,测试过SPI用轮询模式可以正常工作,但是调整到使用DMA模式则无法工作,接收到的都是0;
工程描述如下:有一个40HZ的外部中断,每次中断到来都会让SPI2去获取固定长度的数据,轮询模式下获取一次耗时约16ms。


SPI和DMA配置如下图:
微信截图_20221104122643.png
微信截图_20221104122713.png
微信截图_20221104122726.png

请教一下,SPIDMA无法工作的原因是什么?是DMA通道选择错误吗?还是其他问题?



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-11-4 12:59:05 | 显示全部楼层
H7的话,主要是两个地方:
1. 你看下你生成工程的主RAM空间是不是选择到TCM上了,即0x2000 0000开始的地址。
2.  如果选择的不是TCM,注意Cache问题,简单省事些,直接配置相应的RAM空间关闭读写Cache即可

回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-4 15:29:36 | 显示全部楼层
eric2013 发表于 2022-11-4 12:59
H7的话,主要是两个地方:
1. 你看下你生成工程的主RAM空间是不是选择到TCM上了,即0x2000 0000开始的地址 ...

回复硬汉哥:
1.工程内存只勾选了IRAM2:0x24000000,我理解是工程只用了AXI RAM,SRAM1/2/3/4均没使用,这样理解对吗?
2.工程只开启了I-CACHE,D-CACHE关闭了
3.SPI的发送和接收缓存我都通过内存管理函数,把数组定义在了AXI RAM上。
4.工程启用了FreeRTOS,不知道有无影响?采用heap4内存管理文件.
5.工程未使用MPU.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-11-4 16:21:30 | 显示全部楼层
852050675 发表于 2022-11-4 15:29
回复硬汉哥:
1.工程内存只勾选了IRAM2:0x24000000,我理解是工程只用了AXI RAM,SRAM1/2/3/4均没使用 ...

将DCache打开,然后此贴配置为最低性能,即关闭读写Cache。

使用STM32H7的AXI SRAM,SRAM1到SRAM4对应的Cache最高性能和最低性能配置
https://www.armbbs.cn/forum.php?mod=viewthread&tid=99322
还是不行的话,分享你的工程到百度云,我看下。
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-4 16:31:09 | 显示全部楼层
eric2013 发表于 2022-11-4 16:21
将DCache打开,然后此贴配置为最低性能,即关闭读写Cache。

使用STM32H7的AXI SRAM,SRAM1到SRAM4对应 ...

好的,我尝试一下。

此外,我的SPIDMA配置有问题吗?因为我看您例程里面双机DMA通信用的是SPI1的DMA2的数据流2和3,我工程所使用的是SPI2,选DMA有讲究吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-11-4 17:07:54 | 显示全部楼层
852050675 发表于 2022-11-4 16:31
好的,我尝试一下。

此外,我的SPIDMA配置有问题吗?因为我看您例程里面双机DMA通信用的是SPI1的DMA2 ...

这个随意使用,H7系列有个DMAMUX,所以可以随意选择。

不像F4,F1系列,只能使用指定的
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-4 19:12:19 | 显示全部楼层
eric2013 发表于 2022-11-4 17:07
这个随意使用,H7系列有个DMAMUX,所以可以随意选择。

不像F4,F1系列,只能使用指定的

硬汉哥,我按照你的提示,尝试之后仍然无果,这是我的工程文件,希望您能指点我一下,谢谢!

工程描述:用了FreeRTOS,想要复现的效果是硬汉哥h7教程里面的双机SPIDMA通信实验,不过我没有两个H7,所以采取的是自发自收的方法,也就是MOSI和MISO连在一起。尝试过直接把硬汉的例程烧进板子里面,是可以成功自发自收的;
                但是自己尝试用cubeMX来生成工程进行复现却未能成功;

链接:https://pan.baidu.com/s/1t5KTrxX898qRAi-7aWxAqA?pwd=h743
提取码:h743


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-11-5 09:57:23 | 显示全部楼层
852050675 发表于 2022-11-4 19:12
硬汉哥,我按照你的提示,尝试之后仍然无果,这是我的工程文件,希望您能指点我一下,谢谢!

工程描述 ...

用我的例子DMA方式自收发可以吗?
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-5 12:50:28 | 显示全部楼层
eric2013 发表于 2022-11-5 09:57
用我的例子DMA方式自收发可以吗?

可以的,我尝试过可以自发自收
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-5 15:01:06 | 显示全部楼层
eric2013 发表于 2022-11-5 09:57
用我的例子DMA方式自收发可以吗?

硬汉哥,可以指点一下我工程出错的地方吗,不尽感谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-11-6 09:57:20 | 显示全部楼层
852050675 发表于 2022-11-5 15:01
硬汉哥,可以指点一下我工程出错的地方吗,不尽感谢!

这种情况只能你自己手动对比下了,调试状态,启动转换前看下SPI寄存器组件,看看差异

我们帮你查,效率太低了。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2022-11-7 13:48:14 | 显示全部楼层
可以先参考我这个,把裸机的搞起来之后再加 RTOS https://club.rt-thread.org/ask/article/c91146d03f664cf5.html
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-7 16:15:01 | 显示全部楼层
王海靖 发表于 2022-11-7 13:48
可以先参考我这个,把裸机的搞起来之后再加 RTOS https://club.rt-thread.org/ask/article/c91146d03f664cf ...

您好,谢谢您的帮助。不过我已经把双机SPIDMA通信实验成功,现在遇到的新问题是,把SPIDMA用于实际的环境中(与真实的SPI外设进行通信)的时候没有办法实现,读回来的都是0.我现在在考虑的在传输完成中断的回调函数里面添加标志位是否必要?
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-7 16:16:33 | 显示全部楼层
eric2013 发表于 2022-11-6 09:57
这种情况只能你自己手动对比下了,调试状态,启动转换前看下SPI寄存器组件,看看差异

我们帮你查,效 ...

硬汉哥,双机DMA通信我已实现,但是在现实的使用中(与真实的SPI外设进行通信),读回来的都是0.我在想的是在传输完成回调里面添加传输状态标志位是不是必须的?
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-7 16:24:23 | 显示全部楼层
eric2013 发表于 2022-11-6 09:57
这种情况只能你自己手动对比下了,调试状态,启动转换前看下SPI寄存器组件,看看差异

我们帮你查,效 ...

另外,我还有2个没搞懂的问题。第一,像下面图片箭头所示,重新使能一下是指再次调用HAL_SPI_TransmitReceive_DMA()这个函数吗?还是说DMA需要重新配置?
image.png
第二,这个“保证外设数据宽度与内存数据宽度是一样的”该如何理解?我的理解是,我TXBUF和RXBUF都是uint8_t类型的,然后SPI的Data Size也是配置成了8bit,DMA里面设置的Data Width也是设置成了Byte,这样算是“外设数据宽度与内存数据宽度是一样的”了吗?

image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-11-8 09:30:33 | 显示全部楼层
852050675 发表于 2022-11-7 16:24
另外,我还有2个没搞懂的问题。第一,像下面图片箭头所示,重新使能一下是指再次调用HAL_SPI_TransmitRec ...

1、直接调用,不用重新配置。
2、对。
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-8 10:40:00 | 显示全部楼层
eric2013 发表于 2022-11-8 09:30
1、直接调用,不用重新配置。
2、对。

感谢硬汉哥的回答,还有一个问题就是在传输完成回调里面添加传输状态标志位是不是必须的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-11-8 11:12:53 | 显示全部楼层
852050675 发表于 2022-11-8 10:40
感谢硬汉哥的回答,还有一个问题就是在传输完成回调里面添加传输状态标志位是不是必须的?

不是必须的,主要是方便处理。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 22:47 , Processed in 0.237973 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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