我试图在STM32板上实现SSI从协议。由于STM32板没有SSI接口,所以我在从(传输仅模式)中使用它的SPI接口。主SSI发送24个时钟信号,从站通过MISO引脚发送其数据(3字节)。我面临的问题是,在来自主时钟的每一个信号上,数据总是向左移动。例如,假设我不断地从奴隶发送0x010101。
有人能给我一些关于如何解决这个问题的提示吗?
发布于 2020-07-11 18:16:50
当SPI从站识别(意外)额外的时钟脉冲时,每次传输的数据移位都可以发生。看看维基百科上的SSI协议描述,这实际上是有意义的:

为了传输N位的数据,主处理器发出N个时钟周期,然后是另一个时钟脉冲来发出信号传输的结束(所谓的"Monoflop时间“-指SSI接口的原始硬件实现)。由于SPI协议/ SPI从站不知道这个额外的时钟脉冲,因此它开始输出下一个数据字节的第一个位,而SSI主程序又无法识别它。因此,这将导致在下一个SSI帧上由SSI主服务器识别的数据位的移动。
不幸的是,使用SPI从服务器正确处理Monoflop时间并不容易。为了处理额外的时钟脉冲,我们可以尝试将SPI帧大小设置为从端的25位。由于STM32硬件只支持4位到16位之间的SPI帧大小,所以唯一的选择是将其设置为5位。这不是很方便,因为我们需要将3字节(24位)输出数据转换成5位块(24位输出数据+1位虚拟数据),但是它应该适用于“正常”传输。
但是,如果我们也想正确地处理“多重传输”和“中断传输”的情况,事情就会变得更加复杂。我们需要监视时钟信号,以便能够检测到单点超时。这可以使用带有外部触发器的STM32硬件定时器来完成。当计时器过期时,我们需要重置SPI单元(以便处理中断的传输)并更新输出值。这个“简单”的任务可能是相当具有挑战性的,因为它需要几个指令-需要一个快速的单片机取决于SSI时钟频率。
另外,SSI协议也可以使用软件“位撞击”解决方案来实现。但是,为了正确处理快速SSI时钟,这也需要一个快速的MCU。
IMHO最好的解决方案是使用一个小型(廉价) FPGA来实现SSI从站,并让MCU通过传统的SPI接口向它提供数据。
https://stackoverflow.com/questions/62829990
复制相似问题