1. SPI通信协议深度解析
SPI(Serial Peripheral Interface)作为一种高速全双工同步串行通信协议,在嵌入式系统和硬件开发中占据着不可替代的地位。我第一次接触SPI是在2013年开发智能家居控制器时,当时需要驱动一块TFT显示屏,对比了I2C和SPI后,最终选择了SPI方案——这个决定让我深刻体会到了SPI在速度和可靠性上的优势。
SPI协议由Motorola在1980年代提出,经过几十年的发展已经成为硬件工程师的必备技能。与UART和I2C相比,SPI最大的特点是采用主从架构和全双工通信,时钟速度可达数十MHz,特别适合显示器、存储设备、传感器等对实时性要求高的外设连接。在实际项目中,SPI接口的灵活性和可扩展性常常能解决许多棘手的问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SPI协议核心机制
2.1 四线制基础架构
标准SPI协议采用四线制连接方式:
- SCLK(Serial Clock):主设备产生的同步时钟信号
- MOSI(Master Out Slave In):主设备输出,从设备输入
- MISO(Master In Slave Out):从设备输出,主设备输入
- SS/CS(Slave Select/Chip Select):从设备片选信号(低电平有效)
重要提示:实际布线时,SCLK线要尽可能短并远离高频干扰源,我在多个项目中都遇到过因时钟信号质量问题导致的通信失败案例。
2.2 时钟极性与相位
SPI模式由CPOL(Clock Polarity)和CPHA(Clock Phase)两个参数决定,组合出四种工作模式:
| 模式 | CPOL | CPHA | 时钟空闲状态 | 数据采样边沿 |
|---|---|---|---|---|
| 0 | 0 | 0 | 低电平 | 上升沿 |
| 1 | 0 | 1 | 低电平 | 下降沿 |
| 2 | 1 | 0 | 高电平 | 下降沿 |
| 3 | 1 | 1 | 高电平 | 上升沿 |
在STM32开发中,我习惯使用Mode 0(CPOL=0, CPHA=0)作为默认配置,因为大多数SPI Flash和显示模块都兼容这种模式。但遇到ADXL345加速度传感器时,必须切换到Mode 3才能正常通信——这个坑让我调试了整整一个下午。
2.3 多从机扩展方案
SPI支持三种多从机连接方式:
- 独立片选:每个从设备有独立的CS线,主设备通过拉低对应CS线选择通信对象
- 菊花链:多个从设备串联,数据依次传递(
