我有一个带有STM32F337的应用程序,它应该实现一个SPI从协议。
每个SPI事务分组或帧,不管你想叫它们什么,都应该恰好有100个字节。
主机使用NSS线路来确保帧是同步的,就像在任何好的SPI应用程序中所做的那样。
因此,为了传输100个字节,主机将NSS拉低(置位),以常规方式将800位计时到从机,然后再次拉高NSS (取消置位)。
每当一个事务出错时,下一个事务应该通过同步的方式恢复正常,所以在NSS的“高峰期”,事务应该被评估和重新建立。为了实现这一点,我需要为NSS线路提供一个中断信号,即使传输的字节数小于100,也应该触发中断信号。(测试表明,只要传输了100个字节,DMA中断就会触发,无论NSS被解除断言和再次断言的频率如何。)
我发现µC单元中的SPI从属外设仅使用NSS线路来控制MISO线路的状态(高Z或非高电平),但不控制使用它的通信,即不重置任何DMA状态或其他任何状态。
因此,我必须找到一种在NSS功能和EXTI之间多路复用线路的方法,以便在线路状态改变时进行中断。但我看不到这样做的方法--至少,STM32Cube不会让我在NSS和EXTI上使用相同的pin。
这是Cube的限制还是µC单元的限制?我是否有其他选择(除了一次将信号连接到多个管脚)?
发布于 2019-05-20 02:20:26
我同意这是STM32 SPI从实现的一个主要限制。只要NSS被解除断言,SPI单元就不能产生中断。
为了能够并行使用硬件NSS和EXTI功能,最好的解决方案确实是将NSS线连接到两个单片机引脚上。
如果这不可能,我的解决方案是使用NSS信号作为EXTI中断,并使用软件NSS管理(SPI_CR1中的位SSM)来管理SPI从机。EXTI可在两个边沿(即NSS的断言和去断言时)触发,SPI从机由EXTI中断处理程序的软件(SPI_CR1中的位SSI )使能和禁用。
此方法的关键路径是为接收NSS断言而准备SPI从站的时间。此事件触发的EXTI中断需要高度优先,但根据时钟配置和SPI主机的时序要求,CPU可能不足以切换每个软件的NSS位。在这种情况下,可以选择提前打开SSI (软件NSS) -但这可能不是在每个应用程序中都可能实现的(例如,具有多个从设备的共享SPI通道)。
发布于 2019-05-20 16:53:22
STM术语中的NSS或CS仅选择从机,并发信号通知未被选择的从机进入HI-Z状态以释放总线。
它不是同步机制,并且不会触发任何中断,因为NSS线被解除断言。
https://stackoverflow.com/questions/46492463
复制相似问题