第2章 SDIO 物理层信号与电气特性
做 SDIO 接口设计,第一件事就是搞清楚物理层那几根线到底在干什么。CLK、CMD、DAT0~DAT3,看着简单,但电压选错、驱动配错、上拉没加,板子焊出来就是不认卡。我这些年至少见过五六个项目在这栽跟头。今天我们把这几条线掰开揉碎了讲清楚。
2.1 信号定义
SDIO 总线只有 6 根有效线(算上地线是 7 根),分别是:
- CLK — 时钟线,由主机驱动。所有信号都在 CLK 上升沿采样。
- CMD — 双向命令/响应线。主机发命令,设备回响应。
- DAT0 ~ DAT3 — 4 根双向数据线。1 位模式只用 DAT0,4 位模式全部使用。
每根线本质上是开漏输出(对 CMD 和 DAT)加上一个弱上拉。时钟线是推挽输出。我刚开始做的时候总以为 DAT 线是推挽,结果示波器一看上升沿慢得离谱——后来才反应过来,开漏是靠上拉电阻充电,速度自然受限。
CLK 时钟线
CLK 频率范围从 0 Hz 到主机支持的最高频率(SDIO 规范里标准卡最高 25 MHz,高速卡 50 MHz,UHS-I 可到 208 MHz)。注意:CLK 停振时,卡必须保持状态。有些低功耗设计会动态停时钟,这时要确保 CMD/DAT 上拉有效,否则浮空电平会把卡搞死。
CMD 命令线
命令由主机发出,每个命令 48 位(6 字节),包含起始位、方向位、命令索引、参数、CRC7 和结束位。响应格式类似,也是 48 位(短响应)或 136 位(长响应)。CMD 线上任何时候只能有一个驱动者,主机发完命令后释放总线,设备再拉低响应。我曾经见过因为主机驱动没释放干净,导致响应 CRC 一直错误的案例——最后发现是 FPGA 代码里三态使能晚了半个时钟。
DAT0 ~ DAT3 数据线
数据线支持 1 位和 4 位模式。1 位模式下只用 DAT0,DAT1~DAT3 被卡用于其他功能(比如 DAT1 可作中断请求)。4 位模式下,所有数据线并行传输,速度翻四倍。每根 DAT 线同样需要上拉,主机和设备都在空闲时保持高阻或释放。
2.2 电压域 — 1.8V 与 3.3V
SDIO 支持两种电压域:
| 参数 | 3.3V 域 | 1.8V 域 |
|---|---|---|
| 标称电压 | 2.7V ~ 3.6V | 1.65V ~ 1.95V |
| 信号摆幅 | 0 ~ 3.3V | 0 ~ 1.8V |
| 功耗 | 较高 | 较低(约 1/3) |
| 支持速度 | 最高 50 MHz(HS) | 最高 208 MHz(UHS-I) |
| 兼容性 | 所有卡都支持 | 仅 UHS-I 或更高卡支持 |
怎么选?如果只是读个文件存个日志,3.3V 就够了。如果要做高速数据传输(比如视频录制),必须用 1.8V。注意:卡在初始化阶段工作在 3.3V,协商后主机发出 CMD11 切换电压,双方同步切换到 1.8V。这个切换时序非常敏感——主机必须等卡准备好才能切,否则容易烧接口。我个人习惯在切换后读一次卡的状态寄存器确认。
2.3 驱动能力与上拉电阻
驱动能力说白了就是主机或卡的输出引脚能灌/拉多大电流。SDIO 规范没强制规定具体电流值,但要求信号上升/下降时间满足时序窗口。一般主机侧推挽输出驱动能力在 4~12 mA 之间,开漏输出靠外部上拉。
上拉电阻计算:
- CMOS 输入高电平阈值通常为 0.65×VDD,低电平为 0.35×VDD。
- 上升时间 τ = Rpull × Cload。一般要求上升时间 < 0.2×TCLK。
- 以 50 MHz(20 ns周期)为例,0.2×20 ns = 4 ns。
- 假设总负载电容 10 pF(包含 PCB 走线、卡输入电容),则 Rpull < 4 ns / (2.2×10 pF) ≈ 182 Ω。但注意上拉电阻太小,开漏低电平电流会太大(比如 3.3V/182Ω ≈ 18 mA),超过多数芯片规格。
所以实际设计要折中。我个人推荐:3.3V 系统用 10 kΩ ~ 50 kΩ 上拉,1.8V 系统用 22 kΩ ~ 68 kΩ。开漏模式下,卡内部通常自带弱上拉(约 50 kΩ),但为了抗干扰还会再外部加一个同值的电阻。注意不同卡对 DAT 线上拉有不同要求:SD 卡规范要求主机在 DAT 线上提供 10 kΩ ~ 100 kΩ 上拉,但 SDIO 设备(比如 WiFi 模块)可能不需要。
下面这张图把本章的核心关系串起来,方便你记忆。
这张图里,CLK 是推挽直连,CMD 和 DAT 都是开漏加上拉,电压域通过 CMD11 切换。上拉电阻和驱动能力决定了信号是否能稳定高速传输。记住:电压没切对、上拉太大/太小、走线过长,都会导致 SDIO 工作不稳定。