本流程是根据野火官方供应的F407源码绘制而来,可将照片另存为到自己电脑上进行观看
SDIO(Secure Digital Input Output)是在SD存储卡标准基础上扩展出来的一种接口标准,核心用于连接除了存储卡以外的输入/输出设备其典型的工作流程:就是(如Wi-Fi卡、蓝牙模块、GPS模块、摄像头等)。其工作流程围绕着主机(Host Controller)与SDIO卡之间的命令和数据交互展开,核心遵循SD物理层规范和SDIO规范。以下
核心阶段:
初始化与识别 (Initialization & Identification):
上电与时钟初始化: 主机向卡槽供电(VDD),并提供一个较低的初始时钟频率(通常为400kHz或更低)。
发送复位命令 (CMD0): 主机发送
CMD0
命令(带参数0x00000000
),使卡进入Idle
状态(SPI模式)或Pre-idle
状态(SD模式)。这是硬复位。检查接口条件 (CMD8): 主机发送
CMD8
命令,检查卡是否支持SD规范(特别是高电压范围)。卡会返回一个响应(R7),包含其支持的信息。初始化过程 (ACMD41): 主机发送
ACMD41
命令(实际是先发CMD55
表示下一个是应用命令,再发ACMD41
)。这个命令携带主机支持的工作电压范围、是否支持高容量(SDHC/SDXC)以及最关键的是设置HCS
位(Host Capacity Support)。主机在参数中设置HCS=1
表示支持SDHC/SDXC。卡在响应(R3)中返回OCR
寄存器内容:CCS
位:如果卡是SDHC/SDXC,此位会被置位(CCS=1
)。Busy
位:表示卡初始化是否完成。主机需要重复发送ACMD41
命令,直到卡的Busy
位变为1
(表示初始化完成)。
识别卡 (CMD2, CMD3):
主机发送
CMD2
命令,请求所有在线的卡发送其唯一的CID
寄存器(Card Identification Number)。所有卡都会响应(R2)。主机发送
CMD3
命令,请求一个卡发布其新的相对地址RCA
(Relative Card Address)。这个地址用于后续与该卡的专属通信。卡响应(R6)包含其RCA
。
选择卡 (CMD7): 主机发送
CMD7
命令,带上刚刚分配的RCA
,将该卡选中(进入Transfer State
)。此时其他卡进入Stand-by State
。只有被选中的卡才能进行后续的数据传输和配置操作。识别SDIO卡 (CMD5): 主机发送
CMD5
命令,查询卡是否支持SDIO功能。真正的SDIO卡会返回一个有效的响应(R4),其中包含重要的OCR
寄存器信息(特别是S18A
位表示是否支持1.8V信号电压)和Function
信息。这一步是区分纯存储卡和SDIO卡的关键。 主机根据响应判断卡是存储卡、SDIO卡还是组合卡(Combo Card)。
SDIO卡设置与功能初始化 (Card Setup & Function Initialization):
设置总线宽度 (ACMD6): 主机发送
ACMD6
命令(先CMD55
,再ACMD6
)设置数据总线宽度(1-bit 或 4-bit)。设置总线速度 (CMD6): 主机发送
CMD6
命令(Switch Function),切换到更高的总线速度模式(如High-Speed模式)。卡响应(R1)确认切换。设置信号电压 (CMD11): 如果在
CMD5
响应中卡表示支持1.8V(S18A=1
)且主机也支持,主机发送CMD11
命令请求切换到1.8V信号电平。切换成功后,主机和卡都切换到1.8V工作。读取卡特定数据 (CCCR, FBR):
主机使用
CMD52
(单字节读写)或CMD53
(多字节块读写)命令读取CCCR寄存器(Card Common Control Register),获取SDIO卡的整体能力信息(如支持的最高总线速度、是否帮助中断、是否支持挂起/恢复等)。主机使用
CMD52/CMD53
命令读取每个I/O功能(Function)的FBR寄存器(Function Basic Register),了解该功能的具体信息(如作用类型、是否启用、是否应该初始化等)。
初始化I/O特性:
主机通过
CMD52/CMD53
命令部署每个要求使用的I/O功能。这通常包括:设置功能特定的控制寄存器(启用/禁用功能、设置工作模式、配置中断等)。
可能加载固件到功能的内存(如果必须)。
启用功能的中断(在CCCR和功能寄存器中配置)。
主机可能需与功能特定的驱动程序交互来完毕更繁琐的初始化。
正常操作 (数据传输与中断处理):
数据传输 (Data Transfer):
命令阶段: 主机发送一个读写命令(
CMD52
用于单字节访问,CMD53
用于多字节块访问)。命令中指定:目标功能号(Function Number)
操作类型(读/写)
寄存器地址(或资料缓冲区地址)
数据长度(对于
CMD53
)地址模式(字节模式或块模式)
是否启用增量地址
响应阶段:否被接受以及状态。就是 SDIO卡返回命令响应(R1/R5),指示命令
素材阶段 (仅CMD53或有数据的CMD52): 如果是写操作,主机在发送命令后紧接着发送数据块。若是是读操作,卡在响应后紧接着发送请求的数据块。数据传输通过DAT[0:3]线进行。
CRC与状态: 数据传输结束后,发送方(主机或卡)发送CRC校验码。接收方验证CRC。结果,卡发送一个数据响应令牌(对于写管理)或主机发送停止命令(对于读处理)。
中断处理 (Interrupt Handling):
中断触发: 当SDIO卡上的某个功能需要主机服务时(如数据到达、状态改变),它会将DAT1线拉低(在4-bit模式下)。
主机检测: 主机控制器硬件检测到DAT1线变低(中断信号)。
中断轮询: 主机通常会在驱动程序中安排一个中断服务例程(ISR)。当硬件检测到中断,会触发CPU中断或通知驱动程序。
中断源识别: 主机使用
CMD52
命令读取CCCR寄存器的Int Pending
寄存器,确定是哪个效果产生了中断(每个特性对应一个位)。中断服务: 主机根据中断源,调用相应作用的中断处理程序进行处理(如读取接收到的数据、处理事件、清除中断标志等)。处理完后,卡会自动释放DAT1线(拉高)。
电源管理 (可选):
挂起 (Suspend - CMD52): 主机可以通过写机制寄存器或CCCR寄存器,将卡或特定功能置于低功耗挂起状态。
恢复 (Resume - CMD52): 主机通过写寄存器唤醒卡或功能。
掉电 (CMD0 - Soft Reset): 主机发送
CMD0
(软复位,参数0x00000000
)使卡进入Idle
状态,停止所有操作并降低功耗。之后需要重新初始化才能使用。
关键点总结:
命令驱动: 所有操作都由主机通过发送命令(
CMDx
)发起。寄存器访问: 配置和控制SDIO卡及其功能主要通过
CMD52
(单字节)和CMD53
(多字节)读写其内部寄存器(CCCR, FBR, 功能特定寄存器)实现。功能导向: 核心在于初始化和管理多个独立的I/O作用(Function)。
状态机: SDIO卡内部有一个艰难的状态机,主机经过发送特定命令使其在不同状态间转换(Idle, Ready, Ident, Stby, Tran, Data, Rcv, Prg, Dis, 以及SDIO特有的I/O状态)。
整个SDIO工作流程是一个精细的协议交互过程,主机驱动程序需要严格按照规范实现状态转换、命令发送、响应处理、数据传输和中断管理,才能与SDIO外设可靠、高效地通信。