3. SDIO 物理层信号:CLK、CMD、DAT0‑DAT7

物理层信号,说白了就是 SDIO 总线上那些看得见、测得到的物理连线。你设计 FPGA 或 ASIC 时,最先接触的就是这几根线。我个人习惯先把它们理清楚,再去看协议栈,不然后面调试根本无从下手。

SDIO 物理层一共三类信号:CLK(时钟)、CMD(命令/响应)、DAT0‑DAT7(数据线)。DAT 线可宽可窄——1 位、4 位或 8 位模式。我遇到过不少新手,上来就开 8 位模式,结果 PCB 走线没等长,时序直接崩了。嗯,先一个个拆开讲。

SDIO 物理层信号结构图 SDIO 物理层信号 CLK 时钟线 CMD 命令/响应线 DAT0‑DAT7 数据总线 频率可调(0‑208 MHz) 双向、开漏、CRC 校验 1/4/8 位模式可选 所有信号由 Host 提供 CLK 同步

3.1 CLK — 时钟线

CLK 是 SDIO 总线的“心跳”。所有信号都在 CLK 的上升沿采样。Host 提供时钟,Device 只被动接收。为什么这样设计?因为 SDIO 一开始就是给存储卡用的,卡不需要生成时钟,节省成本。

时钟频率可以从 0 Hz(关闭)一直跑到 208 MHz(UHS‑II 模式)。但注意,刚上电时默认频率很低(约 400 kHz),然后通过 CMD 命令协商提升。我曾在项目里犯过一个低级错误——初始化没等协商完成就直接切高速,结果卡直接不回响应。后来老老实实按 SDIO 规范走初始化流程。

经验之谈: 做 FPGA 实现时,CLK 最好用全局时钟资源驱动,避免扇出过大导致歪斜。如果走片外,记得加匹配电阻——我曾经在样机上因为 CLK 反射导致误码,加个 22Ω 串联电阻就解决了。

3.2 CMD — 命令/响应线

CMD 是一条双向信号线。Host 发命令,Device 回响应。它采用开漏驱动方式,所以需要上拉电阻(主机端通常 10‑50 kΩ)。你想想看,开漏的好处是多个设备可以“线与”——不过 SDIO 同一条总线上一般只挂一个 Device,但协议还是保留了这种电气兼容性。

每个命令或响应都带有 CRC7 校验(除了一些特殊的广播命令)。CMD 线在空闲时被上拉到高电平。传输格式是这样的:

  • 命令:起始位 (0) + 传输方向位 (1) + 命令索引 (6 bits) + 参数 (32 bits) + CRC7 (7 bits) + 结束位 (1) = 48 bits
  • 响应:起始位 (0) + 传输方向位 (0) + 命令索引 (6 bits) + 状态/数据 (可变) + CRC7 (7 bits) + 结束位 (1) = 48 bits(短响应)或 136 bits(长响应)

我最纠结的一个坑: 曾经在调试某款 WiFi 模组时,CMD 线上的 CRC 错误率奇高。查了两天发现是 PCB 上 CMD 线跟 DAT 线走得太近,串扰把边沿搞坏了。分开走线、加地屏蔽后问题消失。所以 layout 时 CMD 尽量单独包地。

3.3 DAT0‑DAT7 — 数据总线

数据线是真正的吞吐担当。SDIO 支持三种数据位宽模式:

模式 使用的数据线 最大吞吐(50 MHz 时) 典型应用
1 位 DAT0 6.25 MB/s 低速兼容、初始化
4 位 DAT0‑DAT3 25 MB/s SD 卡、多数 SDIO 外设
8 位 DAT0‑DAT7 50 MB/s eSD、高速存储

注意,DAT 线也是双向的,但使用推挽驱动(不是开漏)。所以不需要上拉电阻——反而要避免上拉,因为推挽输出和上拉会打架。数据线上每个字节都是并行传输的,靠 CLK 上升沿锁存。

数据传输时,DAT0 还被用作忙信号指示。Device 如果暂时没法处理数据,会拉低 DAT0 通知 Host 等待。这个机制在协议里叫“流控”。我在做高速 SDIO 摄像头模块时,就发现如果 Host 端不处理忙信号,数据会直接丢包。

3.4 信号电气特性速查

不同电压等级对应不同的电平和时序要求。我把常见的工作电压和对应的 VIH/VIL 列在下面,方便你做 FPGA I/O 标准选择:

电压等级 VOH (min) VOL (max) VIH (min) VIL (max) 常见场合
3.3V 2.7 V 0.4 V 2.0 V 0.8 V 传统 SD 卡、低端 MCU
1.8V 1.65 V 0.25 V 1.27 V 0.58 V UHS‑I、高速 SDIO
1.2V 1.1 V 0.15 V 0.84 V 0.36 V UHS‑II、极低功耗

嗯,这里要强调:不同电压不能混用,否则可能烧器件。你的 FPGA bank 如果只支持 3.3V,就别接 1.8V 的 Device —— 或者用电平转换芯片。我曾经偷懒直接连,摸到芯片烫手才意识到出事了。

3.5 信号线分组与布局建议

做 PCB 或 FPGA 引脚分配时,我建议按下面的原则:

  1. CLK 单独走:避免与其他信号平行太长,必要时加地线隔离。
  2. CMD 加粗走线:因为开漏驱动,线宽影响上升时间——我习惯走 8‑10 mil。
  3. DAT 线组内等长:4 位模式时 DAT0‑DAT3 长度差控制在 ±50 mil;8 位模式更严,我做到 ±25 mil。
  4. 差分对(UHS‑II):如果涉及 UHS‑II 接口,CLK+ 和 CLK‑ 作为差分对,阻抗 100Ω。
硬伤警告: 不要在 DAT 线上串电阻(除非为了过 EMI 测试,且阻值 ≤ 5Ω),否则会破坏上升沿时序。我曾经见过一个设计在 DAT 线上串了 33Ω,结果 100 MHz 时波形严重畸变,吞吐掉了 40%。

3.6 总结

简单回顾:CLK 是全局时钟,CMD 是带 CRC 的双向命令线,DAT0‑DAT7 是数据通道。物理层决定了你的设计能跑多快、多稳。我这些年调过的 SDIO 问题,80% 出在物理层——不是信号质量,就是电平不匹配。所以这部分值得你花时间吃透。