SPI 详解

介绍

串行外设接口是微控制器用来与外设(如 SRAM、SD 卡、移位寄存器、传感器等)通信的最常见通信协议之一。它是一种同步、全双工、基于主从的协议。它支持高速数据传输,并且 SPI 协议中的数据速度 (bps) 和时钟频率 (Hz) 之间存在直接关系。例如,如果 SPI 的时钟频率为 36 MHz,则传输速度将为 36Mbps。因此,SPI 协议的传输速度没有限制。它完全取决于设备支持的时钟频率。谈到连接,SPI 是一个 4 线接口,具有以下信号线:

  • 主输出从输入 (MOSI)
  • 主入从出 (MISO)
  • 时钟(SCLK)
  • 从属选择

SPI 接口

SPI接口
MISO 和 MOSI 是传输数据的主要数据线。SCLK 是主机生成的时钟信号,用于对总线上的数据进行采样。最后,是一条有效低信号线(非活动时拉高,使用时拉低),用于选择总线上的从机。

使用 SPI 连接设备简单明了。主设备的每个引脚都连接到从设备相同的引脚,不会造成混淆。主设备的 MOSI 连接到从设备的 MOSI,主设备的 MISO 连接到从设备的 MISO。SCLK 也是如此。

SPI数据传输

的主要优势之一是不需要起始位和停止位,因为总线的 SCLK 线会同步数据。SCLK 线会同步数据线上位的移位和采样,本文后面会详细解释这一点。

至于可传输的位数,SPI 协议支持的字长范围为 3-16 位,但标准为 8 位。如果主机和从机想要一次共享 2 个字节,它们可以选择 16 位字长并使用 16 位数据寄存器(如果 MCU 上有的话)或将其以两个 8 位数据包的块形式传输。

SPI 还支持连接到同一主设备的多个从设备。对于每个从设备,必须有一条单独的 SS 线。数据交换仅发生在主设备和选定的从设备之间;总线上其余的从设备保持不活动状态,无法使用其 MOSI 和 MISO 线。图 2 显示了多个从设备设置的连接。
SPI总线上连接到主机的多个从设备
但 SPI 并非完美无缺。SS 线只是数字 I/O 引脚。因此,可连接的从属设备数量受到微控制器上可用 I/O 引脚的限制。

为什么要使用带有 SPI 的时钟?

可能会出现这样的问题:如果串行协议可以很好地异步工作,为什么还要引入时钟线?如果您读过我们的 UART 教程,您就会知道通过 UART 通信的设备没有公共时钟来同步它们之间的数据传输。通信设备依靠其内部时钟来采样数据。因此,时钟需要精确,否则会收到垃圾数据。此外,额外的位用于标记数据帧的开始和结束,这会给大量传输带来大量开销。但是对于 SPI 来说,它无需标记数据帧的开始和结束,并在时钟信号的上升沿或下降沿同步数据。让我们看看 SPI 是如何实现这一点的。

在继续之前,我们将解释本教程下一部分中将使用的两个重要术语:

具有 CPOL 和 CPHA 的 SPI 时钟模式

四种模式下的数据采样和移位

1. SPI 模式 0 - CPOL:0,CPHA:0
SPI模式0
数据在时钟信号的上升沿被采样,并在时钟信号的下降沿被移出。这里,时钟极性在理想状态下为低;当没有数据传输时,时钟线为低。

2. SPI 模式 1 - CPOL:0,CPHA:1
SPI模式1
数据在下降沿采样,在上升沿移出。此处,时钟极性与前一种情况(模式 0)类似;理想状态下,当没有数据传输时,时钟线处于低位。

3. SPI 模式 2 - CPOL:1,CPHA:0
SPI模式3
数据在时钟的上升沿被采样,在时钟的下降沿被移出。这里,时钟极性在理想状态下为高。

4. SPI 模式 3 - CPOL:1,CPHA:1
SPI模式4
数据在时钟的下降沿采样,在时钟的上升沿移出。时钟极性与 SPI 模式 - 3 类似,理想状态下为高电平。

嵌入式工程师必须了解 SPI 时钟模式,因为从设备通常预先配置了其中一种模式。您可以在相应的数据表中找到从设备的时钟操作模式。一旦我们确定了从设备的操作模式,就可以相应地配置主设备以通过 SPI 总线与从设备进行通信。

SPI寄存器中的数据接收与发送

支持 SPI 协议的微控制器有一组专用的控制和数据寄存器。这些专用寄存器配置时钟模式(如上文所述)并在通信设备之间传输和接收数据。

