bool SdioDmaSdCard::waitForTransfer() const { // first wait for the SDIO interrupt while(!_sdioFinished); while(!_dmaFinished); // clear static flags SDIO_ClearFlag(SDIO_STATIC_FLAGS); // check for error return _sdioErrorCode==ErrorProvider::ERROR_NO_ERROR && _dmaErrorCode==ErrorProvider::ERROR_NO_ERROR; }
/************************************************************************* * Function Name: _SdSendCmd * Parameters: SdCmdInd_t ComdInd,Int32U Arg * * Return: SdState_t * * Description: SD/MMC commands implement * *************************************************************************/ static SdState_t _SdSendCmd(SdCmdInd_t ComdInd,pInt32U pArg) { SDIO_CmdInitTypeDef SDIO_CmdInitStructure; Int32U Status; Int32U timeout; // Send Command SDIO_CmdInitStructure.SDIO_CmdIndex = _SdCmd[ComdInd].TxData; SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No; SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; if(pArg != NULL) { switch(_SdCmd[ComdInd].Resp) { case SdR2: SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long; break; case SdR1: case SdR1b: case SdR3: case SdR7: SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; } } // Send command's arguments if(_SdCmd[ComdInd].Arg != SdNoArg) { SDIO_CmdInitStructure.SDIO_Argument = *pArg; } else { SDIO_CmdInitStructure.SDIO_Argument = 0; } // Clear all the static flags SDIO_ClearFlag(SDIO_STATIC_FLAGS); SDIO_SendCommand(&SDIO_CmdInitStructure); // Wait command respond if(CMD0 == ComdInd) { timeout = SDIO_CMD0TIMEOUT; do { if(0 == --timeout) { // Clear all the static flags return(SdNoResponse); } Status = SDIO->STA; } while (0 == (Status & SDIO_FLAG_CMDSENT)); } else { do { Status = SDIO->STA; } while(!(Status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))); } SDIO_ClearFlag(SDIO_FLAG_CMDSENT); if (Status & SDIO_FLAG_CTIMEOUT) { SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); return(SdNoResponse); } if (Status & SDIO_FLAG_CCRCFAIL) { SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); switch(_SdCmd[ComdInd].TxData) { // Ignore CRC Error case 1: // CMD1 case 41: // ACMD42 case 12: // CMD12 break; default: return(SdCardError); } } if(pArg != NULL) { switch (_SdCmd[ComdInd].Resp) { case SdNoResp: break; case SdR3: case SdR7: *pArg = SDIO_GetResponse(SDIO_RESP1); break; case SdR2: *pArg++ = SDIO_GetResponse(SDIO_RESP1); *pArg++ = SDIO_GetResponse(SDIO_RESP2); *pArg++ = SDIO_GetResponse(SDIO_RESP3); *pArg++ = SDIO_GetResponse(SDIO_RESP4); break; default: // Check response received is of desired command if (SDIO_GetCommandResponse() != _SdCmd[ComdInd].TxData) { return(SdCardError); } *pArg = SDIO_GetResponse(SDIO_RESP1); } } SDIO_ClearFlag(SDIO_FLAG_CMDREND); return(SdOk); }