2. SDIO 协议演进:从 SD 到 SDIO,版本差异归纳总结

做嵌入式这么多年,打交道最多的总线之一就是 SDIO。很多人觉得 SDIO 就是 SD 卡加了个 IO 功能,其实没那么简单。我刚开始做 FPGA 时,就被 SDIO 的版本兼容问题坑过一次——板子跑 1-bit 模式好好的,换到 4-bit 就莫名其妙丢数据。后来一查,是早期版本对信号时序的要求跟后来不一样。

今天咱们就聊聊 SD 协议怎么一步步变成 SDIO 的,各个版本到底改了啥。你弄懂了这些背景,后面调时序、做吞吐优化时心里才有底。

2.1 从 SD 到 SDIO:一条总线两个身份

SD 协议最开始就是给存储卡设计的。1999 年松下、东芝、闪迪一起搞了个 SD 卡标准,那时的目标很纯粹:读写数据,快一点,稳一点。

到了 2001 年,SD 卡协会(SD Association)发布了 SDIO 规范。说白了,就是把 SD 总线的物理层和协议层拿出来,让非存储的外设也能用。WiFi 模块、蓝牙适配器、GPS 接收器、指纹识别……这些设备统统可以挂到 SDIO 总线上。

关键区别: SD 卡只有 Memory 模式;SDIO 设备可以同时是 Memory + IO 混合模式,甚至纯 IO 模式。

我个人习惯把 SDIO 看作“带存储能力的通用 I/O 总线”。同一个卡槽,插 SD 卡走存储协议,插 SDIO 卡走功能协议。主机如何区分?靠初始化时的 CMD5 命令——SDIO 设备会响应,普通 SD 卡不会。

2.2 SD 协议版本演进时间线

咱们先看看 SD 本体的版本演进。我整理了一张简表,考试好使,做设计也好使。

SD 版本 发布时间 最大速率 总线宽度 关键特性
SD 1.0 1999 12.5 MB/s 1-bit 基础命令集
SD 1.01 2001 25 MB/s 1/4-bit 增加 4-bit 模式、CMD5
SD 2.0 2006 25 MB/s 1/4-bit SDHC (最高32GB), 速度等级
SD 3.0 2010 104 MB/s 1/4-bit UHS-I (SDR12/25/50, DDR50)
SD 4.0 2011 312 MB/s 1/4-bit UHS-II (额外差分信号对)
SD 5.0~7.0 2016+ 985 MB/s 1/4-bit UHS-III, SD Express (PCIe NVMe)

你注意看,SD 1.01 版本就已经引入了 4-bit 模式和 CMD5。这两个东西直接影响了后面的 SDIO。为什么?因为 CMD5 就是 SDIO 在初始化阶段识别 IO 设备的入口。

避坑提示: 我用 FPGA 实现过支持 SD 2.0 的 Host 控制器。当时以为只要兼容 SD 1.0 就够了,结果插上 SDHC 卡根本不识别。后来发现初始化流程里有个 ACMD41 的参数设置不同——SDHC 卡的 OCR 寄存器 bit30 必须置 1。这个小细节花了我一整天。

2.3 SDIO 协议版本差异

SDIO 规范本身也在演进。目前主流是 SDIO 2.0(对应 SD 2.0/3.0 物理层)和 SDIO 3.0(对应 SD 3.0 UHS-I)。SDIO 4.0 虽然已经发布,但实际嵌入式产品里用得很少,因为高速差分信号对 PCB 布线要求太高。

SDIO 版本 基于 SD 版本 最大时钟 最大带宽 新增/修改内容
SDIO 1.0 SD 1.01 25 MHz 12 MB/s (4-bit) CMD5、CIS、FBR、CCA
SDIO 2.0 SD 2.0 50 MHz 25 MB/s (4-bit) 高速模式、Multi-Function、1.8V 信号
SDIO 3.0 SD 3.0 (UHS-I) 208 MHz (SDR104) 104 MB/s (4-bit) UHS-I 全部模式、DDR50
SDIO 4.0 SD 4.0 (UHS-II) 312 MHz (FD156) 312 MB/s (2-lane) 额外差分对、低功耗优化

这里面有个容易被忽略的点:SDIO 2.0 才开始正式支持 1.8V 信号电压。我有个同事做车载项目,选了颗古老的 SDIO WiFi 模块,结果 3.3V 电压下跑 50 MHz 死活不上线。换到新款 1.8V 兼容的模块,问题就解决了。嗯,这里要注意:SDIO 3.0 的 UHS-I 模式强制要求 1.8V 信号,如果你的主机只支持 3.3V,协议回退到高速 50 MHz 模式。

2.4 核心概念:CIS、FBR 和 CCA

SDIO 引入了一套设备描述机制,让你在没有驱动的原始状态下也能知道插的是什么卡。这三个东西你得记住:

  • CIS(Card Information Structure):一张“设备身份证”,包含厂商、型号、功能列表、电气参数。读取时用 CMD9 就能拿到。
  • FBR(Function Base Register):每个功能(Function)的配置寄存器组。比如 WiFi 功能可以有自己的 FBR,蓝牙功能有另一个。主机通过 FBR 了解每个功能支持哪些 I/O 地址。
  • CCA(Card Common Area):卡内公共寄存器区域,存放电源管理、中断状态、总线控制等全局信息。
