SDIO总线
SDIO 总线完整介绍
目录
- 概述:SDIO 是什么
- 物理层:引脚与信号
- 命令机制:CMD 与响应
- 核心命令:CMD52 / CMD53
- CIA 与 Function:寄存器地图与功能单元
- 完整的初始化(枚举)流程
- Linux 驱动视角
- 总结与核心记忆点
- 概述:SDIO 是什么
SDIO(Secure Digital Input Output,安全数字输入输出)是 SD 卡协会(SDA)在 SD 存储卡规范基础上扩展出的总线标准。核心思想:借用 SD 卡的物理接口和协议,让非存储类的 I/O 设备也能接入。
1.1 从哪来
┌──────┬──────┬──────────────────────────────────────────────────────────┐
│ 阶段 │ 年份 │ 说明 │
├──────┼──────┼──────────────────────────────────────────────────────────┤
│ MMC │ 1999 │ 多媒体卡,块存储 │
├──────┼──────┼──────────────────────────────────────────────────────────┤
│ SD │ 2000 │ 在 MMC 基础上强化,仍是块存储 │
├──────┼──────┼──────────────────────────────────────────────────────────┤
│ SDIO │ 2001 │ SD 协会扩展出"卡不只是存储",允许 I/O 设备挂在 SD 接口上 │
└──────┴──────┴──────────────────────────────────────────────────────────┘
SDIO 卡物理上长得像 SD 卡,但协议层多了 I/O 寄存器访问机制。最著名的 SDIO 设备就是嵌入式 WiFi 模块(博通、Marvell 等方案)。
1.2 基本特点
- 与 SD 卡共用物理接口:引脚为 CLK、CMD、DAT0~3。
- 两种工作模式:
- SD 模式:1-bit、4-bit 并行,时钟最高约 50 MHz(HS),UHS-I 下可达 208 MHz。
- SPI 模式:速度较低,常用于简化设计。
- 支持热插拔与多设备:一个主机可挂多张卡(通过 CMD 轮询区分)。
1.3 典型用途
由于带宽比 SPI/I2C 高得多,SDIO 常用于中高数据量外设:
┌─────────────────┬─────────────────────────────────┐
│ 设备 │ 说明 │
├─────────────────┼─────────────────────────────────┤
│ WiFi 模块 │ 最常见场景(嵌入式 Linux 网卡) │
├─────────────────┼─────────────────────────────────┤
│ 蓝牙 / NFC 模块 │ 手机、开发板上的无线通信 │
├─────────────────┼─────────────────────────────────┤
│ 摄像头 / GPS │ 高吞吐数据传输 │
├─────────────────┼─────────────────────────────────┤
│ 多媒体协处理器 │ 部分音视频芯片 │
└─────────────────┴─────────────────────────────────┘
1.4 与相似总线对比
┌──────┬─────────────────────┬────────┬───────────────────────────┐
│ 总线 │ 速度量级 │ 引脚数 │ 适用场景 │
├──────┼─────────────────────┼────────┼───────────────────────────┤
│ I2C │ 几百 kbps ~ 几 Mbps │ 2 │ 低速传感器、EEPROM │
├──────┼─────────────────────┼────────┼───────────────────────────┤
│ SPI │ 几十 Mbps 级 │ 3+N │ 中速外设(Flash、显示屏) │
├──────┼─────────────────────┼────────┼───────────────────────────┤
│ SDIO │ 百 Mbps 级 │ 6 │ 高速无线/多媒体外设 │
├──────┼─────────────────────┼────────┼───────────────────────────┤
│ PCIe │ 数 Gbps 级 │ 多 │ 高性能扩展(SSD、GPU) │
└──────┴─────────────────────┴────────┴───────────────────────────┘
- 物理层:引脚与信号
一个 SDIO 主机在 SD 模式下最少有 6 根信号线:
主机 ──── CLK ────► 设备 时钟(单方向,永远由主机发出)
主机 ──── CMD ◄───► 设备 命令/响应(双向,半双工)
主机 ──── DAT0 ◄──► 设备 数据位0
主机 ──── DAT1 ◄──► 设备 数据位1(同时兼做中断线!)
主机 ──── DAT2 ◄──► 设备 数据位2
主机 ──── DAT3 ◄──► 设备 数据位3
关键点:
- CLK:初始化阶段必须 ≤ 400 kHz(兼容老卡),之后可升到 25 MHz(DS)/ 50 MHz(HS),UHS-I 最高 208 MHz。时钟永远由主机单向发出。
- 数据线宽度可切换:1-bit(只用 DAT0)或 4-bit(DAT0~3),通过写设备寄存器完成。
- SPI 模式:可退化成 SPI(CLK=SCLK、CMD=MOSI、DAT0=MISO),引脚少但速度低。
- DAT1 的特殊使命:SDIO 卡通过拉低 DAT1 通知主机"有中断"(DAT1 平时被主机上拉为高)。这是 SD 存储卡没有的能力。
- 命令机制:CMD 与响应
SDIO 的所有操作都建立在 主机发命令(CMD)、设备回响应(R) 的模型上。
3.1 命令帧格式(48 bit)
bit 47 46 45 40 39 8 7 0
┌─────────┬───────┬──────────┬─────────┬──────────────────────────┬─────────┬──────┐
│ 起始位=0 │ 方向=1 │ 命令索引 │ 停止位=0 │ 参数(32 bit) │ CRC7 │ 结束=1│
└─────────┴───────┴──────────┴─────────┴──────────────────────────┴─────────┴──────┘
- 起始位 0 / 结束位 1:帧同步。
- 方向位 1:主机发命令恒为 1;卡回响应时该位为 0。
- 命令索引 6 bit:0~63,SDIO 主要用下表这些。
- 参数 32 bit:内容因命令而异。
- CRC7:保证命令线传输正确。
3.2 SDIO 相关命令总表
┌───────┬────────────────────┬────────┬──────┬─────────────────────────────────┐
│ 索引 │ 名称 │ 方向 │ 响应 │ 作用 │
├───────┼────────────────────┼────────┼──────┼─────────────────────────────────┤
│ CMD0 │ GO_IDLE_STATE │ 广播 │ 无 │ 所有卡复位到 idle 态 │
├───────┼────────────────────┼────────┼──────┼─────────────────────────────────┤
│ CMD3 │ SEND_RELATIVE_ADDR │ 点对点 │ R6 │ 卡返回自己的 RCA(相对地址) │
├───────┼────────────────────┼────────┼──────┼─────────────────────────────────┤
│ CMD5 │ IO_SEND_OP_COND │ 广播 │ R4 │ 探测 I/O 卡、电压协商、等待就绪 │
├───────┼────────────────────┼────────┼──────┼─────────────────────────────────┤
│ CMD7 │ SELECT_CARD │ 点对点 │ R1 │ 选中/取消一张卡,进入传输态 │
├───────┼────────────────────┼────────┼──────┼─────────────────────────────────┤
│ CMD52 │ IO_RW_DIRECT │ 点对点 │ R5 │ 读/写 1 个字节 寄存器 │
├───────┼────────────────────┼────────┼──────┼─────────────────────────────────┤
│ CMD53 │ IO_RW_EXTENDED │ 点对点 │ R5 │ 读/写 多个字节(批量传输) │
└───────┴────────────────────┴────────┴──────┴─────────────────────────────────┘
▎ 重要:CMD52/53 是 SDIO 独有命令,SD 存储卡不认识。存储卡用的是 CMD17/18/24/25 读写块。SDIO 卡永远不会响应 CMD17/24 这类存储命令——这是协议上的本质区别。
3.3 响应类型详解
R6(CMD3 的响应)—— 卡的身份证
bit 39~16: RCA(16 bit,卡相对地址)
bit 15~0 : 卡状态(CRC 错误等标志)
CMD3 之前总线上可能有多张卡,主机无法区分。卡主动上报自选的 RCA,主机只需记住,这张 RCA 就是卡整个生命周期内的唯一标识。
R4(CMD5 的响应)—— 卡的体检报告
bit 39 : 内存卡存在标志(是否同时是存储卡)
bit 38 : I/O 卡存在标志(=1 说明确实是 I/O 卡)
bit 37~32 : 卡支持的电压范围
bit 31~8 : OCR(工作电压),含"卡就绪"位
主机从 R4 得到三件事:是不是 I/O 卡、支持多大电压、卡初始化好了没。
R5(CMD52/53 的响应)—— 数据回传通道
bit 39~8 : [bit7:0] 数据(CMD52 读回来的字节放这里!)
[bit15:8] 响应标志/错误位
bit 7~0 : 卡状态
"寄存器读"的本质就在这:主机发 CMD52 读某个地址,卡把该地址的字节塞进 R5 的数据位沿 CMD 线传回,没有单独的数据线参与。
- 核心命令:CMD52 / CMD53
4.1 CMD52:单字节寄存器读写
32 bit 参数打包:
bit 31 : [R/W] 0=写,1=读
bit 30 : [RAW] 1=忽略 CRC/响应(盲写,如复位)
bit 27~26 : [Function Number] 目标 Function(0~7)
bit 25~9 : [寄存器地址 17 bit]
bit 8~0 : [写入数据 9 bit] 写时携带的字节(读时忽略)
用法示例:
// 读 Function 0 地址 0x0E 的中断状态寄存器
sdio_readb(func, 0x0E);
// 内部生成: CMD52, 参数 = (1<<31)|(0<<27)|(0x0E<<9)
// 写 Function 1 地址 0x04 写入 0x2A
sdio_writeb(func, 0x2A, 0x04);
// 内部生成: CMD52, 参数 = (0<<31)|(1<<27)|(0x04<<9)|(0x2A)
特点:一次只动 1 字节,但命令头 + 响应开销不小,只适合慢速控制(读状态、写配置位),不适合搬数据。
4.2 CMD53:批量数据传输
参数打包:
bit 31 : [R/W] 0=写,1=读
bit 29 : [块模式] 0=字节模式,1=块模式
bit 28~27 : [Function Number]
bit 26~9 : [寄存器地址 18 bit]
bit 8~0 : [字节/块计数 9 bit]
两种模式:
┌──────────┬─────────────────────────┬──────────────┬─────────────────────────┐
│ 模式 │ 单次最多 │ 数据格式 │ 用途 │
├──────────┼─────────────────────────┼──────────────┼─────────────────────────┤
│ 字节模式 │ 512 字节 │ 按字节连续传 │ 读小批量(如 CIS 元组) │
├──────────┼─────────────────────────┼──────────────┼─────────────────────────┤
│ 块模式 │ 511 块 × 最多 2048 字节 │ 以块为单位 │ 搬大数据 │
└──────────┴─────────────────────────┴──────────────┴─────────────────────────┘
- 块模式下块大小由主机先写进 FBR 配置。
- 实际传输时数据从 DAT0~3 线走,与命令线分离:
时间轴: [CMD53 命令帧] → [卡响应 R5] → [DAT 线上的数据块] → [CRC/结束]
用法示例:
// 从 Function 1 地址 0x10000 读 512 字节进 buf
sdio_memcpy_fromio(func, buf, 0x10000, 512);
// 把 buf 里 1500 字节写进 Function 1 的 FIFO
sdio_memcpy_toio(func, 0x10000, buf, 1500);
4.3 中断机制
- 卡有事件(如 WiFi 收到数据包)→ 卡把 DAT1 拉低。
- 主机检测到 DAT1 拉低 → 读中断状态寄存器确认来源 → 调用驱动的 irq_handler。
- SDIO 中断是事件驱动的,相比轮询,能支撑实时收发。
- CIA 与 Function:寄存器地图与功能单元
这是 SDIO 和 SD 卡最不一样的地方,请重点理解。
5.1 CIA:整个卡的"寄存器地图"
CIA(Common I/O Area,公共 I/O 区) 是 SDIO 规范规定的一张"地址地图"——定义卡的寄存器空间长什么样、每个地址放什么。
地址区间 归属 作用
────────────────────────────────────────────────────────────
0x00000 – 0x000FF Function 0 CCCR(卡公共控制寄存器)
0x00100 – 0x001FF Function 0 FBR(各 Function 基本信息表)
0x01000 – 0x01FFF Function 0 CIS(卡信息结构)
0x10000 – 0x1FFFF Function 1 业务寄存器空间
0x20000 – 0x2FFFF Function 2 业务寄存器空间
...
▎ CIA 只覆盖 0x00000~0x01FFF(CCCR + FBR + CIS),全部归属 Function 0。0x10000 起是各 Function 自己的空间。
- CCCR(Card Common Control Register)—— 控制面板
┌───────────┬─────────────────────────────────────┐
│ 偏移 │ 内容 │
├───────────┼─────────────────────────────────────┤
│ 0x00 │ CCCR/SDIO 版本号 │
├───────────┼─────────────────────────────────────┤
│ 0x03 │ I/O 卡能力(是否支持块传输等) │
├───────────┼─────────────────────────────────────┤
│ 0x07 │ 卡支持的总线宽度(1-bit / 4-bit) │
├───────────┼─────────────────────────────────────┤
│ 0x08 │ 总线宽度设置(主机写这里切 4-bit) │
├───────────┼─────────────────────────────────────┤
│ 0x0B │ DAT1 中断允许、各 Function 中断使能 │
├───────────┼─────────────────────────────────────┤
│ 0x0D/0x0E │ 中断状态(谁拉了中断) │
└───────────┴─────────────────────────────────────┘
- FBR(Function Basic Register)—— 各功能能力表
紧跟在 CCCR 后,每个 Function 占 8 字节(Function 1 在 0x100~0x107):
偏移 0x100 [bit7:6] 支持的传输方式(字节/块)
偏移 0x101 最大块大小低字节
偏移 0x103 [bit0] 是否支持 CMD52/53 块模式
- CIS(Card Information Structure)—— 卡的自我介绍书
用元组(Tuple)串联存储,类似 USB 描述符:
0x01000: [0x01] 制造商信息元组 → 制造商代码
0x01008: [0x15] 产品名元组 → "BCM43438"
0x01020: [0x20] 厂商特定元组 → 驱动私有数据
0x010XX: [0xFF] 结束元组
驱动识别硬件的流程:CMD53 读 CIS → 解析元组 → 拿到厂商 ID + 产品 ID → 匹配 sdio_device_id 表 → 找到驱动。
5.2 Function:卡里的"功能单元"
Function 是 SDIO 设备内部划分的逻辑业务功能,编号 0~7,最多 8 个。它是"地址空间 + 中断 + 数据传输"三位一体的最小业务单位。
Function 0 是特殊的:
┌────────────────┬─────────────────────────────────┬───────────────────────────────┐
│ 特性 │ Function 0 │ Function 1~7 │
├────────────────┼─────────────────────────────────┼───────────────────────────────┤
│ 是否必须存在 │ 必须 │ 可选 │
├────────────────┼─────────────────────────────────┼───────────────────────────────┤
│ 职责 │ 管理卡本身(CCCR/CIS/中断配置) │ 干业务活 │
├────────────────┼─────────────────────────────────┼───────────────────────────────┤
│ 能否传业务数据 │ 不能 │ 能 │
├────────────────┼─────────────────────────────────┼───────────────────────────────┤
│ 数据通路 │ CMD52 读寄存器为主 │ CMD52 控制 + CMD53 批量搬数据 │
└────────────────┴─────────────────────────────────┴───────────────────────────────┘
真实例子:WiFi + 蓝牙双模模块
┌─────────────────────────────────────┐
│ SDIO 卡(物理设备) │
│ Function 0:控制面板(CCCR/CIS) │ ← 管理整卡
│ Function 1:WiFi MAC 引擎 │ ← 收发网络数据
│ Function 2:蓝牙基带 │ ← 蓝牙数据
└─────────────────────────────────────┘
为什么拆 Function?
- 地址隔离:每个 Function 有独立地址空间,互不误写。
- 独立中断:事件精确到"哪个功能有数据"。
- 独立电源管理:可只给某个 Function 断电。
- 组合出货:一张卡 = 多个独立外设,主机可分别加载对应驱动。
5.3 CIA 与 Function 的关系
▎ CIA 是"地图",Function 是"房间"。地图上的地址指向哪个房间,CMD52/CMD53 就通过寻址去那个房间读写。CIA 里的 CCCR/CIS 描述"这张卡是谁、怎么用",Function 承载"实际业务数据往哪搬"。
SDIO 卡
┌────────────────────────────────────────────────┐
│ Function 0(控制平面) │
│ ├─ CCCR 0x00000~0x000FF 卡状态/总线配置 │ ┐
│ ├─ FBR 0x00100~0x001FF 各功能能力表 │ ├─ CIA 公共区
│ └─ CIS 0x01000~0x01FFF 厂商/产品信息 │ ┘
│ │
│ Function 1(业务平面) │
│ └─ 0x10000~0x1FFFF 业务寄存器+FIFO │
└────────────────────────────────────────────────┘
- 完整的初始化(枚举)流程
6.1 卡内部状态机
Inactive ──上电──► Idle ──CMD5──► Ready ──CMD3──► Ident ──CMD7──► Standby ──CMD52/53──► Tran(工作态)
每个命令都会让卡在状态间跳转。下面按步走一遍从"上电"到"驱动就绪"。
第 0 步:主机侧准备
- CLK 降到 400 kHz 以下(初始低速,所有卡都能接受)。
- CMD / DAT 线配置为输入并上拉。
- 上电,等待电源稳定。
第 1 步:CMD0 —— 全卡复位(可选但推荐)
主机 → CMD0(广播,无参数)
所有卡 → 复位到 Idle 状态
把所有卡"打回原点",保证探测从干净状态开始。
第 2 步:CMD5 —— 探测 & 电压协商(关键)
主机发 CMD5,参数携带主机支持的电压(OCR 编码)
卡回 R4:
- I/O 卡存在标志 = 1 → 确认是 SDIO 卡
- 电压匹配位 → 双方电压是否谈拢
- 卡就绪位 = 0 → 卡还在初始化,需要继续轮询
要点:
- 主机要反复发 CMD5,直到 R4 的"卡就绪位"= 1(类似轮询"你好了没")。
- 若 R4 显示 I/O 标志 = 0,说明不是 SDIO 卡(可能是纯存储卡),主机转去存储卡枚举流程。
- 若卡同时是存储卡("存储 + 无线"一体卡),R4 的内存标志位也会置位,主机之后还要单独初始化存储部分。
Host Card
│ CMD5(带电压) ────────────────────────►│
│ ◄──────────── R4(未就绪, OCR=xxx) │ 还在内部初始化
│ CMD5(带电压) ────────────────────────►│
│ ◄──────────── R4(就绪位=1) │ 好了
│ 状态: Idle → Ready │
第 3 步:CMD3 —— 给卡分配地址(RCA)
主机发 CMD3(无参数,卡自己选 RCA)
卡回 R6: 自选的 16 bit RCA + 状态
- 这张 RCA 就是卡的"身份证号",之后所有点对点命令都要带它。
- 多卡场景:主机对每张卡发一次 CMD3,从此能区分它们。
- 卡状态:Ready → Ident。
第 4 步:CMD7 —— 选中卡
主机发 CMD7,参数 = 目标卡的 RCA
选中成功的卡 → Standby(待命)状态
- 总线支持挂多卡,但同一时刻只有一张卡处于传输态,CMD7 就是"翻牌子"。
- 参数传 0 表示取消选中。
第 5 步:CMD52 —— 读 CCCR,确认卡的"底细"
用 CMD52 逐个读 Function 0 的 CCCR 寄存器:
┌───────────┬────────────────┬──────────────────┐
│ 读的地址 │ 得到什么 │ 用来干嘛 │
├───────────┼────────────────┼──────────────────┤
│ 0x00 │ CCCR/SDIO 版本 │ 确认协议版本兼容 │
├───────────┼────────────────┼──────────────────┤
│ 0x03 │ I/O 能力 │ 是否支持块传输 │
├───────────┼────────────────┼──────────────────┤
│ 0x07 │ 支持的总线宽度 │ 能不能切 4-bit │
├───────────┼────────────────┼──────────────────┤
│ 0x0D~0x0E │ 中断状态 │ 之后中断用 │
└───────────┴────────────────┴──────────────────┘
第 6 步:CMD53 —— 读 CIS,识别"这是谁家的卡"
用 CMD53(字节模式)从 0x01000 读 CIS 元组链,解析出厂商 ID + 产品 ID → 匹配驱动表 → 加载驱动。
第 7 步:切换总线宽度 —— 提速
① CMD52 写 CCCR 0x07 确认支持
② CMD52 写 CCCR 0x08 = 0b10 → 卡切到 4-bit
③ 主机把 CLK 从 400 kHz 升到 25/50 MHz
▎ 顺序必须:先让卡切宽度,主机再升时钟,否则通信就乱。
第 8 步:配置并启动业务 Function
① CMD52 写 CCCR 0x06(I/O 使能)= 目标 Function 位
② CMD52 写 CCCR 0x04(中断使能)= 允许该 Function 中断
③ 设置该 Function 的块大小(写 FBR)
④ CMD52 写 0x0B(总线中断使能)= 全局打开中断
第 9 步:驱动 probe,进入工作态
驱动 probe() 被调用 → 读 CIS 厂商私有数据
→ 下载固件(经 CMD53 写进卡的 RAM)
→ 使能中断(sdio_claim_irq)
→ 开始正常业务
卡状态:Standby → Tran(传输态)→ 工作
枚举流程图(完整版)
┌───────────────────────────────────────────────────────────────┐
│ 主机 │
│ ① CLK=400kHz,上电稳定 │
│ ② CMD0 ─► 全卡复位到 Idle │
│ ③ CMD5×N(轮询) ◄─ 确认SDIO卡 + 电压协商 + 等就绪 │
│ ④ CMD3 ◄─ 卡报上RCA(身份证号) │
│ ⑤ CMD7(RCA) ─► 选中卡 → Standby │
│ ⑥ CMD52 读CCCR ◄─ 版本/能力/宽度 │
│ ⑦ CMD53 读CIS ◄─ 厂商ID+产品ID → 匹配驱动 │
│ ⑧ CMD52 写CCCR ─► 切4-bit + 升时钟到50MHz │
│ ⑨ CMD52 写CCCR ─► 使能Function + 开中断 │
│ ⑩ 驱动probe() ─► 下载固件 → 进入Tran 工作态 │
└───────────────────────────────────────────────────────────────┘
- Linux 驱动视角
7.1 枚举代码对照
┌────────────┬─────────────────────────────────────────────────┐
│ 上面的逻辑 │ Linux 内核位置 │
├────────────┼─────────────────────────────────────────────────┤
│ 枚举总流程 │ drivers/mmc/core/sdio.c 的 mmc_sdio_init_card() │
├────────────┼─────────────────────────────────────────────────┤
│ CMD5 轮询 │ sdio_io_send_op_cond() │
├────────────┼─────────────────────────────────────────────────┤
│ CMD3 │ mmc_send_io_relative_addr() │
├────────────┼─────────────────────────────────────────────────┤
│ CMD7 │ mmc_select_card() │
├────────────┼─────────────────────────────────────────────────┤
│ CMD52 封装 │ sdio_io_rw_direct() │
├────────────┼─────────────────────────────────────────────────┤
│ CMD53 封装 │ sdio_io_rw_extended() │
├────────────┼─────────────────────────────────────────────────┤
│ CIS 解析 │ drivers/mmc/core/sdio_cis.c 的 sdio_read_cis() │
├────────────┼─────────────────────────────────────────────────┤
│ 匹配驱动 │ drivers/mmc/core/sdio_bus.c 的 sdio_bus_match() │
└────────────┴─────────────────────────────────────────────────┘
7.2 驱动开发常用 API
// 结构:设备是 sdio_func,驱动是 sdio_driver
struct sdio_driver {
char name;
int (probe)(struct sdio_func *func, const struct sdio_device_id id);
void (remove)(struct sdio_func *func);
};
// 注册 / 注销
sdio_register_driver(drv);
sdio_unregister_driver(drv);
// 访问函数
sdio_claim_host(func); // 独占总线(命令互斥)
sdio_readb/writeb(f, addr, &err); // CMD52 单字节
sdio_memcpy_fromio/toio(f, buf, addr, n); // CMD53 批量
sdio_enable_func(f); // 使能 Function
sdio_set_block_size(f, size); // 设置块大小
sdio_claim_irq(f, irq_handler); // 注册 DAT1 中断回调
sdio_release_host(func); // 释放总线
7.3 SD 卡 vs SDIO 卡(对照)
┌──────────┬────────────────┬──────────────────────┐
│ 维度 │ SD 存储卡 │ SDIO 卡 │
├──────────┼────────────────┼──────────────────────┤
│ 本质 │ 块存储设备 │ 寄存器型 I/O 设备 │
├──────────┼────────────────┼──────────────────────┤
│ 数据单元 │ 512B 块 │ 字节级随机访问 │
├──────────┼────────────────┼──────────────────────┤
│ 访问命令 │ CMD17/18/24/25 │ CMD52/53 │
├──────────┼────────────────┼──────────────────────┤
│ 可中断 │ 无(靠轮询) │ 有(DAT1 中断) │
├──────────┼────────────────┼──────────────────────┤
│ 功能数 │ 单一 │ 最多 7 个 Function │
├──────────┼────────────────┼──────────────────────┤
│ 典型设备 │ 存储卡 │ WiFi、蓝牙、GPS、NFC │
└──────────┴────────────────┴──────────────────────┘
-
总结与核心记忆点
┌────────────── 主机(SoC 的 MMC/SDIO 控制器)──────────────┐
│ mmc core → 命令层(CMD52/53) → 传输层 → CLK/CMD/DAT │
└──────────────────────────┬──────────────────────────────┘
│ CLK CMD DAT0~3
┌──────────────────────────▼──────────────────────────────┐
│ SDIO 设备(如 WiFi 模块) │
│ Function 0: CCCR/CIS(控制) Function 1: WiFi 数据 │
│ 寄存器空间 = 主机可读写的地址 ← 通过 CMD52/53 访问 │
│ 有事件时: 拉低 DAT1 → 触发主机中断 │
└──────────────────────────────────────────────────────────┘
一句话心法:SDIO = "能发中断的 SD 接口寄存器总线"。主机视角下,SDIO 外设就是一个带寄存器空间的 I/O 设备,一切通信归结为用 CMD52 读写寄存器、用 CMD53 批量搬数据。
五条核心记忆点:
- CMD52 = 字节级寄存器读写,读到的数据在 R5 响应里带回,没有独立数据线。
- CMD53 = 批量数据搬运,走 DAT 线,是高速外设(WiFi)的真正数据通道。
- CIA 是地图,Function 是房间:CIA(CCCR/FBR/CIS)描述卡的身份与配置,Function 0~7 是划分出的业务功能区。
- 枚举 = CMD0→5→3→7 把卡"问清身份",再用 CMD52/53 完成配置;其中只有 CMD5 需要反复轮询等卡就绪。
- DAT1 是 SDIO 的杀手锏:让设备能主动通知主机,支撑事件驱动的实时通信。

浙公网安备 33010602011771号