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 频率025MHz
CLK 上升/下降时间—10ns
输入建立时间 tISU5—ns
输入保持时间 tIH2—ns

8-bit 模式下,数据线从 4 根变成 8 根,但时序参数完全一样——因为时钟速率没变,只是数据宽度翻倍而已。真正影响时序的是你选择的 低速模式 还是 高速模式(SDR12、SDR25 等)。

我曾经踩过的坑:用逻辑分析仪抓 DAT 线,看到的数据波形在跳变沿附近有毛刺。一开始以为是驱动能力不够,后来发现是 CLK 走线太长,导致时钟偏斜过大。解决办法是把 CLK 放在中间,两侧对称布数据线,保证所有数据线的延迟一致。

8-bit 模式下的信号完整性

加 4 根线,考验的不是协议,而是 PCB 布局。你可以看下面这张图,它展示了 8-bit 模式的信号连接关系。

SDIO 8-bit 模式信号连接 SDIO 8-bit 模式物理层信号连接 Host 主控 CLK 输出 CMD 双向 DAT0~3 双向 DAT4~7 双向 WiFi 芯片 CLK 输入 CMD 双向 DAT0~3 双向 DAT4~7 双向 CLK 由 Host 统一提供,所有数据线相对于 CLK 上升沿采样 CMD 和 DAT 均为双向,但同一时刻只能有一个方向驱动

图里展示了 8-bit 模式的完整信号拓扑。注意 CMD 线和 DAT 线都是双向的,我用虚线箭头表示数据可以反方向走。CLK 是单方向,从 Host 到 Device。实际布线时,CLK 必须单独走,不能跟数据线扎在一起,否则串扰会让你抓狂。

初始化流程中的时序特殊性

SDIO 协议规定,上电后 Host 必须先用默认速度(~400 kHz)与 Device 通信,完成识别和电压协商。只有成功切换到 1.8V 和高速模式后,才能启用 8-bit 数据宽度。这个顺序不能乱。

  1. Host 发送 CMD0(Go Idle State),复位设备。
  2. 发送 CMD8(电压协商),确认设备支持 1.8V。
  3. 发送 ACMD41(SDIO 操作条件),设置电压窗口和总线宽度。
  4. 发送 CMD11(电压切换),将 I/O 电压从 3.3V 切到 1.8V。
  5. 发送 CMD6(功能选择),请求 8-bit 模式。

每一步都有严格的时间限制。比如 CMD8 之后,Device 必须在 1 ms 内响应。如果超时,Host 会认为该设备不支持当前电压,降级到 4-bit 或 1-bit 模式继续。

避坑指南:我曾经发现一些 WiFi 芯片在电压切换后,内部 PLL 需要重新锁相,导致 DAT0 被拉低的时间超过了协议规定的 10ms。解决方案是在驱动里加一个可配置的超时等待,比如最多等到 100ms,实际芯片补丁修复后再改回标准值。

时序容差与工作频率的关系

设计时还要考虑实际板级延迟。下面这张表总结了不同频率下关键的时序裕量:

工作频率 (MHz)时钟周期 (ns)有效数据窗口 (ns)建议最大走线延迟差 (ns)
2540.033.02.0
5020.013.01.0
10010.03.00.5
200 (SDR104)5.00.80.2

你看,频率一高,数据窗口快速收窄。200 MHz 时只有 0.8 ns 的有效窗口,相当于 3 个反相器的延迟。这也是为什么很多高速 SDIO 方案要求用 CLK 输出的相位调整功能(比如 Host 可以整体移动 CLK 的采样边沿)。

嗯,说到这里,我建议你在做板级验证时,直接用示波器测量 CLK 和 DAT0 之间的时序余量。算出来的理论值再好,也不如眼睛看到的实际波形靠谱。

核心结论:SDIO 物理层的信号定义、电压选择、时序参数三者环环相扣。8-bit 模式并没有引入新的时序要求,但多了 4 根线的等长约束,以及对电压切换流程的严格依赖。把这一层吃透,后面协议和驱动的调试至少能少掉一半的坑。