ST意法半导体
直播中

杨杰

7年用户 1074经验值
私信 关注
[问答]

DMA仲裁器是否允许在每条数据之后进行循环抢占以保持多个外设同时运行?

我在一个项目中使用 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可以让外设并行传输吗?








回帖(1)

李晓龙

2022-12-13 14:08:30
DMA 可以“同时”服务多个事物,并且仅在有请求时才传输数据。如果没有挂起的 SPI1 请求,它将为 SPI2 服务。从技术上讲,它一次只做一个,但没有等待标记请求的事情。
但是,L4+ 有一个 SPI TXFIFO,可以一次保存多个字节。根据您的设置,将发出多个 SPI1 请求,以便在为 SPI2 请求提供服务之前填充 32 位缓冲区。
实际上,只有 SPI 可以在这里开始对资源征税,但只能以最大数据速率进行。在 10 MHz 时,a 请求每个 ~1MHz 一次在两个外围设备上是非常可行的。UART 和 I2C 很慢。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分