在 STM32 板上实现 SSI 从接口

Posted

技术标签:

【中文标题】在 STM32 板上实现 SSI 从接口【英文标题】:Implementing an SSI slave interface on STM32 Board 【发布时间】:2020-10-30 22:35:57 【问题描述】:

我正在尝试在 STM32 板上实现 SSI 从协议。由于 STM32 开发板没有 SSI 接口,我在 Slave(仅发送模式)中使用了它的 SPI 接口。主机 SSI 发送 24 个时钟信号,从机通过 MISO 引脚发送其数据(3 字节)做出反应。我面临的问题是数据总是在来自主机的每个时钟信号上向左移动。例如,假设我不断地从 slave 发送 0x010101。

第一次传输主机收到 0x010101 在第二次传输中,主设备收到 0x020202 在第三次传输中,主机收到 0x040404

有人可以给我一些关于如何解决这个问题的提示吗?

【问题讨论】:

【参考方案1】:

当 SPI 从设备识别到(意外的)额外时钟脉冲时,可能会发生每次传输的数据移位。看看***上的SSI protocol description,这实际上是有道理的: 为了传输 N 位数据,主机发出 N 个时钟周期,然后是另一个时钟脉冲来表示传输结束(所谓的“单稳态触发器时间” - 指的是原始的硬件实现SSI 接口)。由于 SPI 协议/SPI 从机不知道这个额外的时钟脉冲,它开始输出下一个数据字节的第一位,而这反过来又不被 SSI 主机识别。因此,这会导致 SSI 主机在下一个 SSI 帧上识别的数据位发生偏移。

不幸的是,用 SPI 从机正确处理 Monoflop 时间并不容易。为了处理额外的时钟脉冲,我们可以尝试在从机端将 SPI 帧大小设置为 25 位。由于 STM32 硬件仅支持 4 位到 16 位之间的 SPI 帧大小,因此唯一的选择是将其设置为 5 位。这不是很方便,因为我们需要将 3 字节(24 位)输出数据转换为 5 块 5 位(24 位输出数据 + 1 位虚拟数据),但它应该适用于“正常”传输。

如果我们还想正确处理"Multiple transmissions" 和"Interrupting transmission" 的情况,事情会变得更加复杂。我们需要监控时钟信号才能检测到单稳态触发器超时。这可以使用带有外部触发器的 STM32 硬件定时器来完成。当定时器到期时,我们需要重置 SPI 单元(以处理中断的传输)并更新输出值。这个“简单”的任务可能非常具有挑战性,因为它需要几条指令——需要一个快速的 MCU,具体取决于 SSI 时钟频率。

或者,SSI 协议可以使用纯软件的“bit banging”解决方案来实现。但这也需要快速的 MCU 才能正确处理快速 SSI 时钟。

恕我直言,最好的解决方案是使用小型(廉价)FPGA 来实现 SSI 从机,并让 MCU 通过传统 SPI 接口为其提供数据。

【讨论】:

以上是关于在 STM32 板上实现 SSI 从接口的主要内容,如果未能解决你的问题,请参考以下文章

干货 | STM32上实现驱动注册initcall机制

STM32定时器编码器接口模式

在STM32上实现NTFS之2:磁盘知识基础与NTFS结构

STM32 Modbus TCP

在 STM32F411 Discovery 上实现 HD44780 LCD 时调试 HardFault

如何在stm32上实现tcp/ip协议