1. SDIO协议概述与版本演进

各位好,今天咱们来聊聊SDIO。说白了这个课程的第一章,就是要把SDIO这个“东西”从头到尾捋一遍。

很多工程师一上来就扎进测试用例的细节里,结果发现很多基础概念还没搞透。我个人习惯是,先花半小时把协议的全貌看清楚,后面的路会顺很多。

SDIO,全称是Secure Digital Input Output。你可以把它理解成:在SD卡的标准上,加了一个I/O通道。

为什么要有这个东西?你想想看,手机、平板、嵌入式设备上已经有一个SD卡槽了。如果我还要加个Wi-Fi、蓝牙、GPS模块,是不是还得再开个接口?成本太高了。有了SDIO,我直接在现有SD卡槽上插I/O设备就行了。

核心概念提炼: SDIO就是把SD卡的总线协议,借给了外设(I/O设备)使用。一种物尽其用的设计思路。

1.1 从SD卡到SDIO的演变

最早SD卡只是存储介质。但SD协会发现,这个总线速度不错,电气特性也稳定。

与其另起炉灶搞一个新接口,不如“一卡多用”。

就这样,SDIO 1.0在2001年前后正式发布。我印象里,第一个大规模使用SDIO的产品,是带Wi-Fi功能的PDA。

版本迭代上,有几个关键节点:

版本 发布时间 核心特性 最高速率
SDIO 1.0 2001 基本I/O操作,1-bit模式 ~12.5 MB/s
SDIO 2.0 2006 4-bit模式,高速模式支持 ~50 MB/s
SDIO 3.0 2011 UHS-I(超高速第一代) ~104 MB/s
SDIO 4.0/4.1 2014-2016 UHS-II,双行数据通道,更低的延迟 ~312 MB/s
小提示: 版本号虽多,但目前主流的嵌入式项目(比如Wi-Fi模组),还在大量使用SDIO 2.0+高速模式。别被3.0/4.0吓到,基础兼容性测试主要盯住2.0。

1.2 协议栈的逻辑分层

你看到的是物理接口,但协议内部是分层的。我大概画了个逻辑图,你参考一下:

SDIO协议栈逻辑分层 物理层 (PHY) CLK, CMD, DAT[0:7], 电气特性 传输层 命令/响应格式, CRC校验 I/O 应用层 FIFO操作, 中断, 通用I/O 存储卡子层 文件系统/R/W命令 I/O 子层 52字节命令, CSA, 多字节读写 说明 对于I/O设备,不使用“存储子层” 直接走I/O子层读写寄存器/FIFO

这个图怎么看?

  • 物理层:负责时钟、命令线、数据线的电气特性。说白了,得能通。
  • 传输层:负责命令怎么发、怎么回、CRC怎么算。这是一致性测试的主要战场。
  • 应用层:对于I/O设备,就是读写寄存器、操作FIFO、处理中断。对于存储卡,是文件系统的读写。
避坑指南: 我曾经遇到过一个问题:某个I/O模块支持UHS-II模式,但主机(Host)侧固定只发送CMD0/CMD5序列初始化。结果模块无法进入UHS-II模式,一直回退到旧协议。后来发现是模块对时序要求太苛刻。做兼容性验证时,别忘了测“降级回退”场景。

1.3 命令-响应机制

SDIO里没有“请求-应答”之外的第二种通信方式。你想发数据?先发命令。主机问,设备答。

命令分几种类型,我整理了一张对比表:

命令类型 示例命令 方向 读写数据
无响应 (b) CMD0 (复位),CMD15 (取消选择) 主机 → 设备 无
有响应 (b) CMD5 (I/O模式),CMD3 (相对地址分配) 主机 ← 设备 无
带数据 (b) CMD53 (字节/块读写,SDIO最常用) 双向 有
多块 (b) CMD18 (多块读,存储卡场景) 双向 有

你写测试用例的时候,一定会大量遇到CMD53。它既可以读一个字节,也可以读写一个块。具体怎么用,我们后面章节会拆开讲。

这里我留一句提醒:别小看CMD0。虽然它只是复位命令,但如果时序或者电平没对上,设备根本不会响应后续任何命令。

1.4 版本演进对验证的影响

版本演进,说白了就是两个维度的提升:速度和功能。

  • 速度:从12.5 MB/s到312 MB/s。你需要验证时钟频率、数据窗口、信号完整性。
  • 功能:比如UHS-II引入了双面数据通道、更复杂的初始化流程。这些功能每加一点,测试用例就要多一套。

我个人的建议是:在制定测试计划时,先锁定项目支持的最高版本。然后向下兼容到2.0。3.0的UHS-I其实用得不多,很多设备会直接跳到4.1或稳定在2.0。

一个值得注意的细节: 版本升级时,寄存器映射可能有变化。比如CIS(卡信息结构)里的某些特性在3.0以后被废弃了。你在测试时需要确认设备是否正确地返回了“不支持”信息。

1.5 小结与验证思路

第一章的内容,说白了就是给后面的测试用例打地基。

你理解了SDIO是“在SD总线上嫁接I/O功能”,知道了各个版本的特征,并且熟悉了命令-响应这个核心互动模式——那么接下来我们写测试用例时,就不会在“为什么这个命令没响应?”这种问题上卡太久。

接下来,我们会深入到具体的测试用例设计。嗯,咱们先从物理层和命令层开始慢慢破局。