可以在STM32F3上使用DMA通过SPI传输无限数据吗?

时间:2019-12-18 17:29:29

标签: protocols stm32 radio dma electronics

我正在开发基于新协议的RF调制解调器,该调制解调器具有在一个帧中流传输96字节的功能-但是它们会在通信结束之前不断发送。我计划在STM32中使用两个96字节的缓冲区-在下一行中,我将解释原因。

我想通过USB-CDC向STM32发送前96个字节的帧-然后外部调制解调器芯片将生成一个“ 9600bps”时钟,并且STM将必须在指定的输出引脚上逐位写入有效载荷位(在后沿每个时钟脉冲)。 当STM32注意到已经发送了一半的96字节帧-发送给PC通知以发送更多数据时-PC将立即通过USB-CDC重新填充第二个96字节缓冲区。当STM32结束发送第一个缓冲区时-立即开始发送第二个缓冲区内容。当它发送第二个缓冲区的一半时-与之前一样,将要求PC再提供96个字节的帧。 一直这样,直到PC发送命令停止TX为止。

此传输模式-串行,使用“触发时钟”。 使用DMA是否可以实现,如何设置? 我想使用DMA在已经将数据流传输到无线电调制解调器芯片的同时具有使用USB的能力。这是正确的方法吗?

我正在从事构建具有包和流功能以及数字语音功能的开源无线电通信系统项目的项目。我正在为PC无线电调制解调器设计电子产品。该项目名为M17,由Wojtek SP5WWP维护。

1 个答案:

答案 0 :(得分:3)

  1. Re。一般架构。通过USB ACM进行的串行通信不必使用相同大小的缓冲区,并且可以与通过SPI进行的下游通信同步。您可以使用尽可能大的缓冲区,以便PC可以提前发送数据。如果PC没有足够快地提供数据,这将减少缓冲区下溢的机会。使用循环缓冲区并在数据包从USB到达时填充它。

  2. DMA是正确的方法。尽管人们经常说DMA仅对于高带宽操作才是必需的,但使用DMA实际上比处理每个字节的中断要容易得多,即使您每秒仅处理9600位。

  3. STM32F3中的
  4. DMA控制器具有半传输完成位(DMA_ISR中为HTIF),您可以轮询该位或使其生成并中断。结合传输完成状态(TCIF)和循环位(DMA_CCR中的CIRC),您可以组织一个双缓冲数据管道,以便传输可以与MCU所做的其他事情重叠。该应用程序将在HTIF事件上重新加载DMA缓冲区的前半部分。 TCIF事件发生时,它将重新加载下半部分。必须快速完成,然后再完成另一半。但是,仅当需要持续流传输数据时,即总数量大于DMA缓冲区的大小时,才需要双缓冲管道。 停止循环DMA可能很棘手。我想STM32和外部芯片都知道要发送多少字节。在这种情况下,收到此金额后,请禁用DMA。

  5. 似乎需要STM32中的从SPI,因为外部芯片会生成SPI时钟。

  6. DMA的设置并不困难,但是,它需要多项工作才能正常工作。我假设寄存器级编程,如果您使用某种框架,则需要了解它如何实现这些功能。启用S​​PI的时钟,SPI引脚的GPIO端口和DMA,将引脚配置为AF。为SPI外设找到正确的DMA通道。如果使用SPI DMA,通常需要两个通道:TX和RX,但是使用从SPI时,您可能需要一个通道。配置SPI,注意时钟极性和相位,并将其设置为为每个TX和/或RX生成DMA请求。将DMA CPAR通道寄存器设置为指向通道中的SPI DR寄存器,并适当地编程所有其他DMA通道寄存器。启用DMA通道。在从机模式下使能SPI。当SPI主机通过MOSI / SCK引脚为数据提供时钟时,DMA控制器会将其存储在存储器中。当缓冲区为半满和全满时,如果您告诉它,通道将设置HTIF和TCIF位并生成并中断。使用这些事件来实现流控制。