第四章 SPI总线接口验证:主从模式、时钟极性与全双工通信

SPI 总线,说实话,是我在嵌入式调试中打交道最多的接口之一。它简单、高效,但坑也不少。很多工程师觉得 SPI 不就是四根线嘛,连上就能跑。嗯,真这么想的人,多半在示波器前熬过夜。

这一章,我们就把 SPI 的验证方法掰开揉碎了讲。从主从模式配置,到 CPOL/CPHA 的时钟陷阱,再到多从机片选的时序配合。我会把项目中踩过的坑,直接摆在你面前。

4.1 SPI 主从模式配置验证

SPI 通信,主设备负责产生时钟,从设备被动响应。这个关系一旦搞反,数据就全乱了。

验证要点:

  • 主设备时钟输出:用示波器测量 SCK 引脚,确认频率和占空比符合预期
  • 从设备时钟输入:从设备必须能正确接收外部时钟,不能自己产生
  • 片选信号:主设备主动拉低 CS,从设备检测到低电平后才响应

核心原则:主设备是时钟的“老板”,从设备是“员工”。老板不发话(时钟),员工不能干活。

我遇到过一种情况:某款从设备芯片,手册上说支持 SPI,结果死活不通。后来用逻辑分析仪一看,它竟然在内部自己产生了时钟。说白了,那是个伪 SPI 设备,只能用 GPIO 模拟。

4.2 时钟极性(CPOL)与相位(CPHA)测试

这是 SPI 最容易出问题的地方。CPOL 决定时钟空闲时的电平,CPHA 决定数据在哪个边沿采样。组合起来有四种模式。

模式 CPOL CPHA 空闲时钟电平 数据采样边沿
模式 0 0 0 低电平 上升沿
模式 1 0 1 低电平 下降沿
模式 2 1 0 高电平 下降沿
模式 3 1 1 高电平 上升沿

验证方法:

  1. 配置主设备为模式 0,发送 0x55(01010101)
  2. 用示波器同时抓取 SCK 和 MOSI
  3. 观察数据变化时刻与时钟边沿的关系
  4. 重复步骤 1-3,测试模式 1、2、3

我曾经踩过的坑:某次调试一个温湿度传感器,手册上写的是模式 0,但实际波形显示它在下降沿采样。后来发现是手册写错了,芯片内部用的是模式 1。从那以后,我再也不信手册上的模式标注,一律用示波器实测确认。

4.3 全双工数据交换验证

SPI 的“全双工”意味着主设备发送数据的同时,从设备也在发送数据。很多人以为 SPI 是“发完再收”,其实不是。它是一边发一边收。

验证步骤:

  • 主设备发送 0xA5,同时从设备发送 0x5A
  • 检查主设备接收到的数据是否为 0x5A
  • 检查从设备接收到的数据是否为 0xA5
// 主设备代码示例
uint8_t tx_data = 0xA5;
uint8_t rx_data = 0;
SPI_TransmitReceive(&hspi1, &tx_data, &rx_data, 1, 1000);
// 此时 rx_data 应该等于从设备发来的 0x5A

小技巧:验证全双工时,可以用两个单片机背靠背测试。一个做主,一个做从。主发 0x55,从发 0xAA。如果两边收到的数据都对,说明全双工没问题。

4.4 多从机片选时序测试

多个从设备挂在同一条 SPI 总线上,靠片选信号区分。片选时序一旦出问题,就会导致数据冲突。

关键时序参数:

参数 说明 典型值
t_cs_setup 片选拉低到第一个时钟边沿的时间 ≥ 1 个时钟周期
t_cs_hold 最后一个时钟边沿到片选拉高的时间 ≥ 0.5 个时钟周期
t_cs_idle 两次片选之间的空闲时间 ≥ 1 个时钟周期

验证方法:

  1. 连接两个从设备到同一 SPI 总线
  2. 主设备先选中从设备 A,发送数据
  3. 释放从设备 A 的片选,等待 t_cs_idle
  4. 选中从设备 B,发送数据
  5. 用逻辑分析仪抓取所有片选信号和 SCK

注意:如果 t_cs_idle 太短,前一个从设备还没释放总线,后一个从设备就开始响应,数据就会串扰。我见过一个项目,就是因为片选间隔只有 100ns,导致两个传感器数据互相污染,查了整整两天。

4.5 知识体系总览

下面这张图,把 SPI 验证的核心逻辑串起来了。你可以把它当作调试时的检查清单。

SPI 总线验证知识体系 SPI 验证总纲 主从模式配置 CPOL / CPHA 测试 全双工数据交换 多从机片选时序 时钟输出/输入验证 四种模式波形对比 同时收发数据验证 片选建立/保持/空闲 验证工具:示波器 + 逻辑分析仪 + 双机背靠背测试

4.6 实战建议

我个人习惯,每次拿到一个新的 SPI 设备,第一件事不是写驱动,而是先搭测试环境。用示波器看波形,确认时钟极性和相位对不对。这一步省了,后面全是白费功夫。

你想想看,如果 CPOL 和 CPHA 都配错了,数据采样到的全是乱码。这时候你花三天调代码,不如花三分钟看波形。

我的调试清单:

  • 先测 SCK 频率和占空比
  • 再测 CPOL/CPHA 是否匹配
  • 然后测全双工数据交换
  • 最后测多从机片选时序

按这个顺序来,SPI 问题基本不会过夜。