第四章 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 | 高电平 | 上升沿 |
验证方法:
- 配置主设备为模式 0,发送 0x55(01010101)
- 用示波器同时抓取 SCK 和 MOSI
- 观察数据变化时刻与时钟边沿的关系
- 重复步骤 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 个时钟周期 |
验证方法:
- 连接两个从设备到同一 SPI 总线
- 主设备先选中从设备 A,发送数据
- 释放从设备 A 的片选,等待 t_cs_idle
- 选中从设备 B,发送数据
- 用逻辑分析仪抓取所有片选信号和 SCK
注意:如果 t_cs_idle 太短,前一个从设备还没释放总线,后一个从设备就开始响应,数据就会串扰。我见过一个项目,就是因为片选间隔只有 100ns,导致两个传感器数据互相污染,查了整整两天。
4.5 知识体系总览
下面这张图,把 SPI 验证的核心逻辑串起来了。你可以把它当作调试时的检查清单。
4.6 实战建议
我个人习惯,每次拿到一个新的 SPI 设备,第一件事不是写驱动,而是先搭测试环境。用示波器看波形,确认时钟极性和相位对不对。这一步省了,后面全是白费功夫。
你想想看,如果 CPOL 和 CPHA 都配错了,数据采样到的全是乱码。这时候你花三天调代码,不如花三分钟看波形。
我的调试清单:
- 先测 SCK 频率和占空比
- 再测 CPOL/CPHA 是否匹配
- 然后测全双工数据交换
- 最后测多从机片选时序
按这个顺序来,SPI 问题基本不会过夜。