1. SPI总线基础与STM32实现架构
在嵌入式开发领域,SPI(Serial Peripheral Interface)总线因其全双工、高速同步的特性,成为连接Flash存储器、显示屏、传感器等外设的首选方案。STM32F1系列基于Cortex-M3内核,其SPI外设支持主/从模式切换、8/16位数据帧格式以及最高18MHz的通信速率。硬件上采用四线制设计:
- SCK(Serial Clock):时钟信号线,由主设备产生
- MOSI(Master Out Slave In):主设备输出从设备输入
- MISO(Master In Slave Out):主设备输入从设备输出
- NSS(Slave Select):从设备片选信号(可硬件或软件控制)
实际布线时需注意:SCK走线要尽量短且避免锐角转折,高频信号下阻抗匹配不良会导致波形畸变。我曾在一个电机控制项目中,因SCK走线过长导致SPI Flash读写错误,最终通过缩短走线距离并添加33Ω端接电阻解决。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STM32F1的SPI寄存器精解
2.1 控制寄存器组剖析
STM32F1的SPI外设通过CR1/CR2寄存器实现精细控制:
c复制typedef struct {
__IO uint32_t CR1; // 控制寄存器1
__IO uint32_t CR2; // 控制寄存器2
__IO uint32_t SR; // 状态寄存器
__IO uint32_t DR; // 数据寄存器
__IO uint32_t CRCPR; // CRC多项式寄存器
__IO uint32_t RXCRCR; // 接收CRC寄存器
__IO uint32_t TXCRCR; // 发送CRC寄存器
__IO uint32_t I2SCFGR;// I2S配置寄存器
__IO uint32_t I2SPR; // I2S预分频寄存器
} SPI_TypeDef;
关键位域配置示例:
- CR1[15:13] BR[2:0]:波特率分频系数
计算公式:f_PCLK / 2^(BR+1)
例如PCLK=72MHz时,BR=0b101对应分频系数64,得SCK=1.125MHz - CR1[1] C
