3. SDIO 物理层信号:CLK、CMD、DAT0‑DAT7
物理层信号,说白了就是 SDIO 总线上那些看得见、测得到的物理连线。你设计 FPGA 或 ASIC 时,最先接触的就是这几根线。我个人习惯先把它们理清楚,再去看协议栈,不然后面调试根本无从下手。
SDIO 物理层一共三类信号:CLK(时钟)、CMD(命令/响应)、DAT0‑DAT7(数据线)。DAT 线可宽可窄——1 位、4 位或 8 位模式。我遇到过不少新手,上来就开 8 位模式,结果 PCB 走线没等长,时序直接崩了。嗯,先一个个拆开讲。
3.1 CLK — 时钟线
CLK 是 SDIO 总线的“心跳”。所有信号都在 CLK 的上升沿采样。Host 提供时钟,Device 只被动接收。为什么这样设计?因为 SDIO 一开始就是给存储卡用的,卡不需要生成时钟,节省成本。
时钟频率可以从 0 Hz(关闭)一直跑到 208 MHz(UHS‑II 模式)。但注意,刚上电时默认频率很低(约 400 kHz),然后通过 CMD 命令协商提升。我曾在项目里犯过一个低级错误——初始化没等协商完成就直接切高速,结果卡直接不回响应。后来老老实实按 SDIO 规范走初始化流程。
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 引脚分配时,我建议按下面的原则:
- CLK 单独走:避免与其他信号平行太长,必要时加地线隔离。
- CMD 加粗走线:因为开漏驱动,线宽影响上升时间——我习惯走 8‑10 mil。
- DAT 线组内等长:4 位模式时 DAT0‑DAT3 长度差控制在 ±50 mil;8 位模式更严,我做到 ±25 mil。
- 差分对(UHS‑II):如果涉及 UHS‑II 接口,CLK+ 和 CLK‑ 作为差分对,阻抗 100Ω。
3.6 总结
简单回顾:CLK 是全局时钟,CMD 是带 CRC 的双向命令线,DAT0‑DAT7 是数据通道。物理层决定了你的设计能跑多快、多稳。我这些年调过的 SDIO 问题,80% 出在物理层——不是信号质量,就是电平不匹配。所以这部分值得你花时间吃透。