SPI从设备可以以全双工模式启动传输吗?


8

据我所知,SPI从设备的SPI传输如下所示:

  1. 主机通过SS引脚选择一个从机
  2. 主从之间同时发送数据
  3. 主机同时启动时钟和数据传输(写操作之前没有时钟)
  4. 即使从站有更多数据要发送,主站也可以在其希望的任何时候停止传输(通过停止写操作和时钟生成)。

是否有任何SPI从设备配置,该配置允许从设备在未经主机许可的情况下传输数据?

我只是想大声一点。假设只有一个从站,而主站等提供了一个连续的时钟。

即使假定的陈述为真,由于没有SPI的起止位,主机和从机也不会丢失字节同步(即接收位流)吗?

我问这样的问题是因为我已经阅读了本文档的以下部分。

2.2 SPI示例

所附的SPI示例说明了USART在同步模式下的使用。USART1被配置为从设备,而USART2被配置为主设备。发生以下交易:

  • 从主机到从机的数据传输。
  • 从机到主机的数据传输。
  • 从主机到从机以及从机到主机同时进行数据传输。

本文给出了SPI示例,但使用USART器件实现了示例。而且我知道USART从站可以在未经主站许可的情况下开始传输。

我找不到文档引用的源代码。


4
根据定义,从属服务器无法启动事务(尽管它可能能够中断主机以启动事务处理)。
彼得·史密斯,

5
传统SPI中的单向数据传输只是忽略了沿另一个方向的线路状态。写入,读取和双向传输实际上没有什么不同。实际上,例如,许多SPI外设会在第一个字之前就发出状态字,直到他们甚至不知道所要的内容,因为这样做几乎不需要花任何钱,并且可以进行快速状态轮询。
克里斯·斯特拉顿

Answers:


17

不,使用SPI,所有通信均由主设备驱动。您是对的,主机不能简单地提供连续的时钟;这是正确的。将无法检测字节边界。

从设备通常会具有一个单独的输出引脚,以向主机发送信号,告知其有可用数据。该引脚连接到微控制器的输入,通常用作中断。

然后,器件可以置位该引脚,从而使微控制器旋转SPI总线。


有关更多详细信息,请继续阅读:)这是在此处稍作修改的解释版本:

从设备仅在从主设备获得时钟时才能通信。这会使从从设备读取变得复杂,因为您必须使主设备提供足够的时钟周期,以便从设备响应。

当您从主机发送SPI命令时,实际上在相同的八个时钟脉冲期间发生了两次传输。首先是您的字节从MOSI线移出。但是,与此同时,数据正在通过MISO线输入到微控制器。

但是由于从站直到这些事务结束才获得完整的命令,因此它不会向总线提供任何数据。这导致接收到的值为0x00或0xFF。

然后,您需要提供额外的八个时钟,以允许从站返回实际值。在许多代码实现中,这是通过向从设备发送“虚拟字节”来完成的。

请注意,在第一次传输中,主机会忽略从机发出的任何信号。在第二次传输中,从机将忽略主机发送的任何内容。

那描述了一般情况。可能会有其他复杂性。例如,某些从属IC实际上会在从主机接收命令的同时输出某种状态字节。因此,在这种情况下,主机不应丢弃第一个接收到的字节。


2
“主机不能简单地提供连续的时钟”实际上,我不久前就已经看到一种设备可以做到这一点。那是一个怪异的小野兽。不幸的是,我没有回想起P / N。
亚伦

@Aaron真心知道!人们变得越来越聪明:-)
–bitsmack

7

不,主机是仲裁芯片选择和驱动时钟的主机。从机将始终仅监听时钟和芯片选择。数据传输仍可以是全双工的。在某些实现中,时钟可以是连续的,但是并没有多大关系,因为无论如何都使用chipselect来同步字节边界。但是,这里有多主机系统,因此基本上,您可以为设备提供某种机制来确定谁是从机和主机。或者只是为从机提供一条单独的“中断”线,以向主机发出信号,告知主机具有用于主机的数据包。


您能添加一个多主机系统示例吗?
davidcary
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.