野火教程/SDIO工作流程/SDIO笔记
本流程是根据野火官方提供的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外设可靠、高效地通信。