SDIO操作SD卡之SD_SelectDeselect函数解析

SD_SelectDeselect 函数具体内容如下:

/*********************************************************************
 * @fn       SD_SelectDeselect
 *
 * @brief   Select deselect
 *
 * @param  addr - RCA address
 *              
 * @return  SD_Error -  ERR code
 */
SD_Error SD_SelectDeselect( u32 addr )
{
    SDIO_CmdInitStructure.SDIO_Argument =  addr;
    SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEL_DESEL_CARD;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand( &SDIO_CmdInitStructure );

    return CmdResp1Error( SD_CMD_SEL_DESEL_CARD );
}

该函数主要用于 选中/取消选中SD卡。向SD卡发送CMD7命令,选中一张卡(进入Transfer 状态)或 取消选中(回到StandBy状态)。

SDIO_CmdInitStructure.SDIO_Argument =  addr;

参数addr必须是卡的RCA(16位地址,左移16位传入),告诉SD卡“我要选中/取消选中这张地址为xxx的卡”,RCA地址由SD_InitializeCards函数中获取,具体可看下帖介绍

SDIO操作SD卡之SD_InitializeCards函数解析

SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEL_DESEL_CARD;

CMD7,选中/取消选中卡命令,为SD卡标准命令。CMD7 的作用是选择一张卡,然后把它切换到传输模式,每次只能有一张卡处于传输模式。如果一张处于传输模式的卡同主机的连接被释放,那么它会回到“Stand-by”状态。当 CMD7 带着参数RCA=0x0000 发送的时候,所有的卡都会回到“Stand-by”状态。
CMD7具体介绍如下

image

SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

CMD7响应为短响应

 

return CmdResp1Error( SD_CMD_SEL_DESEL_CARD );

返回值说明

  • SD_OK:成功选中/取消
  • SD_CMD_RSP_TIMEOUT:卡响应超时,无响应
  • SD_CMD_CRC_FAIL:命令校验错误
  • 其他:卡状态错误

下图为CMD7数据分析

image

其中ARG参数为SD卡的RCA地址,为0xAAAA。对应R1响应数据如下:

image

 

总结:
SD_SelectDeselect 就是发送 CMD7,用 RCA 地址选中 SD 卡,让卡进入可读写状态!

 

posted @ 2026-05-15 16:20  ZaiLi  阅读(38)  评论(0)    收藏  举报