SPI(Serial Peripheral Interface)是串行外设接口的缩写,SPI是一种高速的、全双工、同步的串行通信总线,由摩托罗拉公司(Motorola)于 20 世纪 80 年代提出,主要用于短距离内的芯片间通信,广泛应用于传感器、存储器、显示屏、ADC/DAC 等外设与微控制器(MCU)的连接。

 

1. SPI 协议的基本特点

  1. 串行通信:一次发送1bit数据。
  2. 同步通信:通过时钟信号(SCLK)同步数据传输,发送方和接收方基于同一时钟工作。
  3. 全双工通信:数据可以同时双向传输(主设备发送的同时接收,从设备接收的同时发送)。
  4. 单主多从架构:通常由一个主设备(如 MCU)控制多个从设备(如传感器),从设备不能主动发起通信。
  5. 无地址机制:通过片选信号(CS/NSS)选择目标从设备,而非通过地址识别。
  6. 灵活的数据长度:数据传输位数可自定义(常见 8 位,也支持 16 位、32 位等)。
  7. 高速传输:速率通常可达几 Mbps 到几十 Mbps,具体取决于器件支持的最大时钟频率。

2. SPI的信号线组成

SPI从器件一般需要4根线(也有3根线的,单工,只有接收或者只有发送),分别是MISO(主设备输入从设备输出)、MOSI(主设备输出从设备输入)、SCLK(时钟)、CS(片选);SPI使用引脚较少且布线方便,所以越来越多的芯片集成了这种通信协议。

 

3. 寻址方式

当主设备要和某个从设备进行通信时,主设备需要先向对应从设备的片选线上发送使能信号(高电平或者低电平,根据从机而定)表示选中该从设备。

 

4.  通信过程

SPI总线在进行数据传送时,先传送高位,后传送低位;数据线为高电平表示逻辑"1",低电平表示逻辑"0";一个字节传送完成后无需应答即可开始下一个字节的传送;SPI总线采用同步方式工作,时钟线在上升沿或下降沿时发送器向数据线上发送数据,在紧接着的下降沿或者上升沿时接收器从数据线上读取数据,完成一位数据传送,八个时钟周期即可完成一个字节数据的传送。

 

5. 极性和相位

SPI总线有四种不同的工作模式,取决于时钟的极性(CPOL,Clock Polarity)和相位(CPHA,Clock Phase)这两个因素。

  • CPOL表示SCLK空闲时的状态:

    • CPOL=0,空闲时SCLK为低电平;

    • CPOL=1,空闲时SCLK为高电平;

  • CPHA表示采样时刻:

    • CPHA=0,每个周期的第一个时钟沿采样;

    • CPHA=1,每个周期的第二个时钟沿采样;

5.1 CPOL=0, CPHA=0

空闲时SCLK为低电平;每个周期的第一个时钟沿采样,也就是上升沿。

 

注:*MSB表示前一帧的MSB。

 

5.2 CPOL=0, CPHA=1

空闲时SCLK为低电平;每个周期的第二个时钟沿采样。

 

注:LSB*表示下一帧的LSB。

5.3 CPOL=1, CPHA=0

空闲时SCLK为高电平;每个周期的第一个时钟沿采样。

 

注:*MSB表示前一帧的MSB。

5.4 CPOL=1, CPHA=1

空闲时SCLK为高电平;每个周期的第二个时钟沿采样。

 

注:LSB*表示下一帧的LSB。

需要说明的是,对于一个特定的从设备来说,一般在出厂时就会将其设计为某种特定的工作模式;我们在使用该设备时就必须保证主设备的工作模式和该从设备保持一致,否则是无法进行通信的;所以一般我们需要对主设备的CPOL和CPHA进行配置。

6. I2C和SPI的异同

  • 相同点

    1. 均采用串行、同步的方式

    2. 均采用TTL电平,传输距离和应用场景类似

    3. 均采用主从方式工作

  • 不同点

    1. I2C为半双工,SPI为全双工

    2. I2C有应答机制,SPI无应答机制

    3. I2C通过向总线广播从机地址来寻址,SPI通过向对应从机发送使能信号来寻址

    4. I2C的时钟极性和时钟相位固定,SPI的时钟极性和时钟相位可调