是否可以在STM32F3上使用 DMA 通过 SPI 流式传输无限数据?



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

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

这种传输模式 - 串行,使用"触发时钟"。 使用 DMA 是否可以执行此操作,我该如何设置它? 我想使用 DMA 能够在将数据流式传输到无线电调制解调器芯片的同时使用 USB。这是正确的方法吗?

我正在构建一个开源无线电通信系统项目,该项目具有分组和流功能以及数字语音。我正在为PC无线电调制解调器设计和电子。项目称为M17,由Wojtek SP5WWP维护。

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

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

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

  4. 似乎在STM32中需要一个从属SPI,因为外部芯片产生SPI时钟。

  5. DMA并不难设置,但是,它需要多种功能才能正常工作。我假设寄存器级编程,如果你使用某种框架,你需要找出它是如何实现这些功能的。启用 SPI 时钟、SPI 引脚的 GPIO 端口和 DMA,将引脚配置为 AF。为 SPI 外设找到合适的 DMA 通道。在SPI DMA的情况下,您通常需要两个通道:TX和RX,但是使用从属SPI,您可以逃脱一个通道。配置 SPI,注意时钟极性和相位,并将其设置为为每个 TX 和/或 RX 生成 DMA 请求。设置指向通道中SPI DR寄存器的DMA CPAR通道寄存器,并对所有其他DMA通道寄存器进行适当编程。启用 DMA 通道。在从模式下启用SPI。当SPI主控时钟在MOSI/SCK引脚上计时时,DMA控制器会将它们放入存储器中。当缓冲区处于半满和全满状态时,通道将设置 HTIF 和 TCIF 位,并生成和中断(如果您告诉它(。使用这些事件来实现流控制。

相关内容

  • 没有找到相关文章

最新更新