我在一个项目中使用
STM32L4S9AII6 MCU,我被要求用这个 CPU 替换
FPGA 实现。我们正在通过 SPI、I2C 和 UART 最大化所有 14 个 DMA 流。你可以想象,我正在处理一些严重的硬实时截止日期。我正在使用 FreeRTOS。
我认为这是一个在
论坛上讨论的令人困惑的话题,所以让我用一个例子来提出我的问题。假设我配置了 2 个 SPI 外围设备。我们称它们为 SPI1 和 SPI2。两者都以 10MHz 或其他频率传输。两者都配置为一次传输 8 位(1 字节)。两条 NSS 线均通过软件控制,以允许在块传输的整个持续时间内将此使能线拉低(每个 DMA 请求多个字节)。现在假设 SPI1 尝试传输一个 8 字节的块。紧接着,SPI2 也尝试传输一个 8 字节的数据块。
问题:
DMA 引擎是否在 SPI1 上阻塞,直到 SPI1 完成所有 8 个字节的传输,然后允许 SPI2 开始传输其第一个字节?
-或者-
DMA 引擎是否仅在从 SPI1 检索完成/缓冲数据(一次 1 个字节)时才阻塞,然后在需要时请求下一个字节?然后 DMA 仲裁器将有机会使用 SPI1 字节之间的时间来启动 SPI2 上的传输。
我的观点是,当 DMA 不是负责传输数据的实体时,为什么 DMA 必须在外围设备上阻塞。在我看来,DMA 只需要阻塞足够长的时间来让每个外设保持忙碌,因此应该能够同时让多个外设保持忙碌。
也就是说,DMA可以让外设并行传输吗?