1. SDIO基础:协议概述、发展历史、应用场景与SD卡区别

1.1 SDIO协议概述——它到底是什么

先给个直观印象:SDIO(Secure Digital Input/Output)就是把SD卡插槽的物理接口和通信协议,开放给非存储类外设使用。说白了,你手机里那个TF卡槽,如果主控支持SDIO,插一块Wi-Fi模块、蓝牙模块或者GPS接收器,也能正常工作。

我最早接触SDIO是在一块ARM9开发板上,当时想做无线数传,SDIO接口的Wi-Fi芯片比SPI接口的吞吐量高一个数量级。这件事让我意识到,SDIO本质上是一套面向外设的总线协议,而非单纯的存储命令集。

SDIO协议定义了三层结构:

  • 物理层——引脚定义、电气特性、时钟频率、上电时序。
  • 命令/响应层——主机与设备之间通过CMD线发送命令,设备通过DAT线返回响应。
  • 数据传输层——块读写、字节模式、多块传输、4-bit/1-bit总线宽度切换。

这三层叠加起来,形成了从主机寄存器配置到外设功能访问的完整路径。

要点:SDIO不是替代SPI或者UART,而是在已有SD卡标准上扩展出“I/O功能”。所以,任何支持SD卡的主控,理论上都能挂SDIO设备——前提是驱动里实现I/O命令集(CMD5、CMD52、CMD53等)。

1.2 发展历史——从存储卡到通用外设总线

SD标准诞生于1999年,由SanDisk、松下和东芝联合推出。初衷是给数码相机、PDA提供大容量可移除存储。2001年,SD卡协会(SDA)发布了SDIO规范1.0,正式把接口开放给非存储设备。

年份里程碑我关注的点
1999SD 1.0 标准发布,最高25 MHz物理层确定,无IO能力
2001SDIO 1.0 发布,增加I/O命令集首次支持Wi-Fi、蓝牙、GPS
2004SDIO 1.1 / SD 1.1 引入高速模式时钟升到50 MHz,吞吐量翻倍
2006SDIO 2.0 / SD 2.0 支持UHS-I我设计的一块GPS模组就基于此版本
2010SDIO 3.0 / SD 3.0 UHS-II物理层大变,新增FD156/FD312引脚
最新SD 7.x / SDIO 4.x向后兼容保留I/O特性,速率稳定在200+ MB/s

为什么我觉得这段历史重要?因为很多嵌入式工程师拿到SDIO外设时,只看了最新规范,却忽略了向后兼容的陷阱。我曾经在一个项目里,SDIO Wi-Fi模组标注支持UHS-I,但主控只实现了1-bit模式,结果实际速率只有理论值的1/4。后来查了SDIO 1.0的时序要求,发现主控的时钟占空比不达标,属于物理层合规问题。

个人建议:做SDIO一致性验证时,先确认你的主控遵循的是哪个版本的SDIO规范,并针对该版本的强制命令集做全量测试。只测“能用”不测“边界”,出货后大概率要返工。

1.3 应用场景——Wi-Fi、蓝牙、GPS、传感器都在用

SDIO最常见的战场是移动设备和嵌入式系统:

  1. 无线通信模组: 高通、博通、瑞昱的Wi-Fi+蓝牙二合一芯片,几乎都用SDIO作为主接口。吞吐量可以跑到200 Mbps以上,是SPI的10倍。
  2. 定位模块: 早期u-blox和SiRF的GPS接收器,挂SDIO总线实现连续NMEA数据流。
  3. 传感器集线器: 一些工业级多轴惯性测量单元(IMU)通过SDIO输出原始数据,减少CPU轮询开销。
  4. 嵌入式存储扩展: 虽然本质是存储,但SDIO模式下挂在I/O类下面。
  5. FPGA配置/调试端口: 我在一个原型机上用SDIO接口给FPGA加载比特流,省去了JTAG线缆。

你想想看,为什么这么多外设选择SDIO而非SD卡原生协议?因为SDIO支持字节寻址和函数号(Function Number),一个物理设备可以虚拟出最多7个独立功能(如Wi-Fi+蓝牙+FM接收器)。

避坑: 我曾经遇到一个SDIO蓝牙模组,厂商宣称支持3.0V和1.8V双电压。结果在1.8V平台上,CMD5命令无法正确识别设备。最后发现是芯片内部LDO启动时序与SDIO上电时序冲突,属于典型的物理层时序违规。

1.4 与SD卡的核心区别——不止是存储与IO的差别

初学者最容易混淆的就是:SDIO设备能否直接插到SD卡槽里用?答案是:取决于主控是否识别I/O函数。很多消费级主控只初始化了存储子卡协议栈,连CMD5都不发送,所以SDIO设备插上去完全不响应。

两张表说清楚差异:

维度SD卡(存储)SDIO设备(I/O)
命令集存储命令(CMD0, CMD8, ACMD41等)I/O命令(CMD5, CMD52, CMD53)
初始化流程电压协商→OCR读取→CSD/CID等CMD5检测IO功能→读取FBR→配置函数
数据传输块读写(block mode)字节模式 + 块模式,由函数指定
设备号单个逻辑单元(LUN)最多7个函数 + 1个存储子通道
时钟要求支持标称时钟即可部分外设要求精准时钟占空比(40%~60%)
物理兼容插槽通用插槽通用,但主控必须发CMD5

还有一个容易被忽略的细节:SDIO设备的中断机制。SD卡没有硬件中断引脚,SDIO设备可以通过DAT1线向主机发送中断信号。这在低功耗场景下非常实用——设备不需要一直轮询。

我记得在一款工业平板项目中,触控板走SDIO接口,用DAT1中断上报触摸事件,比轮询方案功耗降低了60%。但这也带来了新的验证点:主控的中断响应延时、DAT1上拉电阻值、中断重传机制,每一项都要在一致性测试中覆盖。

1.5 本章知识体系全景

下面这张图把SDIO的协议分层和应用栈串起来,帮助你建立全局视角:

SDIO 知识体系框架 物理层 引脚、时序、电压、时钟 命令/响应层 CMD5、CMD52、CMD53等 数据传输层 字节/块/多块模式 典型应用场景 Wi-Fi / 蓝牙 / GPS / 传感器集线器 / FPGA调试 / 多功能组合芯片 SD卡(存储类) 只支持块读写 无中断线 初始化流程固定 单逻辑单元 SDIO设备(I/O类) 字节/块混合模式 DAT1硬件中断 多函数(≤7) 函数初始化后激活 主控必须发送CMD5才能识别SDIO设备