SPI协议详解与STM32配置指南
1. SPI协议基础
SPI(Serial Peripheral Interface) 是一种同步、全双工的串行通信协议,常用于微控制器与外围设备(如传感器、存储器、显示屏等)之间的高速数据传输。
2. SPI vs UART 核心区别
特性 | SPI | UART |
---|---|---|
通信方式 | 同步(需时钟信号) | 异步(无需时钟) |
全双工 | 支持同时发送和接收 | 通常半双工 |
信号线 | 4根(SCK, MOSI, MISO, CS) | 2根(TX, RX) |
拓扑结构 | 主从结构,一主多从 | 点对点 |
速度 | 高速(可达数十MHz) | 较低速(通常<1Mbps) |
3. SPI硬件连接与信号线
- SCK(Serial Clock):主设备输出的时钟信号,同步数据传输。
- MOSI(Master Out Slave In):主设备发送数据到从设备的线路。
- MISO(Master In Slave Out):从设备发送数据到主设备的线路。
- CS/SS(Chip Select):主设备控制从设备片选的信号(低电平有效)。
4. SPI关键配置参数
4.1 时钟极性(CPOL)与相位(CPHA)
CPOL(Clock Polarity):决定SCK空闲时的电平。
- CPOL=0:空闲时SCK为低电平。
- CPOL=1:空闲时SCK为高电平。
CPHA(Clock Phase):决定数据采样的时刻。
- CPHA=0:数据在SCK的第一个边沿(上升或下降)采样。
- CPHA=1:数据在SCK的第二个边沿采样。
四种模式组合:
模式 | CPOL | CPHA | 数据采样边沿 |
---|---|---|---|
0 | 0 | 0 | SCK上升沿采样 |
1 | 0 | 1 | SCK下降沿采样 |
2 | 1 | 0 | SCK下降沿采样 |
3 | 1 | 1 | SCK上升沿采样 |
4.2 数据帧格式
- 数据位长度:通常为8位或16位,STM32支持4-16位可配置。
- 传输顺序:MSB(高位在前)或LSB(低位在前)。
4.3 传输模式
- 主模式(Master):生成SCK时钟,控制数据传输。
- 从模式(Slave):响应主设备的SCK,被动传输数据。
5. STM32 SPI寄存器详解
以STM32F103为例,关键寄存器如下:
5.1 SPI控制寄存器1(SPI_CR1)
位域 | 功能 |
---|---|
DFF | 数据帧格式:0=8位,1=16位 |
LSBFIRST | 传输顺序:0=MSB,1=LSB |
MSTR | 主从模式:1=主模式,0=从模式 |
CPOL | 时钟极性 |
CPHA | 时钟相位 |
BR[2:0] | 波特率分频系数(见下表) |
SPE | SPI使能:1=启用 |
波特率分频系数(BR[2:0]):
BR值 | 分频系数 | 波特率(假设APB2=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 |
5.2 SPI控制寄存器2(SPI_CR2)
位域 | 功能 |
---|---|
SSOE | 从设备选择输出使能(主模式) |
TXEIE | 发送缓冲区空中断使能 |
RXNEIE | 接收缓冲区非空中断使能 |
5.3 SPI状态寄存器(SPI_SR)
位域 | 功能 |
---|---|
RXNE | 接收缓冲区非空(数据可读) |
TXE | 发送缓冲区空(可写入新数据) |
BSY | 总线忙标志(传输中) |
5.4 SPI数据寄存器(SPI_DR)
- 写入数据时启动发送,读取时获取接收数据。
6. STM32 SPI配置步骤(主模式示例)
目标:配置SPI1为主模式,CPOL=0,CPHA=0,8位数据,波特率18MHz(APB2=72MHz)。
1. 使能时钟:
1 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); |
2. 配置GPIO(以PA5=SCK, PA7=MOSI, PA6=MISO):
1 | GPIO_InitTypeDef GPIO_InitStruct; |
3. 配置SPI_CR1:
1 | SPI_InitTypeDef SPI_InitStruct; |
4. 使能SPI:
1 | SPI_Cmd(SPI1, ENABLE); |
7. SPI数据传输流程(轮询方式)
1 | // 拉低片选信号(假设CS引脚为PA4) |
8. 验证SPI配置的关键点
1. 信号测量:
- 使用逻辑分析仪或示波器检查SCK、MOSI、MISO波形。
- 确认SCK频率是否符合预期(如18MHz)。
- 检查CPOL和CPHA是否与从设备匹配。
2. 回环测试:
- 将MOSI与MISO短接,发送数据并验证接收是否一致。
3. 错误处理:
- 监控
SPI_SR
中的错误标志(如OVR
溢出错误)。
9. 常见问题与解决
问题:SPI无输出信号。
解决:检查SPI是否使能(SPE=1),GPIO是否配置为复用模式。问题:数据错位或错误。
解决:确认CPOL/CPHA设置,检查时钟分频和数据位顺序。问题:从设备无响应。
解决:验证片选信号(CS)是否有效,硬件连接是否正常。
本文作者:
ICXNM-ZLin
本文链接: https://talent-tudou.github.io/2025/02/26/外设/SPI模块/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
本文链接: https://talent-tudou.github.io/2025/02/26/外设/SPI模块/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!