探索者STM32F407,如何将SD卡全片擦除?

2019-07-21 00:28发布

我现在使用的是探索者开发板STM32F407,想要实现SD卡的全片擦除,但是探索者没有相关的程序源码,我在论坛上只能找到MINI开发板的程序,如下:
void SD_Format()
{
    u8 r1;
    u32 sector;
    if(SD_Type!=SD_TYPE_V2HC)
        sector = sd_size * 512;//转换为字节地址
    if(SD_Type == SD_TYPE_MMC)
    {
        do
        {      
            r1=SD_SendCmd(CMD35,0,0X01);//设置擦除首地址
            r1=SD_SendCmd(CMD36,sector,0X01);//设置擦除最后地址
        }while(r1!=0 && sector--);
        while(1);
    }   
    else
    {
        r1=SD_SendCmd(CMD32,0,0X01);//
        r1=SD_SendCmd(CMD33,sector,0X01);//
    }

    r1=SD_SendCmd(CMD38,0,0x01);// 开始擦除
    if(r1 == 0)
    {
        ;
    }
}

在探索者开发板的资料中,我找不出与SD_SendCmd()函数功能相同的函数,特求助各位大神以及原子哥,多谢了!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
八度空间
2019-07-21 02:46
[mw_shl_code=applescript,true]SD_Error SD_Erase(long long startaddr, long long endaddr)
{
        SD_Error errorstatus = SD_OK;
        uint32_t delay = 0;
        __IO uint32_t maxdelay = 0;
        uint8_t cardstate = 0;
        
        /*!< Check if the card coomnd class supports erase command */
        if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0)
        {
                errorstatus = SD_REQUEST_NOT_APPLICABLE;
                return errorstatus;
        }
        
        maxdelay = 120000 / ((SDIO->CLKCR & 0xFF) + 2);
        
        if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
        {
                errorstatus = SD_LOCK_UNLOCK_FAILED;
                return errorstatus;
        }
        
        if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
        {
                startaddr /= 512;
                endaddr /= 512;
        }
        
        /*!< According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */
        if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) ||
                (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) ||
            (SDIO_HIGH_CAPACITY_SD_CARD == CardType))
        {
                /*!< Send CMD32 SD_ERASE_GRP_START with argument as addr  */
                SDIO_CmdInitStructure.SDIO_Argument =(uint32_t)startaddr;
                SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_START;
                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);
               
                errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_START);
                if (errorstatus != SD_OK)  return errorstatus;
               
                /*!< Send CMD33 SD_ERASE_GRP_END with argument as addr  */
                SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)endaddr;
                SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_END;
                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);
               
                errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_END);
                if (errorstatus != SD_OK)  return errorstatus;
        }
        
        /*!< Send CMD38 ERASE */
        SDIO_CmdInitStructure.SDIO_Argument = 0;
        SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ERASE;
        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);
        
        errorstatus = CmdResp1Error(SD_CMD_ERASE);
        if (errorstatus != SD_OK)  return errorstatus;
        
        for (delay = 0; delay < maxdelay; delay++)
        {}
        
        /*!< Wait till the card is in programming state */
        errorstatus = IsCardProgramming(&cardstate);
        delay = SD_DATATIMEOUT;
        while ((delay > 0) && (errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate)))
        {
                errorstatus = IsCardProgramming(&cardstate);
                delay--;
        }
        
        return errorstatus;
}[/mw_shl_code]

一周热门 更多>