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 总线上。
我个人习惯把 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 设备的入口。
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):卡内公共寄存器区域,存放电源管理、中断状态、总线控制等全局信息。
2.5 SDIO 总线模式迁移流程
初始化时 SDIO 卡从默认的 1-bit、25 MHz、3.3V 开始。然后通过命令协商,一步步切换到更高性能的模式。下面这张图概括了从 SD 1.0 到 SDIO 3.0 的演进路径,以及每个版本能支持的最高带宽。
看到这张图就清楚了吧?SDIO 1.0 是从 SD 1.01 分出来的分支,保留了 4-bit 和 CMD5 这些特性。之后 SD 物理层不断提速,SDIO 就跟上去,但每次都会晚一个版本。你想想看,这是因为 SDIO 设备市场比存储卡小,芯片厂商往往是先升级存储主控,再推广到 IO 设备。
2.6 版本兼容性:向下兼容才是硬道理
做硬件设计时,最头疼的就是兼容性。SDIO 规范要求向下兼容:一个 SDIO 3.0 的主机可以接 SDIO 1.0 的卡,反过来也行。但代价是速率会自动回退到两者都支持的最高等级。
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 总线的电气特性和时序参数,那才是真正动手调板子的硬仗。