1

我正在使用 STM32F446 开发一个需要 3x SPI(我是所有这些方面的大师)和 SDIO 接口的应用程序。

其中 2 个 SPI(SPI1 和 SPI2)是需要每 1ms 读取一次的传感器。对于 SPI1,我需要写入 1 个字节,对此的响应将是值。对于 SPI2,我需要写入 1 个字节,然后读取 6 个字节。

第三个 SPI (SPI3) 和 SDIO 用于通信/记录,它们都不需要以固定周期传输数据。

查看STM32F46x 手册,第 9 节,看起来我不能通过外设中断触发 DMA 传输(这太糟糕了),但我可以做以下所有事情:

  1. 每 1ms 的定时器中断:在 ISR 内部触发 SPI1 和 SPI2 DMA 传输。DMA 传输用接收到的传感器数据填充缓冲区;
  2. 每次我需要写入 SDIO 或 SPI3 时,我都会启动优先级低于 SPI1 和 SPI2 的 DMA 传输。

我猜 SPI1 和 SPI2 可以并行执行,因为我有 2 个 DMA 控制器,如果它们同时发生在 SPI2 和 SDIO 的同时,后者将被阻塞,直到控制器空闲。那正确吗?

4

1 回答 1

3

对于 SPI1,我需要写入 1 个字节,对此的响应将是值。对于 SPI2,我需要写入 1 个字节,然后读取 6 个字节。

请注意,使用 SPI,读取和写入同时发生,您可以通过写入一个虚拟字节来读取一个字节,在设置要传输的字数时应该考虑到这一点。

DMA 传输用接收到的传感器数据填充缓冲区;

除非您在传输之间将 CS 设置为高电平,否则某些 SPI 从机将无法正常工作。如果您的传感器是这种情况,您应该在接收 DMA 流中断中执行此操作。如果您正在考虑让 DMA 自动填充一个大缓冲区,那么在这种情况下是行不通的。

我猜 SPI1 和 SPI2 可以并行执行,因为我有 2 个 DMA 控制器,如果它们同时发生在 SPI2 和 SDIO 上,后者将被阻塞,直到控制器空闲。那正确吗?

只要较高优先级的传输不完全占用 DMA 带宽,它们就不会被阻塞,而是交错。没有 SPI 传输可以做到这一点,因为 SPI 需要至少 16 个时钟周期来传输单个字节(至少 2 个周期/位)。

于 2016-06-23T10:25:38.620 回答