当前位置: 首页 > news >正文

野火教程/SDIO工作流程/SDIO笔记

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

 

http://www.xdnf.cn/news/710533.html

相关文章:

  • C#泛型约束
  • ai如何绘制mg人物的睫毛
  • 虚拟机数据挂载映射
  • DeepSeek 赋能低空经济:无人机智能调度的破局之道
  • 自定义openfeign日志、拦截器、以及替换httpclient使用连接池
  • 华为OD机试真题——战场索敌(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 软考-系统架构设计师-第一章 架构设计基础
  • 11高可用与容错
  • HOW - 简历和求职面试宝典(六)
  • el-table-column如何获取行数据的值
  • lua注意事项
  • 【数据集信息整理】道路病害(缺陷)检测数据集归纳
  • 航电系统音频模块设计要点与技术突破
  • 【AI News | 20250529】每日AI进展
  • python里的NumPy算法
  • 深入理解设计模式之代理模式
  • K8S查看pod资源占用和物理机器IP对应关系
  • 鸿蒙next http网络请求工具类进阶版本来了
  • 5.29打卡
  • 动态内容加载时,爬虫应如何处理?
  • windows系统下通过visual studio使用clang tooling
  • Seata 面试题解析
  • 【计算机网络】第2章:应用层—Web and HTTP
  • 前端ul-image的src接收base64快捷写法
  • Day06
  • ubuntu22.04安装docker
  • 常见的SQLserver问题排查
  • AWS WebRTC:获取ICE服务地址(part 2): ICE Agent的作用
  • 第7讲、Odoo 18 源码深度分析
  • 多模态大语言模型arxiv论文略读(九十八)