当我们用 SPI 写入时,接收部分会发生什么?

What happens at the receive part when we write with SPI?

当 SPI master 向 slave 写入数据时,有些东西正在移入接收缓冲区,对吧? 如果是,那么设置"RXDATAAVAILABLE"标志是正常的吗?这是胡说八道!我们发送数据,当数据发送时,我们会收到收到数据的通知。

如果我的所有陈述都是正确的,那么我们如何知道 RXFIFO 中的正确数据是什么?

假设我们发送两个字节的帧。第一个是地址,第二个是虚拟地址,以便读取该地址(从站)中的值。然后假设我们有两级 Rx FIFO。在那个 FIFO 中,取而代之的是从从设备读取的值,我们有两个字节,第一个是谁知道是什么,第二个是从从设备读取的值。

所以问题是:我们如何设法只接收必要的数据,而不会在帧的写入部分接收到垃圾数据?

SPI 的工作原理类似于简单的 8 位移位寄存器。您在时钟的每个侧边移出 MOSI 上的字节,同时从 MISO 移入新数据。因此,您可以同时发送和接收。因此名称 MOSI = Master Out Slave In,和 MISO = Master In Slave Out。

微控制器上的SPI外围设备比它更复杂,并且有独立的数据寄存器,不同于实际的硬件移位寄存器,这样我们就可以写入数据而不必担心等待传输。有些甚至可能有多个数据缓冲区。但在基本层面上,SPI 始终使用 8 位工作。

当作为SPI master的微控制器写东西时,通常有两个标志,一个表示数据缓冲区可用,另一个表示传输完成。

当您完成发送后,您也就完成了接收。你会得到某种标志集。这是假设所有设备都按预期实现 SPI,但通常情况并非如此。

请注意,某些设备实现的系统首先发送 x 字节的数据,然后接收 x 字节的数据。这似乎是你描述的场景。该设备的发送和接收不是同时进行的,而是按顺序进行的。这意味着在第一次传输期间,您将输入垃圾,然后为了接收数据,您必须输入垃圾。这不是SPI的错,而是具体设备的制造商如何指定的东西。

请注意,SPI 的标准化程度很低,因此市场上存在各种奇怪的废话。 sending/receiving 数据的方式可能会有所不同,时钟极性(两侧)可能会有所不同,其中设备时钟数据可能会有所不同。一些设备可能需要数据字节之间的延迟。某些设备可能需要对 Slave Select 引脚进行一些晦涩的处理才能工作。乱七八糟,缺乏国际标准化是罪魁祸首。

SPI 主机引擎的接收数据可用标志将设置为主机本身生成的一个字的时钟周期的简单结果。它不会告诉您总线上外围设备的操作甚至存在。

设置此标志后,完全由您和您的软件决定接收到的数据寄存器的内容是否有意义。

  • 如果您在 readtransfer 操作中正确选择并与现有的可操作外围设备交互,其中据记载给出一个结果,它们将具有意义

  • 如果您对外围设备执行了纯粹的 write 操作,而在相关单词位置没有记录回复数据,这将毫无意义,实际上与读取一些随机的合法内存位置没有什么不同。请注意,在大多数情况下,写入操作只是一种传输,其中接收到的数据将被忽略 - 在实现级别通常没有其他区别。

  • 如果您未能解决任何现有的外围设备,它同样毫无意义。

与任何其他内存或读取操作一样,在特定情况下寄存器的内容是否有意义取决于您。

因为您知道第一个字节包含 "who knows what" 而第二个字节有意义,所以编写您的软件以忽略第一个并使用第二个。

(顺便说一句,许多(但绝不是全部)SPI 外围设备被记录为在地址阶段移出构成其主要状态寄存器的任何内容,因为这样可以快速轮询它)