现象:初始化时CMD0命令执行正常,CMD1命令未获取到emmc模块有效电压。
emmc芯片型号: 三星KLM8G1GEME-B041。
emmc模块20pin引脚定义如下图:
uint8_t InitAppEmmc(void)
{
uint8_t Result = EMMC_SUCCESS; /* 返回值 */
uint8_t Work[512];
Result = InitEmmc_EMMC();
if(Result != EMMC_SUCCESS)
{
return Result;
}
MX_FATFS_Init();
// retUSER=f_mkfs(" ",FM_FAT32|FM_SFD,512,Work,512);
if(f_mount(&m_fs, " ", 1) != FR_OK)
{
Result = EMMC_FAILED;
}
return Result;
}
static uint32_t PowerOn_EMMC(EMMC_CardInfoDef* pCardInfo)
{
uint32_t Result = SDMMC_ERROR_NONE; /* 返回值 */
uint32_t Response = 0; /* 应答 */
uint32_t ValidVoltage = 0; /* 有效电压 */
__IO uint32_t Count = 0; /* 有效电压 */
Result = CmdGoIdleState_EMMC(); /* CMD0: 进入空闲状态 */
if(Result != SDMMC_ERROR_NONE)
{
return Result;
}
while(ValidVoltage == 0U)
{
if(Count++ == SDMMC_MAX_VOLT_TRIAL)
{
return SDMMC_ERROR_INVALID_VOLTRANGE;
}
Result = CmdOpCondition_EMMC(eMMC_HIGH_VOLTAGE_RANGE); /* CMD1 */
if(Result != SDMMC_ERROR_NONE)
{
return SDMMC_ERROR_UNSUPPORTED_FEATURE;
}
Response = SDIO_GetResponse(SDIO_RESP1); /* 命令回应 */
ValidVoltage = (((Response >> 31U) == 1U) ? 1U : 0U); /* 操作电压 */
}
/* 操作电压有效 */
if ((Response & eMMC_HIGH_VOLTAGE_RANGE) == MMC_HIGH_VOLTAGE_RANGE)
{
/*卡电压范围 2.7V ~ 3.6V */
pCardInfo->CardType = MMC_HIGH_VOLTAGE_CARD;
}
else
{
/* 卡电压范围 1.65V ~ 1.95V 或 2.7V ~ 3.6V */
pCardInfo->CardType = MMC_DUAL_VOLTAGE_CARD;
}
return SDMMC_ERROR_NONE;
}
排查过程:
1 检查硬件SIDO相关引脚定义与软件对应是否正确;
2 检查Emmc命令时序是否正确;
3 用读卡器连接电脑,重新对emmc格式化为FAT32;
4 用万用表测量emmc模块供电是否正常;
以上种种无效
亲测有效的方法:
将数据引脚EMMC_D1 ~ EMMC_D8引脚全部接上拉电阻,EMMC_CLK引脚接上拉电阻,模块重新上电初始化通过,文件系统挂载成功,至此完美解决。