3. SPI协议基础:SPI总线物理层、MOSI/MISO/SCLK/CS信号、四种工作模式(CPOL/CPHA)
3.1 SPI总线物理层结构
SPI(Serial Peripheral Interface,串行外设接口)是一种全双工、同步、主从架构的串行通信总线。物理层由四条基本信号线构成,所有设备共享时钟与数据线,通过片选信号实现设备寻址。
核心特征: 全双工通信、主设备产生时钟、无设备地址(通过硬件片选)、传输速率可达数十MHz。
3.2 四线信号详解
| 信号名称 | 全称 | 方向 | 功能描述 |
|---|---|---|---|
| SCLK | Serial Clock | 主→从 | 由主设备产生,决定数据传输速率。每个时钟周期传输1位数据。 |
| MOSI | Master Out Slave In | 主→从 | 主设备发送数据至从设备的数据线。 |
| MISO | Master In Slave Out | 从→主 | 从设备发送数据至主设备的数据线。 |
| CS | Chip Select | 主→从 | 片选信号,低电平有效。主设备通过拉低目标从设备的CS引脚来选中该设备。 |
设计要点: 在S32K3平台上,CS信号通常由硬件自动控制(SPI外设的PCS引脚),也可配置为GPIO软件控制。硬件控制可减少CPU开销,但软件控制提供更大的灵活性,适用于多从设备动态切换场景。
3.3 SPI四种工作模式(CPOL/CPHA)
SPI协议通过时钟极性(CPOL)和时钟相位(CPHA)的组合定义四种工作模式。CPOL决定时钟空闲电平,CPHA决定数据采样时刻。
| 模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 | 数据输出边沿 |
|---|---|---|---|---|---|
| 模式0 | 0 | 0 | 低电平 | 上升沿 | 下降沿 |
| 模式1 | 0 | 1 | 低电平 | 下降沿 | 上升沿 |
| 模式2 | 1 | 0 | 高电平 | 下降沿 | 上升沿 |
| 模式3 | 1 | 1 | 高电平 | 上升沿 | 下降沿 |
3.4 模式选择与S32K3配置
在S32K3平台上,SPI模式通过寄存器CTARn(Clock and Transfer Attributes Register)中的CPOL和CPHA位进行配置。主设备与从设备必须使用相同的模式才能正常通信。
常见错误: 主从设备模式不匹配是SPI通信失败的首要原因。调试时务必使用示波器或逻辑分析仪确认SCLK空闲电平与数据采样边沿是否符合预期。
S32K3 SPI模式配置示例(LPSPI外设)
/* S32K3 LPSPI模式配置代码片段 */
#include "lpspi_driver.h"
lpspi_user_config_t spiConfig;
/* 配置为模式0:CPOL=0, CPHA=0 */
spiConfig.clockPolarity = LPSPI_CLOCK_POLARITY_ACTIVE_HIGH; /* CPOL=0 */
spiConfig.clockPhase = LPSPI_CLOCK_PHASE_FIRST_EDGE; /* CPHA=0 */
spiConfig.dataWidth = LPSPI_DATA_WIDTH_8_BIT;
spiConfig.baudRate = 1000000; /* 1 MHz */
/* 初始化LPSPI外设 */
LPSPI_DRV_MasterInit(INST_LPSPI1, &spiConfig, NULL);
3.5 SPI通信流程
- 片选阶段:主设备将目标从设备的CS引脚拉低,选中该从设备。
- 时钟启动:主设备开始产生SCLK时钟信号,频率由CTAR寄存器配置。
- 数据移位:每个时钟周期,主设备通过MOSI发送1位数据,同时从设备通过MISO发送1位数据,实现全双工传输。
- 传输完成:主设备停止SCLK时钟,将CS引脚拉高,释放从设备。
3.6 SPI与I2C物理层对比
| 对比项 | SPI | I2C |
|---|---|---|
| 信号线数量 | 4线(SCLK, MOSI, MISO, CS) | 2线(SCL, SDA) |
| 通信方式 | 全双工 | 半双工 |
| 设备寻址 | 硬件片选(CS) | 软件地址(7位/10位) |
| 最大速率 | 数十MHz(S32K3可达20MHz+) | 标准100kHz/快速400kHz/高速3.4MHz |
| 从设备数量 | 受限于主设备CS引脚数量 | 理论上最多127个(7位地址) |
| 总线冲突检测 | 无(需软件处理) | 内置仲裁与冲突检测 |
选型建议: 在S32K3平台中,若外设需要高速、全双工通信(如ADC、DAC、显示驱动),优先选择SPI;若需要多设备挂载、线束简单、支持多主通信(如传感器网络、EEPROM),优先选择I2C。