SDIO 枚举协商的详细流程
SDIO(Secure Digital Input Output)枚举是主机识别并配置连接的 SDIO 设备(如 Wi-Fi 模块或存储卡)的核心过程,通过协议协商确定通信模式、总线参数等。完整流程基于主从架构,由主机主导,具体步骤如下:
1. 初始化阶段
主机通电后,向 SDIO 设备提供基础电源(默认 3.3V)和时钟信号(CLK),确保设备进入待机状态;同时通过 CMD 线发送初始化命令(如 CMD0 复位设备),使设备准备好后续交互 1。此阶段重点建立物理层同步,时钟频率通常从低速开始(如 400kHz)以兼容老旧设备 8。
2. 识别设备阶段
主机广播 "识别命令"(如 CMD5,专用于 SDIO 设备),询问设备类型和能力;设备通过 DAT 线响应,返回其身份信息(如 Vendor ID、设备类别——Wi-Fi 模块或 SD 卡)。主机据此验证设备合法性及支持的模式(如 1-bit 或 4-bit 总线)12。
3. 分配地址阶段
主机为已验证设备分配唯一地址(Relative Address,RCA),通过 CMD3 命令发送地址值;设备保存该地址并确认响应,后续所有通信均基于此地址定位设备 1。此步骤避免总线上的多设备冲突 2。
4. 配置阶段
主机根据设备能力发起参数协商:
总线模式切换:通过 ACMD6 命令切换数据线宽度(例如从 1-bit 升级至 4-bit 并行传输)。
电压与速率协商:主机发送 CMD11 请求切换到 1.8V 低电压(若设备支持 UHS-I),并基于 CMD6 选择最优速度模式(如 SDR25 或 DDR50),设备返回支持的频率列表 。
功能寄存器配置:主机写入设备的功能寄存器(如中断使能、块大小设置),定制化设备行为 。
5. 功能探测阶段
主机执行实际测试以确认设备功能:
发送读写命令(如 CMD53)验证数据传输路径;
触发中断测试(DAT1 线),检查设备能否主动通知事件(如数据就绪);
对于存储卡,读取特定扇区;对于 Wi-Fi 模块,发送测试报文 。
设备响应操作结果,主机据此判断是否正常 。
6. 枚举完成阶段
主机确认所有测试通过后,设备进入工作状态。此时,SDIO 设备可执行正常任务(如传输数据或处理中断),主机停止枚举流程并释放控制权 。
SDIO的工作电平探测和协商
1. 协议规范与初始化机制
CMD8的电压强制要求
根据SD协议规范,设备初始化阶段(含CMD8)必须使用3.3V电平,原因包括:
默认供电状态:SD卡上电后,I/O引脚默认仅支持3.3V输入,尚未激活1.8V模式
电气兼容性:所有SD2.0及以上版本设备必须兼容3.3V初始通信(即使后续切至1.8V)
CMD8的功能设计
电压协商探测:主机通过CMD8参数声明支持的电压范围(如0x1AA表示2.7-3.6V),子卡响应包含其电压支持标志
协议版本检测:无CMD8响应表明子卡仅支持SD1.0协议(仅3.3V);有响应则支持SD2.0+协议(可切1.8V)
2. 1.8V子卡的安全机制
即便子卡仅支持1.8V工作电压,在接收3.3V CMD8时仍通过以下设计保障安全:
电气层保护
钳位二极管:子卡I/O引脚内置保护电路,将输入信号电压钳制在安全范围(通常≤VDD+0.3V)
低速模式容差:CMD8阶段时钟频率仅为400kHz,信号畸变风险低13。
协议层响应策略
子卡在3.3V信号下解析CMD8参数
若发现主机不支持1.8V(如参数未包含1.8V标志):返回电压不匹配响应(如Voltage Field = 0),触发主机放弃初始化
若主机支持1.8V:子卡响应电压匹配标志,后续通过CMD11切换至1.8V模式
3. 如不巧主机不支持sdio接口的1.8V切换,从设备的sdio接口又是1.8V的
那么主机的dts的shci主机节点就要设置no-1-8-v属性来声明不支持1.8V切换,该属性会禁用SD规范中的电压切换流程(CMD11命令),避免设备协商切换到1.8V模式,因为主机不支持1.8V,应该这样来避免流程出错
但是需要通过电平转换模块,来将3.3V的主机信号,转换成1.8V的信号到从机
SDIO 模式可分为 传输协议 和 电气规范
命令体系
SDIO(Secure Digital Input Output)协议的命令体系包含多种类型,按功能和用途可分为以下四类,各类型的核心命令及作用如下表所示
🔍 一、标准命令(Standard Commands)
命令 | 功能描述 | 典型应用场景 | 响应类型 |
---|---|---|---|
CMD0 | 复位设备至空闲状态(Idle) | 初始化流程起点 | 无响应 |
CMD2 | 获取设备的CID(Card Identification Register) | 设备身份识别 | R2 |
CMD3 | 获取设备的RCA(Relative Card Address) | 分配唯一设备地址 | R6 |
CMD7 | 通过RCA选择/取消选择设备 | 激活设备通信 | R1/R1b |
CMD8 | 检查设备支持的电压范围(如2.7–3.6V) | SDHC/SDXC卡初始化兼容性校验 | R7 |
CMD13 | 查询设备状态寄存器内容 | 实时监控设备异常状态 | R1 |
二、应用命令(Application Commands, ACMD)
命令 | 功能描述 | 依赖的前置命令 | 响应类型 |
---|---|---|---|
ACMD41 | 初始化设备并协商操作条件(OCR寄存器,含电压范围及高速支持标志HCS位) | CMD55 | R3 |
ACMD6 | 配置总线宽度(1-bit或4-bit模式,如参数0x00000202 表示4-bit总线) |
CMD55 | R1 |
ACMD51 | 读取设备的SCR(SD配置寄存器),获取安全特性信息 | CMD55 | R1 |
📡 三、SDIO专属命令
命令 | 功能描述 | 响应类型 | 适用设备 |
---|---|---|---|
CMD5 | 检测SDIO设备并获取其支持电压范围(响应包含OCR字段) | R4/R5 | 仅SDIO设备 |
CMD52 | 单字节读写I/O设备寄存器(如配置Wi-Fi模块中断使能位) | R5 | 仅SDIO设备 |
CMD53 | 多字节/块数据传输(如批量读写Wi-Fi模块数据缓冲区) | R5 | 仅SDIO设备 |
🧩 四、响应类型
SDIO协议定义了多种响应格式,与命令类型强关联:
响应类型 | 长度 | 用途 | 对应命令示例 |
---|---|---|---|
R1 | 32-bit | 返回通用状态(含错误标志) | CMD7、CMD13 |
R1b | 32-bit+ | R1扩展,含忙状态指示(DAT线持续低电平) | CMD12(停止传输) |
R2 | 136-bit | 返回长数据(CID/CSD寄存器内容) | CMD2、CMD9 |
R3 | 32-bit | 返回OCR寄存器值(电压范围) | ACMD41 |
R6 | 32-bit | 返回分配的RCA地址 | CMD3 |
R7 | 32-bit | 返回电气特性(电压支持及检查模式) | CMD8 |
R4/R5 | 32-bit | SDIO专用响应(含中断状态或I/O错误信息) | CMD5、CMD52、CMD53 |