一、前言
SPI(Serial Peripheral Interface,串行外设接口)是一种高速的、全双工、主从结构的串行通信协议。在嵌入式系统中,常用于连接 Flash、显示屏、传感器、SD 卡等外设。
STM32F103C8T6 提供了三个 SPI 外设(SPI1、SPI2、SPI3),本篇以 SPI1 为例,讲解如何通过 STM32 标准外设库实现 SPI 主机通信功能。
二、SPI 通信原理简述
SPI 通信由四根信号线组成:
信号线 | 说明 |
---|---|
SCLK | 时钟线,由主设备提供 |
MOSI | 主设备数据输出 |
MISO | 主设备数据输入 |
NSS | 片选信号,低电平有效 |
SPI 特点:
- 主从结构:由主机产生时钟并控制通信
- 全双工传输:可边发送边接收
- 多种工作模式(CPOL、CPHA 可配置)
三、硬件连接说明
以 SPI1 为例,其对应的引脚如下:
引脚功能 | STM32 引脚 | 描述 |
---|---|---|
SCK | PA5 | 时钟线 |
MISO | PA6 | 主机输入 |
MOSI | PA7 | 主机输出 |
NSS | PA4 | 手动控制片选信号 |
注意:如果使用软件控制 NSS,请将 NSS 管脚配置为普通 GPIO 输出。
四、SPI 初始化配置
1. GPIO 初始化
void SPI1_GPIO_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
// SCK, MOSI 配置为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// MISO 配置为浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// NSS 手动片选(GPIO 输出)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.