RK3568处理器eMMC接口CLK分频设置无效问题求助
RK3568裸机eMMC时钟分频不生效问题排查方案
一、寄存器配置准确性校验
- 核对
SDHCI_DIV_MASK、SDHCI_DIVIDER_SHIFT等宏定义与RK3568 SDHCI控制器手册的一致性。RK3568的SDHCI分频器可能采用10位配置(低8位+高2位),若宏定义偏移或位宽错误,会导致分频值写入无效,最终输出与输入时钟一致。 - 确认
EMMC_CLK_CTRL的地址偏移是否匹配芯片手册的寄存器映射。RK3568不同SDHCI控制器(如eMMC对应SDHCI2)的地址偏移可能存在厂商定制,避免因地址错误导致配置失效。 - 写入分频配置后,强制读回
EMMC_CLK_CTRL寄存器,验证分频位是否正确写入。裸机环境下无cache同步机制,可能出现写操作未真正落位的情况,读回验证能排除这类问题。
二、时钟配置时序调整
当前代码的时钟使能顺序可能存在问题,尝试调整为以下流程:
- 先关闭输出时钟(清
SDHCI_CLOCK_CARD_EN位),保持内部时钟开启 - 写入分频配置值
- 等待至少3个输入时钟周期(无需500ms,RK3568输入时钟最低24MHz,3个周期仅125ns,足够分频器稳定)
- 再开启输出时钟
- 检查
mmcsd_reset(SDHCI_RESET_ALL)后的寄存器状态:全复位会清空控制器配置,复位后需确认时钟相关寄存器处于默认初始态,避免残留配置干扰新设置。
三、输入时钟源与全局使能检查
- 确认eMMC外设的输入时钟源
freq_1是否正确配置。通过CRU模块寄存器(如CRU_CLKSEL14)读取实际输入到SDHCI的时钟频率,排除因输入时钟本身就是目标分频频率导致的误解。 - 检查CRU模块中eMMC时钟的全局使能位是否已打开。若全局时钟未使能,输入时钟无法进入SDHCI外设,分频配置自然无效。
四、硬件与引脚配置排查
- 用示波器实测eMMC CLK引脚输出频率,确认问题真实存在,排除测量误差或认知偏差。
- 检查eMMC电源引脚电压稳定性(初始化阶段应为3.3V),电源波动可能导致时钟模块工作异常。
- 验证GPIO复用配置:确保eMMC CLK引脚已切换到SDHCI功能模式,而非通用GPIO模式,引脚复用寄存器设置需与芯片手册一致。
五、官方代码参考对比
对比瑞芯微官方RK3568裸机SDK中的eMMC初始化代码,重点关注时钟配置的时序细节。官方代码可能包含厂商特有的处理逻辑(如额外的时钟同步寄存器操作、复位后的特定延迟),这些细节往往是问题的关键。
问题复现代码
mmcsd_reset(mmcsd_dev_p, SDHCI_RESET_ALL); mmcsd_gpio_init(); HWREGB(mmcsd_dev_p->reg_base + EMMC_PWR_CTRL) = 0x01; // set bit Bus power ON cyg_uint16 clk = 0; cyg_uint16 div = 2; // some divider for output clk HWREGH(mmcsd_dev_p->reg_base + EMMC_CLK_CTRL) = clk; // disable clk delay_us(1000); // Set divider and input CLK clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT; clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN) << SDHCI_DIVIDER_HI_SHIFT; clk |= SDHCI_CLOCK_INT_EN; HWREGH(mmcsd_dev_p->reg_base + EMMC_CLK_CTRL) = clk; // wait stable input clk hal_delay_us(500 * 1000); // Enable output clk clk = HWREGH(mmcsd_dev_p->reg_base + EMMC_CLK_CTRL); clk |= SDHCI_CLOCK_CARD_EN; HWREGH(mmcsd_dev_p->reg_base + EMMC_CLK_CTRL) = clk;
内容的提问来源于stack exchange,提问作者никита богатов
相关产品推荐
相关产品推荐

