2、SDIO 物理层规范:信号定义、电压等级、时序要求
做 SDIO 验证,第一关就是物理层。你想想看,如果连信号长什么样、跑多快、电平对不对都没搞清楚,后面协议分析全是空中楼阁。我个人习惯,拿到一块支持 SDIO 的芯片,第一件事不是翻协议栈,而是先把物理层的 datasheet 参数拉一张表贴在工位上。
2.1 信号定义——每根线都有自己的脾气
SDIO 接口一共多少根线?标准 SD 卡模式是 6 根,加上电源和地,总共 9 根。我放一张快速对照表:
| 信号名 | 方向 | 功能简述 |
|---|---|---|
| CLK | Host → Device | 时钟,所有同步操作的基准 |
| CMD | 双向 | 命令/响应通道,双向推挽 |
| DAT0 | 双向 | 数据线 bit0,1-bit 模式唯一数据线 |
| DAT1 | 双向 | 数据线 bit1,4-bit 模式使用 |
| DAT2 | 双向 | 数据线 bit2 |
| DAT3 | 双向 | 数据线 bit3,也兼卡检测 |
| VDD | — | 供电电源 |
| VSS | — | 地 |
注意 DAT3 这根线有点特殊。除了传数据,它还用来做卡插入检测和上电初始化的“忙”信号。我记得第一次调 SDIO 驱动时,发现卡死活不能识别,查了半天是 DAT3 上拉电阻没焊……嗯,这种坑踩过一次就记住了。
个人贴士: 平时做测试夹具,我会在 CMD 和每根 DAT 线上都预留串联电阻位置(22Ω 左右),实测时根据信号完整性再决定焊不焊。省得 layout 改版来回折腾。
2.2 电压等级——别插错槽位
SDIO 的电压不是一成不变的。规范定义了三种工作电压区间,但实际常用就两个:
- 3.3V 传统区间(2.7V – 3.6V):兼容老设备,早期 SD 卡和 WiFi 模块大多用这个。
- 1.8V 低压区间(1.65V – 1.95V):高速模式、UHS-I 以上必须用。省电,但驱动能力弱。
- 3.0V 区间(2.7V – 3.0V):很少见了,偶尔在特殊工业卡里碰到。
工作中最容易出问题的就是电压切换。Host 先以 3.3V 发 CMD0 重置,然后通过 CMD8 探询卡支持什么电压。如果卡回应支持 1.8V,Host 再切到 1.8V 继续初始化。我曾经碰到过一个模块,用 3.3V 能读 CID,一切到 1.8V 就死掉——后来发现是模块内部 LDO 启动时序不够,需要 Host 拉低 DAT3 再等 5ms。这种事情,datasheet 上不会写,全靠示波器抓波形来查。
警告: 不要热插拔 SDIO 设备!尤其是 1.8V 模式,VDD 和信号线之间只有 0.6V 左右的噪声容限。带电插拔很容易烧接口 ESD 结构。我做认证测试时,每次插卡前都会手动确认 Host 已经关闭电源输出。
2.3 时序要求——快有快的规矩
时序是物理层验证的重头戏。SDIO 本质上是同步串行总线,所有信号都跟 CLK 对齐。我个人习惯把时序参数分成三类来记:
- 频率相关: 默认模式 0–25 MHz,高速模式 0–50 MHz,UHS-I 可以到 208 MHz。每次换模式都要重新做眼图测试。
- 建立/保持时间: CMD 和 DAT 相对于 CLK 上升沿的 setup/hold。标准 SD 规范要求 setup ≥ 5ns,hold ≥ 2ns(以 3.3V 为例)。1.8V 下这些窗口会更窄。
- 输出延迟: 从 CLK 上升沿到数据有效的最大时间,通常 tODLY 在 14ns 以内(25MHz 时)。
下面这张图是我自己整理的知识结构,帮你把信号和时序串起来看:
2.4 实际操作中的避坑点
理论说完了,聊聊我遇到的真实案例。
- 上电时序: 有些 SDIO 设备要求 VDD 先稳定,CLK 再开始。反过来先给时钟、后供电,很可能导致卡内部锁死。我曾经在量产测试时复现过这个 bug,后来在 Host 固件里加了 10ms 的供电等待才解决。
- 信号斜率: 1.8V 模式下时钟上升沿不要太快(<1ns),否则会耦合到临近数据线上。简单解决办法是在 CLK 线上串一颗 10Ω 电阻,实测有效。
- 卡识别阶段: 按照规范,Host 发 CMD0 后必须等待至少 1ms 才能继续发 CMD8。但我遇到过有些卡需要 5ms 才能稳定。我自己的测试脚本里统一设成 10ms,省得换卡翻车。
核心总结: SDIO 物理层验证,信号定义靠查表,电压切换靠 CMD8,时序收敛靠示波器。我强烈建议在测试工具的第一个测试用例里就包含“连续写读 64 字节”的遍历,因为很多时序问题在单次传输中看不出来,连续跑才能暴露毛刺。
好了,该记的记,该测的测。下一环节我们聊聊命令与响应格式,那是协议层的敲门砖。