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具体介绍如下

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数据分析

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

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

浙公网安备 33010602011771号