SPI

SPI

1. SPI介绍

Serial Peripheral interface(串行外围设备接口),是Motorola首先在其MC68HCXX系列处理器上定义的,是一种高速的,全双工,同步的串行通信总线。

SPI接口主要应用于EEPROM,FLASH,各种传感器,AD转换器等。

1个SPI设备一般有4条线 (SCK,MOSI,MISO,SS)

  • SCK:时钟信号线,用于通讯数据同步。

    • 它由通讯主机(MCU)产生,决定了通讯的速率。
    • 不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 fpclk/2。
    • 两个设备之间通讯时,通讯速率受限于低速设备。
  • MOSI:主设备输出/从设备输入引脚。

    • 主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,
    • 这条线上数据的方向为主机到从机。
  • MISO:主设备输入/从设备输出引脚。

    • 主机从这条信号线读入数据,从机的数据由这条信号线输出到主机。
    • 在这条线上数据的方向为从机到主机。
  • SS:片选线或者使能线。有时候也称NSS或CS。

    • SPI通信时各个设备是没有地址的
    • 主机和哪个从机通讯,就把谁的SS置为低电平。
    • 如果要主机要连接多条从设备就需要多条片选线。

只能主从设备之间进行通信,从与从之间是无法进行通信的。

有几个从机就要有几个片选线

image-20250422184058884

2. SPI工作原理

STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 fpclk/2 (STM32F103 型号的芯片默认fpclk1为36MHz,fpclk2为72MHz。),完全支持 SPI 协议的 4 种模式,数据帧长度可设置为 8 位或 16 位,可设置数据 MSB 先行或 LSB 先行。它还支持双线全双工、单线双向以及单线模式。

STM32F103系列提供了3个SPI,SPI1挂在APB2总线,SPI2/3挂在APB1总线。

用的比较多还是双线全双工模式

image-20250423201309401

image-20250423203709400

  • 波特率发生器用于生成通信的同步时钟。
  • NSS是片选信号
    • 可以硬件自动控制
    • 也可以使用软件控制。
  • 移位寄存器临时存储要交换的数据(来自于发送缓冲区)
    • 按位通过MOSI把数据发送出去。
    • 按位把通过MISO接收的数据存入到移位寄存器。
    • 接收数据完毕,数据被送入到接收缓冲区
  • 来一个时钟上升沿信号,主机和从机分别把自己高位的值左移出来(一般高位先行)。
  • 来一个时钟下降沿信号,主机和从机分别读入数据,存储到移位寄存器的低位。
  • 经过8次同样的操作,就完成了一个字节的交换。
  • 最后从接收缓冲区就可以读出数据。

image-20250423202720372

3. 时钟的极性和相位

  • CPOL(Clock Polarity)通信的整个过程分为空闲时刻和通信时刻。

    • 空闲状态 SCK 是低电平,CPOL=0。

    • 空闲状态 SCK 是高电平,CPOL=1。

image-20250423203356667

  • CPHA(Clock Phase)直接决定SPI总线从哪个跳变沿开始采样数据。
    • CPHA = 0:表示从第一个跳变沿开始采样。
    • CPHA = 1:表示从第二个跳变沿开始采样。

image-20250423203515889

时钟的2种极性和2种相位的不同组合,得到了SPI的4种工作模式

MODE CPOL CPHA
0 0 0
1 0 1
2 1 0
3 1 1

image-20250423203739850