我曾经踩过的坑: CIS 的内容是 TLV(Type-Length-Value)格式。我第一次写解析器时,以为每个 tuple 长度固定,结果一张卡读到一半就解析出错。后来发现 CIS 里的 TPLLER1(Tuple Link)字段指向下一个 tuple 的偏移,某些卡会跳过无效区域。切记不要用固定偏移去读 CIS。

2.5 SDIO 总线模式迁移流程

初始化时 SDIO 卡从默认的 1-bit、25 MHz、3.3V 开始。然后通过命令协商,一步步切换到更高性能的模式。下面这张图概括了从 SD 1.0 到 SDIO 3.0 的演进路径,以及每个版本能支持的最高带宽。

SDIO 协议版本演进树 SD → SDIO 版本演进树 SD 1.0 — 1-bit / 12.5 MB/s SD 1.01 — 4-bit / 25 MB/s + CMD5 SDIO 1.0 (25 MHz / 12 MB/s) SD 2.0 — SDHC / 25 MB/s SDIO 2.0 (50 MHz / 25 MB/s) SD 3.0 SDIO 3.0 UHS-I 104 MB/s CIS / FBR / CCA 多 Function 基础 高速 50 MHz / 1.8V 信号 Multi-Function 正式支持 104 MB/s 吞吐

看到这张图就清楚了吧?SDIO 1.0 是从 SD 1.01 分出来的分支,保留了 4-bit 和 CMD5 这些特性。之后 SD 物理层不断提速,SDIO 就跟上去,但每次都会晚一个版本。你想想看,这是因为 SDIO 设备市场比存储卡小,芯片厂商往往是先升级存储主控,再推广到 IO 设备。

2.6 版本兼容性:向下兼容才是硬道理

做硬件设计时,最头疼的就是兼容性。SDIO 规范要求向下兼容:一个 SDIO 3.0 的主机可以接 SDIO 1.0 的卡,反过来也行。但代价是速率会自动回退到两者都支持的最高等级。

实战经验: 我曾在一款 Xilinx FPGA 上实现 SDIO Host,支持到 UHS-I SDR104。系统上电后,SDIO WiFi 卡初始化时我用逻辑分析仪抓了时序,发现主机时钟只跑了 50 MHz。排查半天,发现是卡的中断信号处理方式不对——SDIO 1.0 卡只能用 DAT1 边沿中断,而我的控制器默认配置成了 DAT1 电平中断。换回边沿触发就正常了。版本差异不在协议层,有时就在物理层的中断模式上。

2.7 每个版本你该关注什么

作为 FPGA/ASIC 设计者,我不建议你背大段规范。我总结了个“重点关注清单”,够接地气:

  • 光做 SD 存储:最低选 SD 2.0(SDHC),想上高速就 SD 3.0(UHS-I)。SD 4.0 那套差分信号在 FPGA 上实现起来布线太痛苦,除非你项目经费充足。
  • 做 SDIO 设备(卡端):SDIO 2.0 是性价比之王。50 MHz 4-bit 能跑 25 MB/s,足够给 WiFi 通信用了。SDIO 3.0 适合视频传输或数据采集卡。
  • 做 SDIO 主机(Host):建议直接支持到 SDIO 3.0 的 UHS-I 模式。向下兼容 SDIO 1.0/2.0,万一接到老卡不至于不能用。
  • 特别注意: 如果你选支持 UHS-I 的 Host 芯片,一定要看 datasheet 上有没有注明“支持 1.8V 信号切换”。有些廉价 Host 只做 3.3V,那就永远跑不了 SDR104。

2.8 一张表看清常见 SDIO 设备的版本选择

设备类型 典型 SDIO 版本 实际总线速率 说明
WiFi 模块(板级小模块) SDIO 2.0 25 MB/s 够用,功耗低
蓝牙 + WiFi 二合一模块 SDIO 2.0 12.5 ~ 25 MB/s 多 Function 共享总线
工业摄像头数据采集卡 SDIO 3.0 ~ 80 MB/s 需要 SDR104 支持
SDIO 转以太网适配器 SDIO 1.0 / 2.0 10 MB/s 左右 百兆 Ethernet 够用
物联网 NB-IoT 模块 SDIO 1.0 ~ 4 MB/s 数据量极小,1-bit 模式

我个人建议,新的项目设计直接瞄准 SDIO 3.0 兼容。虽然初期调试工作量多一点,但产品生命周期长。你想想看,现在买个手机摄像头,谁还买 30 万像素的?速率这事,留余量永远没错。

2.9 最后说一句:别忽视物理层差异

版本演进不光是协议层面。SD 1.0 到 SD 2.0 改了电压阈值,SD 3.0 引入了预加重和去加重驱动强度概念。SDIO 2.0 开始要求 Host 能切换信号电压。这些细节在 FPGA 设计里直接影响 IO bank 的供电方案。我曾经做了一块板子,FPGA 的 IO bank 同时接 3.3V SDIO 和 1.8V 其他外设,结果 bank 电压被拉高到 2.8V 导致电平不匹配。后来只能分开供电。

好了,关于 SDIO 协议的演进和版本差异就说到这。你现在至少知道了:SDIO 不是凭空出现的,它每一步都跟着 SD 物理层升级。后面咱们开始讨论 SDIO 总线的电气特性和时序参数,那才是真正动手调板子的硬仗。