关于arm:STM32F337:SPI从帧同步

STM32F337: SPI slave frame synchronization

我有一个带有STM32F337的应用程序,该应用程序应实现SPI从协议。

每个SPI事务数据包或帧,无论您想调用它们如何,都应该具有100个字节。

主机使用NSS线来确保帧同步,就像在任何良好的SPI应用中一样。

因此,为了发送100个字节,主机将NSS拉低(置为有效),以通常的方式将800位计时到从机,然后再次将NSS拉高(置为无效)。

每当一个事务出错时,就应该通过同步使下一个事务再次正常,因此,在NSS的"高时间"期间,应该对事务进行评估并重新建立。为了实现这一点,我需要NSS线的中断信号,如果传输的字节数少于100,该中断信号甚至应该触发。(测试表明,仅在传输100字节后才触发DMA中断,否NSS被取消声明并再次声明的频率)。

我发现,μC单元中的SPI从外围设备仅使用NSS线来控制MISO线的状态(是否为High Z),而不使用它来控制通信。 e。它不会重置任何DMA状态或其他任何状态。

因此,我必须找到一种方法来使NSS功能和EXTI之间的线路多路复用,以便在线路状态改变时产生中断。但是我看不到能够做到这一点的方法-至少,STM32Cube不允许我将相同的引脚用于NSS和EXTI。

这是Cube还是μC单位的限制?我还有其他选择吗(除了一次将信号连接到多个引脚)?


STM命名法或CS中的NSS仅选择从站,并向未选择的从站发出信号以进入HI-Z状态以释放总线。

它不是同步机制,并且由于NSS线被置为无效,因此DMA不会触发任何中断。


我同意,这是STM32 SPI从设备实现的主要限制。每当CS无效时,SPI单元就无法产生中断。

恕我直言,最好的解决方案的确是将CS线连接到两个MCU引脚,以便能够并行使用硬件NSS和EXTI功能。如果不可能,我的解决方案是将CS信号用作EXTI中断,并使用软件NSS管理来管理SPI从设备。可以在两个边沿触发EXTI(即在CS的断言和反断言时),并且SPI从机可以通过EXTI中断处理程序中的软件来启用和禁用。

这种方法的关键路径是准备SPI从器件以在CS断言时接收的时间。需要高度优先考虑此事件触发的EXTI中断,但是根据时钟配置和SPI主设备的时序要求,CPU可能不够快,无法切换每个软件的NSS位。在这种情况下,可以选择提前开启NSS-但可能并非在每个应用程序中都可行(例如与多个从机共享SPI通道)。