stm32之SPI

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总线时钟(APB1APB2,取决于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_CR1 BR[2:0] 波特率预分频设置(见下表)
SPI_CR2 DS[3:0] 数据位数(需与波特率协调)

预分频系数对照表

BR[2:0] 分频值 SCK频率(APB=72MHz时)
000 2 36 MHz
001 4 18 MHz
010 8 9 MHz
011 16 4.5 MHz
100 32 2.25 MHz
101 64 1.125 MHz
110 128 562.5 kHz
111 256 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]=010
4. 时钟树关联
  • 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. 注意事项
  1. 从设备兼容性:SCK频率不得超过从设备的最大时钟频率(如Flash芯片可能限制在10MHz)。
  2. 噪声抑制:高频时需缩短走线长度,必要时加终端电阻。
  3. 低功耗模式:在睡眠模式下,APB时钟可能关闭,需重新初始化SPI。
SPI基本结构
主模式全双工连续传输
非连续传输
软件/硬件波形对比
相关推荐
✎ ﹏梦醒͜ღ҉繁华落℘2 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
牛根生同志2 天前
SPI数据收发的时候 TXE与RXNE标志位置位的时机
stm32·spi·transfer
goldenrolan2 天前
学习型红外控制系统稳定性挂测工装专项总结
软件测试·python·stm32·嵌入式·红外
CC城子2 天前
STM32H7_FDCAN 驱动笔记
stm32·can·canfd
意法半导体STM322 天前
【官方原创】如何为STM32CubeMX2配置Visual Studio Code配置方案
vscode·stm32·单片机·嵌入式硬件·策略模式·stm32cubemx·嵌入式开发
雾削木2 天前
B语言经典教程现代化重构
java·前端·stm32·单片机·嵌入式硬件
Digitally2 天前
如何快速将文件从电脑传输到平板电脑
stm32·嵌入式硬件·电脑
项目題供诗2 天前
STM32-USART串口协议(二十二)
stm32·单片机·嵌入式硬件
欢乐熊嵌入式编程2 天前
选型避坑:ESP32 vs STM32+模组 vs NB-IoT,不同场景怎么选
stm32·单片机·嵌入式硬件·物联网·esp32·嵌入式iot
振南的单片机世界2 天前
ARM中断比51快在哪?硬件压栈+NVIC集中管理
arm开发·stm32·单片机·嵌入式硬件