首页/协议速查/SPI 协议
🔷

SPI 协议 同步串行

板内总线
同步时钟采样、全双工、可到百MHz的板内总线,注意时序模式匹配。
🧩 核心原理
📈 时序 / 工作过程图
SPI 时序(模式0:CPOL=0, CPHA=0)CS低有效片选 → SCK上升沿主机输出/下降沿采样 → 全双工同时收发CSSCKMOSID7D6D5D4D3D2D1D0
⚙️ 配置 / 使用要点
  1. 配模式0-3:CPOL/CPHA 查从机数据手册
  2. 配位序 MSB/LSB、速率
  3. 收发同时进行(全双工),读命令需发哑字节
  4. 片选时序:先CS低→时钟→CS高
🛠️ 项目示例
SPI 模式匹配与读寄存器(以传感器为例)
// 从机手册要求:CPOL=1, CPHA=0 → SPI 模式2
hspi.Init.CLKPolarity = SPI_POLARITY_HIGH;   // CPOL=1
hspi.Init.CLKPhase = SPI_PHASE_1EDGE;        // CPHA=0
HAL_SPI_Init(&hspi);

// 读 0x0F 寄存器:发地址(读标志0x80|addr) + 哑字节收数
uint8_t tx[2] = {0x80 | 0x0F, 0xFF};
uint8_t rx[2] = {0};
HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi, tx, rx, 2, 100);
HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET);
uint8_t reg = rx[1];
❓ 面试高频
SPI模式0和模式3区别?
CPOL不同:模式0空闲低+前沿采样;模式3空闲高+前沿采样。数据在上升沿/下降沿的变化相对SCK边沿不同
为什么SPI读要发0xFF?
全双工:主发1收1,读寄存器必须同时发数据产生时钟,哑字节(0xFF/0x00)占位
CS为什么不能一直拉低?
多从机共享总线时靠CS选择;持续选中会占用总线,且部分器件CS上升沿锁存/复位内部状态
✅ 自查清单 (点击勾选,本地保存)
0/0
知道4种模式CPOL/CPHA
会配模式匹配从机
知道读寄存器发哑字节
知道多从机CS管理
知道全双工特性