求565/569评估板EMMC存储器擦除的例程

求565/569评估板EMMC存储器擦除的例程,邮箱个人信息保护,已隐藏

谢谢

CH569EVT例程中提供了EMMC命令执行函数:

#define EMMCSendCmd(a, b) {R32_EMMC_ARGUMENT = a; R16_EMMC_CMD_SET = b;}

根据标准

image.png

(图片截取自《嵌入式多媒体设备(e-MMC)电气标准 4.51》)

R32_EMMC_ARGUMENT寄存器传入参数,R16_EMMC_CMD_SET寄存器传入命令号以及命令类型。

具体可以通过学习块写、块读、读EXCSD时的调用方式,对照协议修改一下即可。


EMMC通常不需要擦就可以直接写入。




例子1:CMD8

image.png

例程代码:

UINT8 EMMCCardReadEXCSD( PSD_PARAMETER pEMMCPara, PUINT8 pRdatbuf )
{
    UINT32 cmd_arg_val;
    UINT16 cmd_set_val;
    R32_EMMC_DMA_BEG1 = (UINT32)pRdatbuf;
    R32_EMMC_TRAN_MODE = 0;
    R32_EMMC_BLOCK_CFG = 512<<16 | 1;
    cmd_arg_val = 0;
    cmd_set_val = RB_EMMC_CKIDX |
                  RB_EMMC_CKCRC |
                  RESP_TYPE_48  |
                  EMMC_CMD8;
    EMMCSendCmd(cmd_arg_val, cmd_set_val);
    while(1)
    {
        if(R16_EMMC_INT_FG & RB_EMMC_IF_TRANDONE)   break;
        if( pEMMCPara->EMMCOpErr )      return CMD_FAILED;
    }
    R16_EMMC_INT_FG = 0xffff;
    return  OP_SUCCESS;
}

其中:

1、应答类型,SPEC指示为R1,例程参数为RESP_TYPE_48

2、参数,SPEC指示为填充位,即没什么用,所以例程代码赋值0




例子2:CMD9

image.png

例程代码:

UINT8 EMMCReadCSD( PSD_PARAMETER pEMMCPara )
{
    UINT32 cmd_arg_val;
    UINT16 cmd_set_val;
    UINT8  sta;
    UINT32 disk_block_num = 0;
    cmd_arg_val = pEMMCPara->EMMC_RCA<<16;
    cmd_set_val = 0 |
                  0 |
                  RESP_TYPE_136 |
                  EMMC_CMD9;
    EMMCSendCmd(cmd_arg_val, cmd_set_val);
    while(1)
    {
        sta = CheckCMDComp( pEMMCPara );
        if( sta != CMD_NULL ) break;
    }
    if(sta == CMD_SUCCESS)
    {
        pEMMCPara->EMMC_CSD[0] = R32_EMMC_RESPONSE0;
        pEMMCPara->EMMC_CSD[1] = R32_EMMC_RESPONSE1;
        pEMMCPara->EMMC_CSD[2] = R32_EMMC_RESPONSE2;
        pEMMCPara->EMMC_CSD[3] = R32_EMMC_RESPONSE3;
        disk_block_num = (((pEMMCPara->EMMC_CSD[2]&0x3ff)<<2) | ((pEMMCPara->EMMC_CSD[1])>>30));
        if(disk_block_num == 0xFFF)
        {
            pEMMCPara->EMMCSecNum = 0xFFF;
        }
        else
        {
            pEMMCPara->EMMCType = EMMCIO_CAPACITY_SD_CARD_V2_0;
            /* memory capacity = BLOCKNR*BLOCK_LEN = (C_SIZE+1)<<(C_SIZE_MULT+2)<<(READ_BL_LEN) */
            disk_block_num = ( (((pEMMCPara->EMMC_CSD[2]&0x3ff)<<2) | (pEMMCPara->EMMC_CSD[1]>>30)) + 1 );
            disk_block_num = ( (disk_block_num) << (((pEMMCPara->EMMC_CSD[1]>>15)&0x07) + 2));
        }
    }
    pEMMCPara->EMMCSecSize = 1<<((pEMMCPara->EMMC_CSD[2]>>16)&0x000f);
    return sta;
}

其中:

1、应答类型,SPEC指示为R2,例程参数为RESP_TYPE_136

2、参数,SPEC指示为[31:16] RCA [15:0] 填充位,例程代码赋值pEMMCPara->EMMC_RCA<<16


调用方式类似,根据SPEC指示,将参数写入到两个寄存器中。

image.png


只有登录才能回复,可以选择微信账号登录