SDIO 接口概述与协议基础

做嵌入式这么多年,我打交道最多的外设接口就是 SDIO。Wi-Fi 模块、蓝牙、GPS、NFC……很多高速无线芯片都挂 SDIO 上。刚开始不懂时序,layout 拉线随性,结果通信经常断。后来才明白——先把协议层摸透,再调时序才心里有数。

这一章咱们把 SDIO 的基本概念、和 SD、eMMC 的区别、协议分层结构过一遍。不扯虚的,全是干活用得上的东西。

1.1 SDIO 总线标准简介

SDIO(Secure Digital Input Output)是 SD 卡协会定义的扩展标准。说白了,就是把 SD 卡那根总线拿出来,接非存储类的外设。

标准版本从 1.0 到 3.0,速率从 25 MHz 到 208 MHz。我更喜欢用 4-bit 模式,配合 DDR 采样,跑 50 MHz 就能扛起大部分 WiFi 芯片的吞吐。默认电压 3.3 V,新型号也支持 1.8 V 低功耗。

总线信号线只有 6 根 + 1 根卡检测:

  • CLK —— 主机提供时钟
  • CMD —— 命令/响应通道(双向)
  • DAT[3:0] —— 数据线,可选 1/4-bit
  • CD/DAT[3] —— 复用卡检测

注意:SDIO 主机永远是主动方,从设备只响应。初始化时先发 CMD0 复位,再发 CMD5、ACMD41 等一系列握手,我在这里栽过——有些 WiFi 模块 ACK 响应慢,必须加超时重试。

1.2 SDIO vs SD vs eMMC 区别

很多新手把这三个混着用,layout 走线想省事直接套 SD 模板。结果 eMMC 跑不稳定,SDIO WiFi 丢包。我把关键差异整理成一张表,你调时序前一定对照看看。

对比项SD 卡SDIO 设备eMMC
协议起源存储卡标准基于 SD 的外设扩展MMC 演化,JEDEC 标准
命令体系CMD0-64 聚焦存储读写借 CMD5、CMD52/53 做 IOMMC 命令集,与 SDIO 不兼容
数据总线1/4-bit1/4-bit,可选 SPI4/8-bit,可 DDR
最大时钟208 MHz (UHS-II)208 MHz (SDIO 3.0)200 MHz (HS400)
工作电压3.3/1.8 V3.3/1.8 V3.3/1.8/1.2 V
典型场景存储卡、TF 卡WiFi/BT/GNSS 模组板载存储、移动设备 eMMC
热插拔支持(插入检测)支持(但 WiFi 少见热拔)不支持(焊在板上的)

我曾经踩过的坑: 把 eMMC 当做 SDIO 设备初始化——CMD0 后直接发 ACMD41,eMMC 会忽略,卡在空闲态。后来查 spec 才发现 eMMC 不走 ACMD41,得用 CMD1 做初始化。时序参数完全两套,千万别混用。

1.3 SDIO 协议分层结构

我习惯把 SDIO 协议看成三层:物理层、传输层、应用层。物理层管时钟和电气特性;传输层管命令-响应交互;应用层管你接的外设具体做了什么。画了张图,一眼就能看明白。

SDIO 协议分层结构 物理层 CLK 频率、电压域、信号摆率、上拉/驱动器强度、线长约束 对应寄存器:OCR、CCS、卡检测 传输层 命令 (CMD0~CMD63) / 响应 (R1~R6) 数据块传输:单块、多块、停止传输 CRC7/CRC16 校验、超时重试 应用层 SDIO 特有命令:CMD52(R/W 单字节)、CMD53(R/W 多字节/块) 函数使能、中断寄存器、内部 DMA 外设具体协议(比如 WLAN 的 WMM 调度)

你看,物理层直接决定你 layout 能跑多快。传输层靠时序约束来保证边沿对齐。应用层反而是最不需要操心的——驱动层帮你封装了。

我个人的实践心得: 新手调 SDIO 时总喜欢直接在应用层打 log 看数据对不对。其实第一步应该用示波器看 CLK 和 CMD 的边沿关系,确认物理层信号质量。物理层不干净,上层调破头也没用。

1.4 初始化流程概览

SDIO 设备从上电到正常工作,要经过严格的握手。我用列表把关键步骤列出来,你对着 spec 一步步走,基本不会跑偏。

  1. 上电等待:VDD 稳定后至少等 74 个 CLK
  2. CMD0:复位所有卡到 Idle 状态
  3. CMD8:查询电压范围(SDIO 2.0+ 必须支持)
  4. CMD5(IO_SEND_OP_COND):获取 IO 功能数,确认工作电压
  5. ACMD41(通过 CMD55 前缀):初始化 SDIO 协议细节
  6. CMD3(SEND_RCA):分配相对卡地址
  7. CMD7:选中设备进入数据传输模式
  8. CMD52/CMD53:读取 CIS(卡信息结构),配置函数

小技巧: 初始化时我习惯把 CMD 和 DAT 都配置成弱上拉,防止总线悬空造成误检测。等握手完成再切到正常驱动。这个细节在高速模式下尤其重要。

好了,这一章讲完了。SDIO 的基础框架咱们心里有数。下一章开始,我们会把重点放在时钟时序参数的具体调节上,比如建立/保持时间的测量方法、驱动强度的选择、不同速率模式下的走线规则。有了协议底子,后面的实操才不会迷路。

(注:本章已覆盖 SDIO 概述、三者差别、协议分层和初始化流程。无额外图片链接,SVG 仅一张,配色符合规范。)