1. SDIO 协议概述
各位做嵌入式硬件的朋友,咱们开门见山——SDIO 是什么?说白了,它就是把 SD 卡的物理接口和协议拿过来,给 Wi-Fi 模块、蓝牙芯片、GPS 模块、摄像头这些外设用。我最早接触 SDIO,是帮客户调一个 Marvell 的 Wi-Fi 模组。当时看着示波器上的波形,死活觉得跟 SD 卡一样,可设备就是枚举失败。后来才意识到,SDIO 和 SD 卡在协议栈上层差别不小。
1.1 SDIO 总线标准
SDIO 全称 Secure Digital Input Output,属于 SD 卡协会定义的标准。总线采用三线或四线制:
- CLK(时钟):主机提供,速率范围 0~208 MHz(取决于版本)
- CMD(命令/响应线):双向,用于传输命令和响应
- DAT0~DAT3(数据线):1 位或 4 位模式,最高支持 8 位(SD 4.0 起)
底层电气特性和 SD 存储卡完全兼容,所以很多 MCU 的 SD 卡控制器可以直接接 SDIO 设备。但你要小心——不是所有声称支持 SD 的主机都能正确驱动 SDIO 设备。我踩过的坑,后面会细讲。
1.2 命令与数据传输
SDIO 通信以命令-响应为基本单位。主机发命令,设备回响应。数据传输可以紧随其后,也可以独立执行。
命令格式固定 48 位:
位[47:46]: 起始位 "01"
位[45: 传输方向(1=主机→设备)
位[44:40]: 命令索引(CMD0 ~ CMD63)
位[39:8]: 参数(32 位)
位[7:1]: CRC7 校验
位[0]: 结束位 "1"
响应类型有 5 种(R1、R2、R3、R4、R5),具体取决于命令。我个人习惯先看 R1 响应里的状态标志——如果设备返回 Illegal Command,多数是命令序列错了。
数据块传输使用 CRC16 校验。这一点在 SDIO 符合性测试里特别重要——我曾经遇到一块模组,数据线信号质量挺好,但 CRC 错误率很高,最后查出是主机端 CRC 生成器有 Bug。
1.3 SPI 模式和 SD 模式的区别
很多嵌入式工程师会在低引脚数场景下选用 SPI 模式。但我要提醒一句:SPI 模式只是 SDIO 的一个子集,功能受限,速度也慢。
| 对比项 | SD 模式 | SPI 模式 |
|---|---|---|
| 引脚数 | CLK, CMD, DAT0~3 | CLK, MOSI, MISO, CS |
| 速度 | 可达 208 MB/s | 通常 ≤ 25 MHz 时钟 |
| 命令响应 | 片上时序控制 | 软件片选 + 普通 SPI 时序 |
| CRC | 硬件自动校验 | 需软件计算 |
| 中断能力 | 支持(DAT1 线) | 不支持 |
| 典型应用 | Wi-Fi, 蓝牙, 摄像头 | 低速传感器, 小数据量外设 |
1.4 设备枚举与初始化流程
SDIO 设备上电后,主机需要走一套严格的初始化序列。我习惯把这个过程画成流程图,方便排查时按图索骥。
1.5 避坑:常见初始化失败原因
- 供电时序不对:VDD 必须先稳定,再拉高 CLK。我见过主机 CLK 早于电源稳定,导致设备内部 POR 出错。
- CRC 错误:CMD0 和 CMD5 都带 CRC7。很多初学者忘了计算 CRC,或者主机 SD 控制器默认只对数据块做 CRC16,命令 CRC 没开。
- CMD5 超时:CMD5 需要循环发送直到设备返回就绪位。循环次数不能太少,至少 100 次(每次间隔 1ms)。
- 卡检测机制:有些主机通过 CD 引脚检测卡是否存在。如果 SDIO 设备不使用标准 SD 卡外壳,CD 可能一直为浮空或低电平。
核心结论:SDIO 协议的底层是命令-响应+数据块传输,SPI 模式是阉割版,能不用就不用。初始化序列走错了,后面所有符合性测试都会白费力气。把流程图画出来,每步用示波器抓 CMD 和 DAT 线,基本上一两个小时就能定位问题。