当SPI主机写入从机时,有什么东西正在转移到接收缓冲区中吗? 如果是,那么这是正常的" RXDATAAVAILABLE"要设置的标志?这是胡说八道!我们发送数据,当发送数据时,我们会收到有关收到数据的通知。
如果我的所有陈述都是正确的,那么我们如何知道RXFIFO中的正确数据是什么?
假设我们发送两个字节的帧。第一个是地址,第二个是虚拟的,以便读取(从属的)地址中的值。然后假设我们有两个级别Rx FIFO。在该FIFO中,而不是从从机读取的值,我们有两个字节,第一个是谁知道什么,第二个是从从机读取的值。
所以问题是:我们如何设法只接收必要的内容,而不会在帧的写入部分获取垃圾数据?
答案 0 :(得分:2)
SPI就像简单的8位移位寄存器一样工作。您在时钟的每个侧翼移出MOSI上的字节,同时从MISO移入新数据。因此,您可以同时发送和接收。因此名称MOSI =主输出从输入,MISO =主输入从输出。
微控制器上的SPI外设比这更复杂,并且具有与实际硬件移位寄存器不同的独立数据寄存器,因此我们可以编写数据而无需担心待处理的传输。有些甚至可能有多个数据缓冲区。但在基础层面上,SPI始终使用8位。
当充当SPI主控制器的微控制器写入内容时,通常会有两个标志,一个表示数据缓冲区可用,另一个表示传输已完成。
完成发送后,您也完成了接收。你会得到某种旗帜。假设所有设备都按预期实现SPI,通常情况并非如此。
请注意,某些设备实现的系统首先发送x个字节的数据,然后接收x个字节的数据。这似乎是您描述的情景。发送和接收不是针对该设备同时进行的,而是按顺序进行的。这意味着在第一次传输过程中,您将使用垃圾进行计时,然后为了接收数据,您必须输出垃圾。这不是SPI的错,但是特定设备的制造商如何指定。
请注意,SPI标准化程度很低,因此市场上存在各种奇怪的废话。发送/接收数据的方式可以变化,时钟极性(侧翼)可以变化,其中设备时钟数据可以变化。某些设备可能需要数据字节之间的延迟。某些设备可能需要对Slave Select引脚进行一些模糊处理才能工作。这一切都是一团糟,缺乏国际标准化是罪魁祸首。
答案 1 :(得分:1)
SPI主引擎的接收数据可用标志将被设置为主机本身产生的字时钟周期的简单结果。它不会告诉您有关总线上的操作甚至存在外设的信息。
设置此标志后,完全由您和您的软件决定接收数据寄存器的内容是否有意义。
如果您已经在读取或传输操作中正确选择并与现有的可操作外围设备进行了交互,并且在此操作中记录了结果,他们将有意义
如果您对外围设备执行了纯粹的写操作,并且没有在相关字位置记录回复数据,那么它将毫无意义,实际上与阅读一些随机内容没有什么不同合法的记忆位置。请注意,在大多数情况下,写操作只是一种传输,其中接收的数据将被忽略 - 在实现级别,通常没有其他差异。
如果您未能解决任何现有的外围设备,那么它将同样毫无意义。
与任何其他内存或读取操作一样,您需要知道特定情况下寄存器的内容是否有意义。
由于您知道第一个字节包含“谁知道什么”而第二个字段有意义,因此请编写您的软件以忽略第一个并使用第二个字段。
(顺便说一句,许多,但并非全部,所有SPI外设都记录在地址阶段移出任何构成其主要状态寄存器的内容,因为这样可以快速进行轮询)