SPI通信
- SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
- 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)
- 同步,全双工
- 支持总线挂载多设备(一主多从)
硬件电路
- 所有SPI设备的SCK、MOSI、MISO分别连在一起
- 主机另外引出多条SS控制线,分别接到各从机的SS引脚
- 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

移位示意图

SPI时序基本单元
- 起始条件:SS从高电平切换到低电平
- 终止条件:SS从低电平切换到高电平

- 交换一个字节(模式0)
- CPOL=0:空闲状态时,SCK为低电平
- CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据 ==移入数据意思是主机和从机进行数据采样,移出数据理解为将数据移到数据线上。==

- 交换一个字节(模式1)
- CPOL=0:空闲状态时,SCK为低电平
- CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

- 交换一个字节(模式2)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

- 交换一个字节(模式3)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

SPI时序
- 发送指令
- 向SS指定的设备,发送指令(0x06)

- 指定地址写
- 向SS指定的设备,发送写指令(0x02), 随后在指定地址(Address23:0)下,写入指定数据(Data)

- 指定地址读
- 向SS指定的设备,发送读指令(0x03), 随后在指定地址(Address23:0)下,读取从机数据(Data)

SPI外设简介
- STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担
- 可配置8位/16位数据帧、高位先行/低位先行
- 时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)
- 支持多主机模型、主或从操作
- 可精简为半双工/单工通信
- 支持DMA
- 兼容I2S协议
- STM32F103C8T6 硬件SPI资源:SPI1、SPI2
SPI框图

STM32的硬件SPI模块内置了一个可编程波特率发生器,用于控制SCK时钟线的频率。其核心机制如下:
1. 波特率发生器原理
时钟源 :来自APB总线时钟(
APB1或APB2,取决于SPI实例)。分频器 :通过
SPI_CR1寄存器的BR[2:0]位(即BaudRatePrescaler)配置分频系数。计算公式 :
SCK 频率=APB 时钟2(BR2:0+1)SCK 频率=2(BR2:0+1)APB 时钟
其中BR[2:0]取值范围为0b000~0b111(对应分频系数2~256)。2. 关键寄存器(以SPI1为例)
寄存器 位域 功能 SPI_CR1BR[2:0]波特率预分频设置(见下表) SPI_CR2DS[3:0]数据位数(需与波特率协调) 预分频系数对照表:
BR[2:0]分频值 SCK频率(APB=72MHz时) 0002 36 MHz 0014 18 MHz 0108 9 MHz 01116 4.5 MHz 10032 2.25 MHz 10164 1.125 MHz 110128 562.5 kHz 111256 281.25 kHz 3. 配置示例(HAL库)
c
hspi1.Instance = SPI1; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // BR[2:0]=010 (8分频) HAL_SPI_Init(&hspi1);等效寄存器操作:
c
SPI1->CR1 |= (0b010 << 3); // 设置BR[2:0]=0104. 时钟树关联
- SPI1/SPI4:挂载在APB2总线(通常频率较高,如72MHz)。
- SPI2/SPI3:挂载在APB1总线(通常频率较低,如36MHz)。
mermaid
graph LR A[系统时钟] --> B[APB2 Prescaler] B -->|72MHz| C[SPI1] A --> D[APB1 Prescaler] D -->|36MHz| E[SPI2]5. 波特率极限
条件 最大SCK频率 APB2=72MHz, BR=2 36 MHz APB1=36MHz, BR=2 18 MHz 实际器件支持(如W25Q128) 通常≤25MHz(需看手册) 6. 注意事项
- 从设备兼容性:SCK频率不得超过从设备的最大时钟频率(如Flash芯片可能限制在10MHz)。
- 噪声抑制:高频时需缩短走线长度,必要时加终端电阻。
- 低功耗模式:在睡眠模式下,APB时钟可能关闭,需重新初始化SPI。
SPI基本结构

主模式全双工连续传输

非连续传输

软件/硬件波形对比
