SD_Error FindSCR(void)
{
u32 index = 0;
SD_Error errorstatus = SD_OK;
u32 *tempscr;
tempscr = (u32 *) & (SDCardInfo.SD_scr);
SDIO_CmdInitStructure.SDIO_Argu = (uint32_t)8; //发送CMD16
SDIO_CmdInitStructure.SDIO_CmdIdx = SD_CMD_SET_BLOCKLEN; //cmd16
SDIO_CmdInitStructure.SDIO_Resp = SDIO_Rsp_Short; //r1
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(SDIO1, &SDIO_CmdInitStructure);
errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN);
if(errorstatus != SD_OK)
{
return errorstatus;
}
SDIO_CmdInitStructure.SDIO_Argu = (uint32_t) SDCardInfo.RCA << 16;
SDIO_CmdInitStructure.SDIO_CmdIdx = SD_CMD_APP_CMD;//发送CMD55
SDIO_CmdInitStructure.SDIO_Resp = SDIO_Rsp_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(SDIO1, &SDIO_CmdInitStructure);
errorstatus = CmdResp1Error(SD_CMD_APP_CMD);
if(errorstatus != SD_OK)
{
return errorstatus;
}
SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
SDIO_DataInitStructure.SDIO_DataLen = 8;
SDIO_DataInitStructure.SDIO_DataBlkSize = SDIO_DataBlkSize_8b; //块大小8byte
SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
SDIO_DataConfig(SDIO1, &SDIO_DataInitStructure);
SDIO_CmdInitStructure.SDIO_Argu = 0x0;
SDIO_CmdInitStructure.SDIO_CmdIdx = SD_CMD_SD_APP_SEND_SCR; //发送ACMD51
SDIO_CmdInitStructure.SDIO_Resp = SDIO_Rsp_Short; //r1
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(SDIO1, &SDIO_CmdInitStructure);
errorstatus = CmdResp1Error(SD_CMD_SD_APP_SEND_SCR);
if(errorstatus != SD_OK)
{
return errorstatus;
}
while(!(SDIO1->STS & (SDIO_**_RXERRO | SDIO_**_DTFAIL | SDIO_**_DTTIMEOUT | SDIO_**_DTBLKCMPL | SDIO_**_SBITERR)))
{
if(SDIO_GetFlagStatus(SDIO1, SDIO_**_RXBUF) != RESET) //接收FIFO数据可用
{
*(tempscr + index) = SDIO_ReadData(SDIO1); //读取FIFO内容
index++;
}
}
if(SDIO_GetFlagStatus(SDIO1, SDIO_**_DTTIMEOUT) != RESET) //数据超时错误
{
SDIO_ClearFlag(SDIO1, SDIO_**_DTTIMEOUT);
return SD_DATA_TIMEOUT;
}
else if(SDIO_GetFlagStatus(SDIO1, SDIO_**_DTFAIL) != RESET) //数据块CRC错误
{
SDIO_ClearFlag(SDIO1, SDIO_**_DTFAIL);
return SD_DATA_FAIL;
}
else if(SDIO_GetFlagStatus(SDIO1, SDIO_**_RXERRO) != RESET) //接收fifo上溢错误
{
SDIO_ClearFlag(SDIO1, SDIO_**_RXERRO);
return SD_RX_OVERRUN;
}
else if(SDIO_GetFlagStatus(SDIO1, SDIO_**_SBITERR) != RESET) //接收起始位错误
{
SDIO_ClearFlag(SDIO1, SDIO_**_SBITERR);
return SD_START_BIT_ERR;
}
SDIO_ClearFlag(SDIO1, SDIO_STATIC_FLAGS); //清除所有标记
return errorstatus;
} |