一、什么是SPI?

SPI 的英文全称为 Serial Peripheral Interface,顾名思义为串行外设接口。SPI 是一种同步串行通信接口规范,主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发,后发展成了行业规范。


二、简介

SPI 是一种高速的、全双工的、同步的通信总线,并且至多仅需使用 4 根线,节约了芯片的管脚,SPI主要应用于EEPROM、FLASH、ADC、DAC 等芯片,还有数字信号处理器和数字信号解码器之间。

SPI 设备之间采用全双工模式通信,是一个主机和一个或者多个从机的主从模式。主机负责初始化帧,这个数据传输帧可以用于读与写两种操作,片选线可以从多个从机选择一个来响应主机的请求。

SPI 接口定义如下表:

在这里插入图片描述
由上表也可以看出当 SPI 设备间通信时,数据线应该是 MOSI 连接 MOSI,MISO 连接 MISO,SCLK 与 SCLK 相连,而不是像串口那样 TX、RX 进行反接。当只有单一 SPI 从机设备时,如果从机设备允许的话,可直接将 CS/SS 线固定在低电平。然而类似于 MAX1242 这款需要 CS/SS 线的下降沿来触发的芯片,则必须将 CC/SS 线与主机相连。如下图,为一主一从连接方式。

在这里插入图片描述

对于多个从机设备时,则每个从机都需要一根 CS/SS 线来于主机相连,从而达到主机能与任一从机通信的目的。如下图,为一主多从的连接方式。

在这里插入图片描述

大多数从机设备都有着三态逻辑的特性,因此当设备未被选中时,它们的 MISO 信号线会变成高阻抗状态(电气断开)。没有三态输出的设备则需外接三态缓冲器才能与其他的从机设备共享 SPI 总线。


三、数据传输

在 SPI 通信中,SPI 主机设备以从机设备支持的频率通过 SCLK 线给到 SPI 从机设备,这点也意味着从机是无法主动向主机发送数据的,只能主机轮询向从机发或者从机设备主动通过一个 IO 口来告知主机数据到达。

在 SPI 每个时钟周期内,都会进行一次全双工数据的传输。主机通过 MOSI 线上发送 1bit 时,从机也会在读取到之后通过MISO 线发送 1bit 数据出去。这说明,即使只进行单工通信,也会保持此通信顺序。

SPI 传输通常涉及到两个给定了字长的移位寄存器。例如在主机、从机中的 8bit 的移位寄存器。它们以虚拟环形拓扑连接,数据通常先从最高有效位被移出。在时钟沿,主机和从机都移出 1bit 数据从传输线上给到对方。在下一个时钟边沿来到时,双方的接收器再对传输线上的该bit进行采样,并将其设置为移位寄存器的新的最低有效位。在寄存器位被移出和移入后,主机和从机交换了寄存器值。如果需要交换更多数据,则重新加载移位寄存器并重复该过程。传输可以持续任意数量的时钟周期。完成后,主机停止切换时钟信号。如下图,为主从机之间的交互时的移位寄存器示意图。

在这里插入图片描述
其中上图的通信流程如下:

1.SPI 主机首先先将 SS 或 CS 线拉低,以此来告知 SPI 从机通信开始。

2.主机通过发送 SCLK 时钟信号,来告知从机即将进行的读写操作。这里的 SCLK 时钟信号是由 SPI 的模式来决定是高电平还是低电平有效的,这点在稍后会进行介绍。

3.主机(Master) 将要发送的数据写到发送数据缓存区 (Memory),缓存区经过移位寄存器(0 ~ 7),串行移位寄存器通过MOSI 信号线将字节一位一位地移出去传送给从机,同时 MISO 接口接收到的数据经过移位寄存器一位一位地移到接收缓存区。

4.从机(Slave) 也将自己的串行移位寄存器 (0 ~ 7) 中的内容通过 MISO 信号线返回给主机。同时通过 MOSI 信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。


比较通俗的解释

SPI (Serial Periphral Interface)最早是由摩托罗拉公司设计并实现,它是一种高速的、全双工的通信总线,采用主机(Master)-从机(Slave)的方式进行通信。SPI 占用芯片的四个引脚,也就是说采用四条信号线来进行通信。这四条线分别是:主设备输入与从设备输出线(Master In Slave Out, MISO);主设备输出与从设备输入线(Master Out Slave In,MOSl);串行同步时钟信号线(Serial Clock,SCK);外围设备片选信号线(Slave Selection,SS)。
SPI 总线的主机和从机都有一个移位寄存器,当主机向自己的移位寄存器写入数据时,数据会通过 MOSI 信号线进入到从机的移位寄存器;同时,从机移位寄存器里的数据,通过 MISO 信号线进入到主机的移位寄存器。这样,主机和从机就完成了一次数据交换。下面这张图,是 SPI 通信的简明原理图:

