第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 线同样需要上拉,主机和设备都在空闲时保持高阻或释放。

经验点: 调试新板时,先用 1 位模式,确定 CLK 和 CMD 没问题,再切 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。这个切换时序非常敏感——主机必须等卡准备好才能切,否则容易烧接口。我个人习惯在切换后读一次卡的状态寄存器确认。

避坑指南: 我曾经在切换电压时没有等电源稳定就操作了 DAT 线,结果卡直接死锁,必须掉电重启。后来在电源切换后加了至少 5 ms 延时才恢复正常。

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 模块)可能不需要。

调试技巧: 用示波器看 CMD/DAT 上升沿。如果边沿太缓(超过时钟周期的 30%),先检查上拉电阻是不是太大或 PCB 走线过长。我曾经在一个 4 层板上用 100 kΩ 上拉,结果 50 MHz 下波形根本认不出高低电平,换成 47 kΩ 后问题解决。

下面这张图把本章的核心关系串起来,方便你记忆。

SDIO 物理层信号与电气特性关系图 主机 (Host) 设备 (Card) CLK (推挽) CMD (开漏 + 上拉) DAT[0:3] (开漏 + 上拉) 3.3V 域 (2.7~3.6V) 初始通信 / 普通卡 1.8V 域 (1.65~1.95V) 高速 / UHS-I 模式 CMD11 切换 上拉电阻 Rpull 3.3V: 10k~50kΩ   1.8V: 22k~68kΩ 驱动能力要求 上升沿 < 0.2×TCLK

这张图里,CLK 是推挽直连,CMD 和 DAT 都是开漏加上拉,电压域通过 CMD11 切换。上拉电阻和驱动能力决定了信号是否能稳定高速传输。记住:电压没切对、上拉太大/太小、走线过长,都会导致 SDIO 工作不稳定。

再啰嗦一句: 量产板必须做信号完整性测试。我曾经有一款产品,实验室 10 块板都 OK,产线 500 块却有 3% 的 SDIO 初始化失败。最后定位是 PCB 上拉电阻靠近卡座太远,导致寄生电容过大。后来把电阻移到卡座引脚旁边,不良率降到 0。