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, 蓝牙, 摄像头 低速传感器, 小数据量外设
注意:如果你选 SPI 模式,SDIO 设备不能通过 CMD5 进入 SPI 模式——必须在初始化阶段用 ACMD41 特殊序列。这也意味着主机端软件栈要额外适配。别问我怎么知道的,我曾经帮人查过一个模组死活不进 SPI 模式的 Case,最后发现是 ACMD41 带错了参数。

1.4 设备枚举与初始化流程

SDIO 设备上电后,主机需要走一套严格的初始化序列。我习惯把这个过程画成流程图,方便排查时按图索骥。

SDIO 设备初始化流程 主机上电 / 复位 CMD0 (GO_IDLE) CMD5 (IO_SEND_OP_COND) ACMD41 (APP_OP_COND) CMD3 (SEND_RELATIVE_ADDR) CMD7 (SELECT_DESELECT_CARD) 初始化完成 → 准备数据传输 关键点: CMD5 与 ACMD41 需要 交替尝试直到设备就绪
经验分享:我看到不少工程师在 CMD3 阶段卡住,因为 SDIO 设备返回的相对地址(RCA)可能不是 0x0000。你可以先假设设备返回什么就用什么,但如果后续 CMD7 失败,请回头检查 RCA 匹配。我遇到过设备返回 0x0001 而主机硬编码了 0x0000,结果怎么都选不中卡。

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 线,基本上一两个小时就能定位问题。