在使用eMMC卡进行数据通信时,需要在启动时正确设置通信的CLK频率。如果设置不正确,会引起通信失败。如下所示是在启动时设置eMMC通信的CLK频率为50MHz的示例代码:
#define EMMC_CLOCK_FREQ 50000000UL //设置eMMC通信的CLK频率为50MHz
void init_emmc_clock(void) {
//设置eMMC的时钟
uint32_t gpiopin = readl(RM_PINMUX(gpio[pin].pinmux_offset));
writel(gpiopin & 0xFFFFFFF8 | 0x3, RM_PINMUX(gpio[pin].pinmux_offset));
//设置eMMC的时钟频率
writel((readl(RM_PER_DEV_HV_EMMC_CLKCTRL) &~ RM_PER_DEV_HV_EMMC_CLKCTRL_CLKSEL_MASK)
| RM_PER_DEV_HV_EMMC_CLKCTRL_CLKSEL_DIV2
| RM_PER_DEV_HV_EMMC_CLKCTRL_CLKACTIVITY_OSC,
RM_PER_DEV_HV_EMMC_CLKCTRL);
//等待时钟设置完成
while (!(readl(RM_PER_DEV_HV_EMMC_CLKCTRL) & RM_PER_DEV_HV_EMMC_CLKCTRL_CLKACTIVITY))
;
}
以上示例代码中,通过设置EMMC_CLOCK_FREQ变量为50MHz,然后在init_emmc_clock函数中,设置eMMC的时钟频率为EMMC_CLOCK_FREQ的1/2,即25MHz。如果需要其他频率,只需要更改EMMC_CLOCK_FREQ变量的值,并相应计算出eMMC的频率即可。