我正在使用STM32F446进行一项需要3x SPI(我在所有这些中都是主机)和SDIO接口的应用。
2个SPI(SPI1和SPI2)是需要每1ms读取一次的传感器。对于SPI1,我需要写1个字节,对它的响应将是值。对于SPI2,我需要写1个字节,然后读6个。
第三个SPI(SPI3)和SDIO用于通信/记录,它们都不需要以固定的周期传输数据。
看看STM32F46x manual,第9节,它看起来不像我可以用外围设备中断触发DMA传输(这太糟糕了),但是我可以做所有这样的事情:
我猜测SPI1和SPI2可以并行执行,因为我有2个DMA控制器,如果它们与SPI2和SDIO同时发生,则后者将被阻塞,直到控制器空闲。是吗?
答案 0 :(得分:2)
对于SPI1,我需要写1个字节,对此的响应将是 值。对于SPI2,我需要写1个字节,然后读6个。
请注意,对于SPI,读取和写入同时发生,您可以通过写入虚拟字节来读取字节,在设置要传输的字数时应考虑到这一点。
DMA传输使用接收到的传感器数据填充缓冲区;
除非在传输之间将CS设置为高,否则某些SPI从设备将无法正常工作。如果您的传感器属于这种情况,则应在接收DMA流中断中执行此操作。如果你想让DMA自动填满一个大的缓冲区,那么在这种情况下就不行了。
我猜测SPI1和SPI2可以并行执行,因为我有2个 DMA控制器,如果它们与SPI2和SPI同时发生 SDIO,后者将被阻止,直到控制器空闲。就是它 正确?
只要优先级较高的传输不会完全占用DMA带宽,它们就不会被阻塞,而是交错存在。没有SPI传输可以做到这一点,因为SPI需要至少16个时钟周期来传输单个字节(至少2个周期/位)。