首先祝福大家国庆节快乐
情况介绍:
我在使用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的值不就是一样么?
|