SPI 协议是否指定主设备应向从设备发送多少时钟脉冲?

电器工程 FPGA spi 协议 同步
2022-01-20 13:37:45

我正在尝试在 Verilog 中实现一个 SPI 设备。我在协调主机和从机方面遇到了很多问题,因为有时(使用我目前的实现)SPI 主机不会向从机发送足够的时钟脉冲,因此它可以完成其处理。

例如,如果从机被实现为使其状态机具有更多状态,并且它在完成其周期之前停止接收时钟脉冲,则可能会发生这种情况。

我可以修改我的实现以使这两个设备在时钟脉冲方面进行协调,但是,这意味着主实现者需要知道实现。奴隶(以及所有潜在奴隶)的详细信息。这对我来说似乎根本不对。

SPI 协议是否准确指定了主机在发送(例如,一个字节)时必须向从机提供多少脉冲?如果不是,那么任何 SPI 主设备如何与任何从设备兼容?为了以防万一,可以向从机发送大量脉冲(例如:1 个字节 64 个脉冲)吗?

4个回答

SPI 主机不负责确保从机的内部状态机获得“足够的”时钟脉冲。主机负责的只是传输到从机或从从机传输的每个位一个时钟脉冲 - 就是这样。

如果您的从站需要额外的时钟,那么您可以以支持此的方式管理您的实现 - 也许您指定必须传输的最小字节数(即使其中一些是“虚拟”字节),或者您可能有除了 SPI 时钟外,还为从机提供外部时钟。

一个表现良好的 SPI 从设备应该在其从设备选择输入被停用时重置其 SPI 状态机,以便主设备在一轮通信中所做的任何事情都不一定会因为某些东西处于不完整状态而中断下一轮通信。

任何关于 SPI 协议的问题的答案都是:没有 SPI 协议!这是传输串行数据的最简单方法,本质上只是一个移位寄存器。查看 MCU 中的典型 SPI 模块,您会发现与没有标准相关的问题(例如,要捕获哪个边缘)。

您需要一种方法来保持 SPI 接收器接收本地时钟,而不是依赖 SPI 源提供时钟来执行除串行数据时钟之外的任何操作。您可以使用共享 SPI 时钟来传输数据,但使用本地时钟来维护您的状态机。

SPI 不是您所说的那种意义上的协议。

它只是一个以串行方式自动传输位的接口,最常见的是在设备之间传输字节的 8 倍数。

当然,从某种意义上说,它是一个协议,各方必须就如何发送数据达成一致,包括诸如时钟相位之类的东西,以了解数据加载到哪个边缘以及空闲时钟极性是什么。

最重要的是,由设备决定使用位或字节协议,以了解位和字节的含义。

基本上,如果您的 SPI 接收器需要一定数量的位,那么 SPI 发送器必须传输该数量的位,不多也不少。这些位包含什么,以及如果未传输正确数量的位,您的 SPI 接收器如何工作取决于您。

从站对 MOSI 传输的反应完全取决于您,因为您正在设计从站行为。

如果传输是唯一的时间(当帧处于活动状态时),则从机响应它要么必须调整它的行为以在帧期间完成,要么它必须实现和描述该行为,以便使用该功能的主机计时MOSI 数据足够长(填充数据)以让从机完成。

这就是它的症结所在。

我在 Microsemi SmartFusion 2 (MS2090) 部分中看到的一个示例:

实际上,这并不奇怪或不寻常。Microsemi M2S090 在轮询HW_STATUS. MOSI 发送0xFF,并且在对命令计时时 MISO 数据包含响应。同一帧中,同时在命令 MOSI 中计时,而不是之后0xFF被计时到从机。

与其他命令相比,在有效载荷被计时 MOSI 之后,主设备保持帧活动,计时更多数据 MOSI,以便从设备可以根据某些要求进行响应。主机使帧保持活动状态,当它处于活动状态时,它使时钟保持运行。

这是您的设计,因此也是您的要求。

我为进行比较所做的调查是运行一些 Arduino 板 M/S 并确定行为范围。我使用这个场景来验证从站对 MOSI 命令/数据的反应的期望。

编辑:再想一想,这并不完全取决于你。事实上,第三方供应商建立了一些标准。如果您完全确定您的 FPGA 和 SPI 使用的围墙花园是隔离的,那就做您想做的。但是,如果任何第三方设备打算与您的设备连接并进行交易,则需要注意主设备在 SPI 传输帧期间的行为。(我在这里想的是模式,维基百科等上有文章。关于这个以及你的硅数据表会更好看)。