SDIO协议概述
1.1 从SD卡到SDIO
SDIO的全称是Secure Digital Input/Output。说白了,它就是在SD卡协议的基础上,为外设芯片开了一扇门。你可能跟我一样,最早接触SD卡时只当它是存照片的存储卡——往相机里一插,拍完拔出来拷到电脑上。但SD卡的物理接口其实挺“奢侈”的:四根数据线、一根命令线、一根时钟线,外加电源和地,总共也就那么几个引脚。
我记得2005年左右,WiFi模块和蓝牙模块开始在手机上流行。厂商发现,如果拿SD卡接口来跑I/O数据,既不用重新设计PCB,又能利用成熟的SD控制器硬核。于是SD卡协会在2001年就推出了SDIO 1.0规范,把原本只属于存储的命令集扩充,让芯片能通过同一个物理接口做“非存储”的事情。
我个人习惯把SDIO看作SD卡的“亲兄弟”:
- 物理层完全一样:时钟、命令、数据引脚的电气特性、时序参数都复用SD卡标准。
- 软件层多了I/O命令:SD卡发送读/写块命令,SDIO则发送CISA(Common I/O Set Address)和RCA(Relative Card Address)等操作。
- 设备类型不同:SD卡是存储设备,SDIO可以是WiFi、GPS、NFC甚至指纹传感器。
你想想看,一个手机SoC要同时接eMMC、SD卡、WiFi模块,如果每种外设都用不同的总线,PCB走线会乱成一团。SDIO的出现,说白了就是用单一IP核搞定多种低速I/O,代价就是时序约束变严格了——这恰恰是我们这门课要啃的硬骨头。
1.2 SDIO的核心特性
SDIO从1.0演进到3.0,主要变了三件事:时钟频率、电压范围和最大传输速率。来看这张速览表:
| 版本 | 时钟频率 | 电压 | 最大速率(4-bit) | 应用场景 |
|---|---|---|---|---|
| SDIO 1.0 | 0~25 MHz | 2.7~3.6 V | 12.5 MB/s | 早期WiFi/蓝牙 |
| SDIO 2.0 | 0~50 MHz | 2.7~3.6 V | 25 MB/s | GPS/NFC |
| SDIO 3.0 | 0~208 MHz | 1.8 V / 3.3 V | 104 MB/s (DDR模式) | 高速I/O(摄像头、高速WiFi) |
这里有个坑:SDIO 3.0引入了DDR模式,数据在时钟上升和下降沿都采样,setup/hold的裕量几乎砍半。我曾经在一个项目里把SDIO时钟从50 MHz直接升到150 MHz,结果板子跑起来偶尔丢包,示波器一抓发现建立时间只剩0.2 ns。嗯,后面几章我们会重点讲怎么算这个裕量。
1.3 SDIO与SD卡协议的异同
很多工程师以为SDIO就是SD卡加个I/O功能,其实两者的命令体系差别不小。下面这张对比表能帮你快速厘清:
| 项目 | SD卡 | SDIO |
|---|---|---|
| 命令类型 | 存储类(读块/写块/擦除) | I/O类(CISA/RCA/扩展寄存器) |
| 设备功能 | 数据存储 | 任意I/O功能(最多8个函数) |
| 初始化流程 | 卡识别→传输模式 | 卡识别→I/O初始化→函数使能 |
| CMD线用途 | 命令与响应 | 命令、响应、中断请求 |
| 时序参数 | 固定setup/hold | 相同物理层,但受I/O吞吐影响 |
为什么我要单独提“中断请求”?因为SDIO的CMD线在特定模式下能传递中断信号,而SD卡只能通过DAT线发送卡状态。这一点在做低延迟应用时特别重要——我曾调试过一个蓝牙音频模块,中断响应慢了导致声音卡顿,后来发现是SDIO中断配置没设对。
1.4 为什么时序裕量对SDIO格外重要
SDIO的时钟频率从25 MHz涨到208 MHz,数据速率翻了8倍。但PCB走线长度、过孔寄生电容、芯片I/O驱动强度并不会等比缩小。于是setup/hold时间窗口越来越窄。
举个实际案例:我在一个四层板项目里,SDIO走线从主控到WiFi模块走了约80 mm,还串了两个过孔。50 MHz时一切正常,换到100 MHz就间歇性报CRC错误。示波器抓图发现,数据窗口整体右移了0.8 ns,导致建立时间不足。后来调整了时钟相位(通过主控的delay line),才把裕量拉回到0.5 ns以上。
你想想看,如果只会“把时钟降一档”来解决问题,那这颗WiFi芯片的实际吞吐永远跑不满。这门课会带你一步步算清楚:驱动强度、输出阻抗、PCB寄生、接收端阈值,最终找到最优的delay配置。