OpenEdv-开源电子网

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

请问cube配置成SPI+DMA该如何配置,如何使用?

[复制链接]

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
发表于 2020-8-7 12:02:18 | 显示全部楼层 |阅读模式
1金钱
我在SPI的选项中增加了DMA功能,生成的文件就在spi.c中增加了初始化DMA,dma.c中设置了dma通道的优先级,it.c文件中增加了通道的中断,那么是如何使用HAL_SPI_TransmitReceive_DMA()该函数实现SPI的读写呢?   我之前配置为硬件SPI的时候,是直接调用 HAL_SPI_TransmitReceive()该函数来进行读写数据的
请问SPI+DMA该如何使用呢?  

最佳答案

查看完整内容[请看2#楼]

问题已解决,见:http://www.openedv.com/forum.php?mod=viewthread&tid=331756
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-8-7 12:02:19 | 显示全部楼层
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-8-7 16:28:49 | 显示全部楼层
我简单看了下源码,就把spi句柄,发送数组,接收数组,字节数传递给HAL_SPI_TransmitReceive_DMA就行了啊。
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2020-8-7 18:59:42 | 显示全部楼层
你以前调用 HAL_SPI_TransmitReceive() 的地方,都换成 HAL_SPI_TransmitReceive_DMA(),参数看情况写。
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-8-10 09:30:22 | 显示全部楼层
弦子的弦 发表于 2020-8-7 18:59
你以前调用 HAL_SPI_TransmitReceive() 的地方,都换成 HAL_SPI_TransmitReceive_DMA(),参数看情况写 ...

我SPI+DMA测试的时候 软件拉低 拉高片选时,读写的数据与CS的引脚错开了。请问有遇到这种现象吗?
2.png
1.png
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-8-10 09:30:53 | 显示全部楼层
a5820736 发表于 2020-8-7 16:28
我简单看了下源码,就把spi句柄,发送数组,接收数组,字节数传递给HAL_SPI_TransmitReceive_DMA就行了啊。

我SPI+DMA测试的时候 软件拉低 拉高片选时,读写的数据与CS的引脚错开了。请问有遇到这种现象吗?
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-8-10 11:34:16 | 显示全部楼层
本帖最后由 chenyuan 于 2020-8-10 16:07 编辑

在调用spi_dma的读写函数后,增加一个等待,此时数据在CS选中范围内,如图3 图4,但是我在之前使用硬件SPI的位置HAL_SPI_TransmitReceive() 换成HAL_SPI_TransmitReceive_DMA(),跑着会死机,后面发现是我在其他中断中对RF芯片进行了SPI读写操作,然后rf芯片死机了,但是我外部中断是15,这个dma通道的中断是3,很奇怪  我后面还试了下硬件控制CS片选,但是他每次写完一个字节就拉高了,这样的话,对rf芯片写入多个数据,都没写进去,请问有什么办法可以解决这个问题呢?想实现成一个这样的效果,如图5
主要是这两个问题,请大佬指教:
1.在外部中断中调用SPI的读写,造成RF芯片死机,但是中断优先级又比SPI_DMA通道的优先级低??
2.有什么方法可以快速拉低CS并且开始SPI的读写,达到图5的效果呢?
谢谢啦!
5.png
3.png
4.png
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2020-8-10 15:23:39 | 显示全部楼层
没有太看懂楼主的描述,不过不知道你注意没有,SPI所谓的使能脚比较特殊,他不单单表示低电平就使能,高电平就使能,而是低电平表示一个数据(可能是4bit,也可能是8bit)的开始,高电平表示这个数据的结束,这样spi接收端就知道接收到一个数据了。所以当你一次性传输多个数据的时候,正常情况下使能脚也是有多个电平跳变才是。这是我的理解,楼主可以验证下。
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-8-10 15:53:54 | 显示全部楼层
本帖最后由 chenyuan 于 2020-8-10 15:58 编辑
弦子的弦 发表于 2020-8-10 15:23
没有太看懂楼主的描述,不过不知道你注意没有,SPI所谓的使能脚比较特殊,他不单单表示低电平就使 ...

我试了下 一次性传输2个字节的时候,数据在CS片选拉低范围内,但是这个函数不是有传输大小的参数吗?照理来说应该是可以读写多个数据的呀。我对于SPI的理解是这样的,当我通过硬件来控制片选脚时,他是每一个字节就会进行跳变,那么写入多个数据的时候,对于外设来说写进去的那都是寄存器地址了:
1.选中外设
2.写入寄存器地址
3.往该寄存器地址写入数据
4.写完数据后,不选中外设
那么在片选选中期间的指令和数据是有效的,如果每个字节都片选都进行跳变的话,外设就将写入的这个字节理解成了“指令”了我今天试过这个硬件控制片选,看时序图发现,MOSI是没有什么问题,只是每个字节,片选脚都会进行跳变;但是MISO和我之前正常通讯返回的数据不对,所以我就有了上面这个理解
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-8-11 09:07:20 | 显示全部楼层
顶....................
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-8-12 02:22:10 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 00:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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