SPI 遵循 SISO(串行输入、串行输出)方法 - 每发送一个位,就会收到一个新位。因此,在每个时钟脉冲上,主机数据寄存器中的一个位通过 MOSI 线传输到从机数据寄存器,同时,从机数据寄存器中的一个位通过 MISO 线传输回主机数据寄存器

数据传输和接收过程直观地显示如下。我们将时钟控制位视为 CPHA = 0 和 CPOL = 0:

  1. 数据存储在主机和从机各自的 SPI 数据寄存器中。
    在这里插入图片描述

  2. 开始通信时,主机发送时钟信号,并通过启用特定从机的线路来选择连接的从机中的任意一个。从机被 SS 线路上的“0”信号中断并准备传输。主机和从机上的 LSB 分别从 MOSI 和 MISO 线路上的寄存器中移出。需要注意的是,线路保持低位,直到所有位都传输完毕。
    在这里插入图片描述

  3. 主机和从机均在 SCLK 线的上升沿(CPHA = 1)采样 LSB,并将其存储在其数据寄存器的 MSB 中。
    在这里插入图片描述

  4. 现在,数据寄存器的后续位在时钟脉冲的下降沿移出,清除 MSB 以读取下一位,新的 LSB 在数据线上移出。同样,在上升沿,对下一位进行采样并存储在寄存器中。
    在这里插入图片描述

  5. 这个过程在每个时钟脉冲上重复,直到寄存器上的所有 8 位都从主机传输到从机。因此,数据从主机逐字节发送到从机,反之亦然。数据传输完成后,主机通过禁用线路(将其拉高)来结束通信。
    在这里插入图片描述

SPI 中的菊花链方法

在我们上面讨论的 SPI 配置中,从设备需要单独的线路与主设备进行通信,但有时可用作线路的数字引脚数量可能少于所需数量。可以使用菊花链方法消除此问题。

SPI 接口
在菊花链方法中,所有从设备的引脚都连接到主设备的单个数字 I/O 引脚。下面显示了一个主设备带两个从设备的菊花链配置。所有从设备都与主设备共享一条公共 SCLK 线路,但其他引脚的连接方式不同。

主设备的 MOSI 连接到从设备 1 的 MOSI,但这次,从设备 1的 MISO连接到从设备 2 的 MOSI,而从设备 2的 MISO又连接到主设备的 MISO。这可能让人难以理解,因此下图应该会有所帮助。
SPI菊花链链接
类似地,如果您在菊花链配置中设置了 N 个从属设备,那么主设备的 MOSI 再次连接到从属设备 1的 MOSI,而从属设备 1的 MISO连接到从属设备 2的 MOSI。同样,从属设备 2的 MISO连接到从属设备 3 的 MOSI,依此类推,直到第 N 个从属设备。最后,第 N 个从属设备的 MISO 连接回主设备的 MISO。

SPI数据传输
为了理解菊​​花链配置中的数据传输,让我们考虑与上图 5 所示的相同配置。主设备希望分别将数据包 1 和数据包 2 发送到从设备 1 和从设备 2。菊花链配置中的数据包传输将按以下方式进行:

  1. 要启动通信,主机将通过拉低 SS 线来启用它,从而唤醒两个从机。
    在这里插入图片描述
  2. 主机随后将发送数据包 2 给从机 1,该数据包将存储在从机 1 的缓冲区中。
    在这里插入图片描述
  3. 根据标准 SPI 协议,数据包大小为 8 位。因此,在恰好 8 个时钟周期之后,从设备 1 将开始通过 MISO-MOSI 连接向从设备 2 发送数据包 2,同时从主设备接收数据包 1。
    在这里插入图片描述
  4. 一旦两个数据包都到达了目的地,从设备 2 就会通过它们之间的 MISO-MISO 连接发送响应字节来通知主设备。收到响应字节后,主设备会通过禁用 SPI 总线上的 SS 线来结束通信。
    在这里插入图片描述
    使用菊花链配置可减少 𝑆𝑆 线路所需的多个 I/O 引脚的要求。但是,随着从属设备数量的增加,它也会导致数据传输延迟。在实施菊花链方法时,确保所有芯片使用相同的时钟边沿和空闲时钟状态至关重要。如果设备不使用相同的时钟条件,则可能会出现不可靠的通信、数据损坏或设备之间完全无法交换数据的情况。

结论

SPI 通信协议非常适合与 SD 卡模块、各种传感器以及具有强大诊断工具的工业测试进行通信。它具有高速、简单和低成本等优点,但也有局限性,例如范围有限并且需要比其他通信协议更多的引脚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值