本流程是根据野火官方供应的F407源码绘制而来,可将照片另存为到自己电脑上进行观看

 

SDIO(Secure Digital Input Output)是在SD存储卡标准基础上扩展出来的一种接口标准,核心用于连接除了存储卡以外的输入/输出设备其典型的工作流程:就是(如Wi-Fi卡、蓝牙模块、GPS模块、摄像头等)。其工作流程围绕着主机(Host Controller)与SDIO卡之间的命令和数据交互展开,核心遵循SD物理层规范和SDIO规范。以下

核心阶段:

  1. 初始化与识别 (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)。

  2. 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和功能寄存器中配置)。

      • 主机可能需与功能特定的驱动程序交互来完毕更繁琐的初始化。

  3. 正常操作 (数据传输与中断处理):

    • 数据传输 (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状态,停止所有操作并降低功耗。之后需要重新初始化才能使用。

关键点总结:

  1. 命令驱动: 所有操作都由主机通过发送命令(CMDx)发起。

  2. 寄存器访问: 配置和控制SDIO卡及其功能主要通过CMD52(单字节)和CMD53(多字节)读写其内部寄存器(CCCR, FBR, 功能特定寄存器)实现。

  3. 功能导向: 核心在于初始化和管理多个独立的I/O作用(Function)。

  4. 状态机: SDIO卡内部有一个艰难的状态机,主机经过发送特定命令使其在不同状态间转换(Idle, Ready, Ident, Stby, Tran, Data, Rcv, Prg, Dis, 以及SDIO特有的I/O状态)。

整个SDIO工作流程是一个精细的协议交互过程,主机驱动程序需要严格按照规范实现状态转换、命令发送、响应处理、数据传输和中断管理,才能与SDIO外设可靠、高效地通信。

 

posted on 2025-10-08 19:32  ycfenxi  阅读(16)  评论(0)    收藏  举报