STM32F337:SPI从帧同步

时间:2017-09-29 15:43:14

标签: arm microcontroller interrupt stm32 spi

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

每个SPI事务数据包或帧,无论你想要它们调用它们,都应该具有恰好100个字节。

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

因此,为了传输100个字节,主机将NSS拉低(置位),以通常方式将800位时钟提供给从机,并再次将NSS拉高(取消断言)。

每当一个事务出错时,下一个事务应该通过同步再次确定,因此在NSS的“高时间”期间,应该评估和重新建立事务。为了实现这一点,我需要一个NSS线路的中断信号,如果传输的字节数小于100,甚至应该触发。(测试显示DMA中断只在传输100个字节时才会触发,否无论NSS被断言和再次断言的频率如何。)

我发现μC单元中的SPI从外设仅使用NSS线来控制MISO线的状态(高Z或不高),但不控制使用它的通信,即。即它不会重置任何DMA状态等等。

因此,我必须找到一种方法来复制NSS功能和EXTI之间的界限,以便在线路状态发生变化时产生中断。但是我没有办法做到这一点 - 至少,STM32Cube不会让我对NSS和EXTI使用相同的引脚。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

这不是,因为NSS线路无效,同步机制和DMA不会触发任何中断。