1. STM32F103C8T6与SPI协议基础认知
作为嵌入式开发者,拿到STM32F103C8T6这块蓝色小板子时,SPI往往是第一个需要征服的外设接口。这个看似简单的四线制协议(SCK/MOSI/MISO/NSS),在实际应用中却藏着不少门道。SPI全称Serial Peripheral Interface,其本质是一种全双工同步串行总线,最大特点是没有固定的通信速率限制(这点与I2C不同),理论上主控芯片能跑多快,SPI就能传多快。
STM32F103C8T6的SPI外设资源非常典型:
- 支持主/从模式切换
- 8位或16位数据帧格式
- 最高18MHz时钟频率(在72MHz系统时钟下)
- 硬件CRC校验(适用于可靠传输场景)
- 四种工作模式组合(CPOL与CPHA的排列)
硬件设计警示:虽然SPI协议本身没有上拉电阻要求,但实际使用中NSS(片选)引脚建议加上拉电阻,避免电平不定导致意外片选。这个细节在开源最小系统板上常被忽略。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CubeMX配置SPI的实战陷阱
使用STM32CubeMX生成初始化代码时,新手常会掉进几个坑里。首先是时钟配置的连环套——APB2总线上的SPI1(36MHz)和APB1总线上的SPI2(18MHz)有着不同的速度上限。我曾亲眼见过有人把SPI2配置成24MHz导致数据错乱,还以为是硬件问题。
SPI模式选择更是重灾区:
- Mode0(CPOL=0, CPHA=0):SCK空闲低电平,第一个边沿采样
- Mode3(CPOL=1, CPHA=1):SCK空闲高电平,第二个边沿采样
c复制// CubeMX生成的典型配置代码
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0
hspi1.Init.NSS = SPI_NSS_SO
