SDIO 物理层:信号定义、电压、时序
做 SDIO 8-bit 驱动,第一步不是翻协议手册,而是把物理层那几个管脚搞明白。说白了,物理层就是 Host 和 Device 之间怎么握手、怎么传数据的基础。要是这层没搭稳,上层协议跑得再漂亮也白搭。
信号定义——8 根数据线到底怎么用
标准 SDIO 接口总共就这几根线:
- CLK:时钟线,Host 提供,所有信号以此为基准。
- CMD:命令线,双向半双工。Host 发送命令,Device 返回响应。
- DAT0 ~ DAT3:4 位数据线,标准模式。
- DAT4 ~ DAT7:8 位模式时额外的 4 条数据线。
8-bit 模式就是在 4-bit 基础上多拉了 4 根线。我当年第一次调 WiFi 芯片的 8-bit 模式时,以为软件改个配置就行,结果发现 PCB 上那几根走线没等长,高频下一跑就错。嗯,硬件设计时就要把 DAT4~DAT7 和 CLK 的等长控制在 50 mil 之内,否则分分钟丢包。
关键点:DAT0 在初始化阶段还兼做“忙检测”。Device 拉低 DAT0 表示自己还在忙,Host 必须等它变高才能发下一条命令。8-bit 模式下,DAT0 的忙检测依然适用,其他 7 根线在忙期间被忽略。
电压域——1.8V 还是 3.3V?
SDIO 物理层支持两种电压:
| 电压等级 | 典型场景 | 注意事项 |
|---|---|---|
| 3.3V | 传统 SD 卡、低端 WiFi 模块 | 功耗较大,但兼容性好 |
| 1.8V | 高速 WiFi 芯片、嵌入式主控 | 需要电平转换,信号上升沿更陡 |
为什么需要区分?因为高频开关消耗的功率与电压平方成正比。1.8V 比 3.3V 省电将近 70%。但 1.8V 信号对噪声更敏感,PCB 走线必须远离大电流回路。
我记得有个项目,主控默认输出 3.3V,WiFi 芯片却要求 1.8V。最初我们加了电平转换芯片,结果时序测试总是不通过。后来查出来是转换芯片的延迟太大,直接把 DAT 线上的建立时间吃掉了。换了一款高速电平转换器,问题解决。
个人习惯:设计时先查 WiFi 芯片数据手册里的 I/O 电压范围。如果支持 Dual Voltage,建议优先选 1.8V,配合内部的 LDO 或 DCDC,整体能效更高。
时序参数——建立时间与保持时间
SDIO 时序其实不复杂,核心就两个参数:
- tISU(输入建立时间):数据在时钟上升沿之前必须稳定的最短时间。
- tIH(输入保持时间):数据在时钟上升沿之后必须稳定的最长时间。
实际协议里,SD 规范对不同速度模式给出了明确的时序要求。以默认速度(Default Speed)为例:
| 参数 | 最小值 | 最大值 | 单位 |
|---|---|---|---|
| CLK 频率 | 0 | 25 | MHz |
| CLK 上升/下降时间 | — | 10 | ns |
| 输入建立时间 tISU | 5 | — | ns |
| 输入保持时间 tIH | 2 | — | ns |
8-bit 模式下,数据线从 4 根变成 8 根,但时序参数完全一样——因为时钟速率没变,只是数据宽度翻倍而已。真正影响时序的是你选择的 低速模式 还是 高速模式(SDR12、SDR25 等)。
我曾经踩过的坑:用逻辑分析仪抓 DAT 线,看到的数据波形在跳变沿附近有毛刺。一开始以为是驱动能力不够,后来发现是 CLK 走线太长,导致时钟偏斜过大。解决办法是把 CLK 放在中间,两侧对称布数据线,保证所有数据线的延迟一致。
8-bit 模式下的信号完整性
加 4 根线,考验的不是协议,而是 PCB 布局。你可以看下面这张图,它展示了 8-bit 模式的信号连接关系。
图里展示了 8-bit 模式的完整信号拓扑。注意 CMD 线和 DAT 线都是双向的,我用虚线箭头表示数据可以反方向走。CLK 是单方向,从 Host 到 Device。实际布线时,CLK 必须单独走,不能跟数据线扎在一起,否则串扰会让你抓狂。
初始化流程中的时序特殊性
SDIO 协议规定,上电后 Host 必须先用默认速度(~400 kHz)与 Device 通信,完成识别和电压协商。只有成功切换到 1.8V 和高速模式后,才能启用 8-bit 数据宽度。这个顺序不能乱。
- Host 发送 CMD0(Go Idle State),复位设备。
- 发送 CMD8(电压协商),确认设备支持 1.8V。
- 发送 ACMD41(SDIO 操作条件),设置电压窗口和总线宽度。
- 发送 CMD11(电压切换),将 I/O 电压从 3.3V 切到 1.8V。
- 发送 CMD6(功能选择),请求 8-bit 模式。
每一步都有严格的时间限制。比如 CMD8 之后,Device 必须在 1 ms 内响应。如果超时,Host 会认为该设备不支持当前电压,降级到 4-bit 或 1-bit 模式继续。
避坑指南:我曾经发现一些 WiFi 芯片在电压切换后,内部 PLL 需要重新锁相,导致 DAT0 被拉低的时间超过了协议规定的 10ms。解决方案是在驱动里加一个可配置的超时等待,比如最多等到 100ms,实际芯片补丁修复后再改回标准值。
时序容差与工作频率的关系
设计时还要考虑实际板级延迟。下面这张表总结了不同频率下关键的时序裕量:
| 工作频率 (MHz) | 时钟周期 (ns) | 有效数据窗口 (ns) | 建议最大走线延迟差 (ns) |
|---|---|---|---|
| 25 | 40.0 | 33.0 | 2.0 |
| 50 | 20.0 | 13.0 | 1.0 |
| 100 | 10.0 | 3.0 | 0.5 |
| 200 (SDR104) | 5.0 | 0.8 | 0.2 |
你看,频率一高,数据窗口快速收窄。200 MHz 时只有 0.8 ns 的有效窗口,相当于 3 个反相器的延迟。这也是为什么很多高速 SDIO 方案要求用 CLK 输出的相位调整功能(比如 Host 可以整体移动 CLK 的采样边沿)。
嗯,说到这里,我建议你在做板级验证时,直接用示波器测量 CLK 和 DAT0 之间的时序余量。算出来的理论值再好,也不如眼睛看到的实际波形靠谱。
核心结论:SDIO 物理层的信号定义、电压选择、时序参数三者环环相扣。8-bit 模式并没有引入新的时序要求,但多了 4 根线的等长约束,以及对电压切换流程的严格依赖。把这一层吃透,后面协议和驱动的调试至少能少掉一半的坑。