在使用 SDIO (Secure Digital Input Output) 接口与 SD 卡进行通信时,扫卡(卡检测)流程是一个重要的步骤。以下是一般的 SDIO扫卡流程,详细描述了如何通过 SDIO 协议与 SD 卡进行初始化、卡检测和准备通信:
在开始扫描 SD 卡之前,首先需要初始化 SDIO 接口。这包括配置时钟源、数据线方向和 SDIO 控制寄存器。
配置 SDIO 控制器的时钟和电源,确保接口工作在适合的时钟频率上。
使能 SDIO 外设,并为后续操作配置必要的寄存器。
通过 卡插入引脚(Card Detect Pin) 或 SDIO 控制器的 卡检测状态寄存器 检测卡是否已经插入。
如果使用卡检测引脚,可以在此时检测到卡是否插入。
如果卡插入,SDIO 控制器会继续进行进一步的初始化。
当确认卡已插入后,向 SD 卡发送 CMD0(复位命令)。该命令会重置卡,进入 IDLE 状态。
发送命令后,SD 卡应答并返回响应。如果卡正常响应,表示卡已经插入并准备好进行下一步操作。
发送 CMD8(检测卡支持的电压范围) 来检查卡是否支持当前的电压范围。此命令通常会向卡发送一个 电压请求,并检查卡的响应。
如果卡正常响应,返回的是支持的电压范围和卡的版本信息。
CMD55 是一种用于准备卡进入应用模式的命令。它需要在发送 ACMD41(初始化卡) 之前发送。ACMD41 是用于启动卡的初始化过程。
通过发送 CMD55 + ACMD41,SD 卡会进入 初始化状态。
在此过程中,SD 卡会进入 准备就绪 状态,直到接收到初始化成功的响应。
一旦 SD 卡成功初始化,发送 CMD2(获取卡的CID寄存器) 命令,获取卡的唯一标识符(CID),这是每张 SD 卡的唯一信息。
该命令返回卡的唯一 ID 信息,包括制造商、产品编号、序列号等。
发送 CMD3 来请求设置一个临时的 卡地址(RCA)。此命令的返回值通常是卡的相对地址。
之后,发送 CMD7 来将卡置于选择状态,以便开始实际的读写操作。
通过发送 CMD9 命令,获取卡的 CSD(Card-Specific Data)寄存器,该寄存器包含关于卡的更多详细信息,如块大小、存储容量等。
根据 CSD 寄存器的信息,判断 SD 卡的类型(如 SD1.0、SD2.0、SDHC、SDXC 等)。
根据卡的类型配置适当的操作模式,包括块大小、数据速率等。
一旦卡初始化成功并获得必要的信息,就可以进行数据读写操作。此时 SDIO 接口已经准备好可以与卡进行数据交换。
在操作过程中,你可能需要轮询 SDIO 状态寄存器或使用中断来等待数据传输的完成。
如果发生错误或异常,如卡被移除,可以通过适当的错误处理中断或状态检查来应对。
卡检测:通过物理卡插入引脚或状态寄存器检测。
初始化:发送复位命令(CMD0),然后通过 CMD8、CMD55 和 ACMD41 完成初始化。
卡信息读取:通过 CMD2 获取卡的 CID,CMD9 获取 CSD,进一步配置卡。
数据读写准备:完成卡的配置后,便可以开始进行数据读写操作。
整个流程的关键是 卡初始化过程,确保 SD 卡被正确识别和配置,以便后续数据交互。