打印
[STM32F4]

STM32F407 系列使用SPI+DMA,全双工传输的问题

[复制链接]
1111|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
首先祝福大家国庆节快乐
情况介绍:
我在使用STM32F302C8T6(实际上和F407是一样的)的时候,需要SPI去无脑反复读取一个传感器的数据,每次2个字节,过程是发送0x0000,然后去读出2个字节的传感器信息,MCU和传感器就是1对1的传输。
因为这个过程需要一直重复的进行,所以我就想到了DMA来做,看了相关教程后发现大家都是用中断去做的,也就是SPI发送完成后进发送完成中断,用DMA把数据搬回来,当DMA把数据搬完后,又进SPI的接收完成中断,此时又用DMA把数据0x0000搬给SPI发送寄存器,如此循环,这样本来就涉及到CPU的干预,有了这个过程我还用什么DMA,直接在中断里面去写那个相关寄存器不就一样的么。

于是乎我用了一个简单粗暴的办法,就是开启DMA的2个循环模式 TX 和RX,无脑的往SPI的发送缓存里面写,同时也无脑的往SPI的接收缓存里面读,这是没有任何时序的,也就是说DMA在发送方面需要搬很多次数据才能让SPI成功发送一次,因为DMA搬砖速度太快了,同样的DMA在接收方面也需要搬砖很多次才能获取到数据的更新,一旦开启就会看到SPI发送总线繁忙标志。不过通过这样的设置,系统可以跑起来了,也实现了CPU不干预的情况下刷新了传感器的信息。


问题:
我想让DMA自动的去做这个搬运的工作,并且是有时序的,也就是DMA先发送完成后,DMA再去做接收的工作,在数据手册里面有如下描述


我请问下它这里说的DMA请求,是什么意思,在DMA配置为单次的情况下,它发了这个请求就会自动去再次触发DMA传输么? 我写代码试了,不行的。那么这个数据手册上面的描述,针对DMA的SPI操作是怎么个流程呢?是用SPI中断还是DMA传输完成中断?还是不用中断?我始终感觉用了中断 ,就是CPU干预了,何必用DMA,直接读取或者写入那个SPI数据寄存器DR的值不就是一样么?

使用特权

评论回复
沙发
squall001|  楼主 | 2020-10-7 01:45 | 只看该作者
顶一下

使用特权

评论回复
板凳
香水城| | 2020-10-9 11:09 | 只看该作者
这里的DMA请求 是指 SPI的收发事件,对应于TXE/RXNE置位动作。

使用特权

评论回复
地板
squall001|  楼主 | 2020-10-9 15:09 | 只看该作者
香水城 发表于 2020-10-9 11:09
这里的DMA请求 是指 SPI的收发事件,对应于TXE/RXNE置位动作。

请问,如果是SPI事件,那就是中断,那么就需要在中断里面去做操作了?

使用特权

评论回复
5
香水城| | 2020-10-10 11:13 | 只看该作者
squall001 发表于 2020-10-9 15:09
请问,如果是SPI事件,那就是中断,那么就需要在中断里面去做操作了?

不是。

SPI的事件作为DMA请求,并非要中断啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

14

帖子

0

粉丝