Beispiel #1
0
  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;
  }
Beispiel #2
0
/*************************************************************************
 * 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);
}