在这里插入图片描述


四、SPI 通信的 4 种工作模式

SPI 通信中有 4 种不同的操作模式,不同的从机设备可能在出厂时就被设置好了某种模式,并且无法更改。但是 SPI 通信必须处于同一种模式下才能进行。因此我们应该对自己手里的 SPI 主机设备进行模式的配置,也就是通过 CPOL(时钟极性) 和 CPHA(时钟相位) 来控制 SPI 主设备的通信模式,具体如下:

时钟极性(CPOL) 定义了 SCLK 时钟线空闲状态时的电平:

1.CPOL=0,即SCLK=0,表示 SCLK 时钟信号线在空闲状态时的电平为低电平,因此有效状态为高电平。

2.CPOL=1,即SCLK=1,表示 SCLK 时钟信号线在空闲状态时的电平为高电平,因此有效状态为低电平。

时钟相位(CPHA) 定义了数据位相对于时钟线的时序(即相位):

1.CPHA=0,即表示输出 (out) 端在上一个时钟周期的后沿改变数据,而输入 (in) 端在时钟周期的前沿(或不久之后)捕获数据。输出端保持数据有效直到当前时钟周期的尾部边缘。对于第一个时钟周期来说,第一位的数据必须在时钟前沿之前出现在 MOSI 线上。也就是一个 CPHA=0 的周期包括半个时钟空闲和半个时钟置位的周期。

2.CPHA=1,即表示输出 (out) 端在当前时钟周期的前沿改变数据,而输入 (in) 端在时钟周期的后沿(或不久之后)捕获数据。输出端保持数据有效直到下一个时钟周期的前沿。对于最后一个时钟周期来说,从机设备在片选信号消失之前保持 MISO 信号线有效。也就是一个 CHPA=1 的周期包括半个时钟置位和半个时钟空闲的周期。

Note:此处的前沿和后沿的意思表示在每个周期中第一个出现的边沿和最后一个出现的边沿。总的来说则为:当时钟为正向时钟时,时钟线的上升沿为前沿,时钟的下降沿为后沿,反之。

如下表,为 SPI 通信的 4 种模式:

在这里插入图片描述

下图显示了时钟极性和相位的时序图。红线表示时钟的前沿,蓝线表示时钟的后沿。

在这里插入图片描述


比较通俗的解释

SPI 数据的传输是在串行同步时钟信号(Serial Clock,SCK) 的控制下进行的。主机的时钟发生器一方面控制主机的移位寄存器,另一方面通过从机的 SCK 信号线来控制从机的移位寄存器,从而保证主机与从机的数据交换是同步进行的。

SPI 串行同步时钟可以设置为不同的极性(Clock Polarity,CPOL)与相位(Clock Phase,CPHA)。

时钟的极性(CPOL) 用来决定在总线空闲时,同步时钟(SCK)信号线上的电位是高电平还是低电平。当 时钟极性为 0 时(CPOL=0),SCK 信号线在空闲时为低电平当时钟极性为 1 时(CPOL=1), SCK 信号线在空闲时为高电平;

时钟的相位(CPHA) 用来决定何时进行信号采样。
当时钟相位为 1 时(CPHA=1), 在 SCK 信号线的第二个跳变沿进行采样; 这里的跳变沿究竟是上升沿还是
下降沿?取决于时钟的极性。当时钟极性为 0 时,取下降沿;当时钟极性为 1 时,取上升沿;如下图:
在这里插入图片描述


当时钟相位为 0 时(CPHA=O), 在 SCK 信号线的第一个跳变沿进行采样。 跳变沿同样与时钟极性有关:当
时钟极性为 0 时,取上升沿;当时钟极性为 1 时,取下降沿;如下图:
在这里插入图片描述


五、SPI 协议的优缺点

SPI 的优点在于它有着比 I2C 更高的吞吐量,不被最大时钟速度所限制,可实现潜在的高速、极为简单的硬件接口,外围电路使用的上拉电阻是比 I2C 协议更少的,这意味着它比 I2C 的功耗更低、从机的时钟来源来自主机设备,无需新增精密振荡器、从机不需要唯一的地址、相对于并行接口而言,使用的引脚数目大大减少等优点。但同时有着一定的缺点,例如SPI 没有带内寻址、当使用多个不同模式的从机设备时,主机设备切换模式时重新初始化,会使得访问从机设备速度变慢、SPI 从机设备没有硬件流控,只能通过主机自主地延迟下个时钟周期到来的时间、仅能在短距离通信等缺点。但能在避免 SPI 的缺点的方向来应用 SPI 的话,SPI 的优点让它远远优于其他协议。


参考链接:https://baijiahao.baidu.com/s?id=1746087964061209214&wfr=spider&for=pc
参考链接:http://www.founderchip.com/?id=115

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