什么是SPI通讯?

SPI(Serial Peripheral Interface,串行外设接口)是一种数据通讯协议,它属于同步串行通讯协议,并且是全双工通信方式。

主要用于短距离通讯,尤其是在单个主设备和多个从设备之间。由于其简单的硬件接口和高数据传输速率,SPI在各种应用场景中都有广泛的用途,包括但不限于传感器数据读取、存储器接口和面板显示。广泛应用于小型嵌入式系统与物联网中。

SPI与RS-232、RS-232、RS-485、1-Wire、I2C、USB、ThunderBolt一样属于外设接口。其通讯速率只小于USB、ThunderBolt。

工作原理

主从模型(Master-Slave Model)

在SPI通讯系统中,主从模型是一种核心的组织结构。系统内有一个主设备(Master)和一个或多个从设备(Slave)。

主设备(Master)

主设备负责控制整个通讯过程。它生成时钟信号(SCLK),并通过片选(Chip Select, CS)线来选择与哪一个从设备进行通讯。主设备也是数据传输的发起者,它发送命令并请求从设备的数据。主设备决定SPI通讯的速率。

从设备(Slave)

从设备则是被控制的设备,只有在主设备的授权下才会进行数据传输。从设备不能自己生成时钟信号,也不能初始化与其他设备的通讯。

主设备与从设备的连接

  1. 单主设备对单一从设备
SPI\_single\_slave.svg.png
SPI_single_slave.svg.png
  1. 单主设备对多个从设备
600px-SPI\_three\_slaves.svg.png
600px-SPI_three_slaves.svg.png

举例说明

假设我们有一个简单的嵌入式系统,其中包括一个微控制器(作为主设备)和几个传感器(如温度传感器、湿度传感器等,作为从设备)。

mermaid-diagram-2023-10-21-204139.png
mermaid-diagram-2023-10-21-204139.png
  • 初始化阶段: 微控制器通过片选(CS)线选择想要通讯的传感器。比如,如果微控制器想要读取温度数据,它会通过拉低与温度传感器相连的CS线来选择这个传感器。
  • 数据请求: 然后,微控制器在MOSI(Master Out Slave In)线上发送一个请求温度数据的命令。
  • 数据接收: 温度传感器接收到命令后,在MISO(Master In Slave Out)线上发送相应的温度数据回微控制器。
  • 结束通讯: 数据传输完成后,微控制器会通过将CS线拉高来结束与该传感器的通讯。

这样,通过主从模型,微控制器(主设备)能够有效地控制与多个传感器(从设备)之间的数据交换,确保系统的高效和有序运行。

四根线

SPI通常需要用到四根线:

  1. MISO(Master In Slave Out): 用于从设备到主设备的数据传输。
  2. MOSI(Master Out Slave In): 用于从主设备到从设备的数据传输。
  3. SCLK(Serial Clock): 由主设备生成的时钟信号。
  4. CS(Chip Select): 用于选择特定的从设备进行通信。

数据传输

数据传输通常以帧为单位进行。在每一个时钟周期中,主设备和从设备分别在MOSI和MISO线上发送和接收一个数据位。

在每个SPI时钟周期内,都会发生全双工数据传输。主设备在MOSI线上发送一个位,从设备读取它,同时从机在MISO线上发送一位数据,主机读取它。即使只有单向数据传输的目的,主从机之间的通信工作方式仍然是双工的。

SPI\_8-bit\_circular\_transfer.svg.png
SPI_8-bit_circular_transfer.svg.png

图:两个连接成虚拟环形缓冲器的移位寄存器

传输通常会使用给定字长的两个移位寄存器,一个在主设备中,一个在从设备中,这两个寄存器连接成一个虚拟的环形缓冲器。数据通常先从最高位移出。在时钟讯号边沿,主机和从机均移出一位,然后在传输线上输出给对方。在下一个时钟沿,每个接收器都从传输线接受对方发出的数据位,并且从移位寄存器的最低位推入。每完成这样一个移出——推入的周期后,主机和从机就交换寄存器中的一位数据。当所有数据位都经过了这样的移出——推入过程后,主机和从机就完成了寄存器上的数据交换。

全双工通信

由于MISO和MOSI线同时用于数据传输,SPI支持全双工通信,即在同一时间,数据可以同时在两个方向上流动。

通过这种方式,SPI实现了一种快速、高效且灵活的数据传输机制。它不仅用于连接各种各样的外设,还经常用作不同嵌入式组件之间的通信桥梁。

SPI的模式(MODE)

SPI 有四种模式,分别由两个属性决定:时钟极性 (CPOL) 和时钟相位 (CPHA)。

1 CPOL (Clock Polarity): 时钟极性决定了空闲时刻的时钟信号电平。

  • CPOL = 0: 时钟线在空闲时为低电平。
  • CPOL = 1: 时钟线在空闲时为高电平。

2 CPHA (Clock Phase): 时钟相位决定了数据在时钟的哪个边沿上被采样。

  • CPHA = 0: 数据在第一个(前沿)边沿上被采样。
  • CPHA = 1: 数据在第二个(后沿)边沿上被采样。

⠀结合上述属性,我们可以得到四种不同的模式:

  • Mode 0 (0,0) - CPOL = 0
  • CPHA = 0
  • 数据在时钟的上升沿被采样,数据在下升沿改变。
  • Mode 1 (0,1) - CPOL = 0
  • CPHA = 1
  • 数据在时钟的下降沿被采样,数据在上升沿改变。
  • Mode 2 (1,0) - CPOL = 1
  • CPHA = 0
  • 数据在时钟的下降沿被采样,数据在上升沿改变。
  • Mode 3 (1,1) - CPOL = 1
  • CPHA = 1
  • 数据在时钟的上升沿被采样,数据在下降沿改变。
spi-modes.png
spi-modes.png

虽然mode0与mode3都是在上升沿检测、mode1与mode2都是在下降沿检测。但是其在空闲时的电平高低是有区别的。

选择合适的模式通常取决于外围设备的要求。在设计系统时,必须确保主设备和从设备在同一模式下工作,以确保数据的正确传输。