TI论坛
直播中

bozai602

7年用户 211经验值
私信 关注

请问为什么AM335X DDR内存无法初始化?怎么解决?

本帖最后由 一只耳朵怪 于 2018-6-21 08:45 编辑

问题背景:
参考AM3358的EVM(TMDSSK3358 )官方的开发板设计了一块新硬件系统,新设计的硬件系统只是外设裁剪了一些,内存以及电源管理芯片等都是保持和EVM官方开发板一致。
该硬件系统uboot已经验证通过(uboot2015.7),内核测试正常

问题:考虑成本,目前使用AM3352BZCZA60来代替AM3358,其他不变。然后使用串口加载编译好的uboot,发现加载SPL死机。后面按照下文修改uboot,重新加载SPL
问题分析:
SPL软件流程--start.s 主要是CPU的中断设置,关闭MMU等--调用lowlevel_init.S 禁止看门狗 初始化相关的UART--crt0.S调用_main函数该文件调用一个重要的函数board_init_f函数:1.board_early_init_f();//初始化时钟树 PLL 主要设置了MPU的频率为300MHZ设置内核频率输出200MHZ/250MHZ设置DDR的输出时钟为303MHZ,注意DDR PLL 的输入参考时钟源来至外部晶振时钟树的关系 ---|OSC|外部24MHZ ---  |  |------------------------------------------------  |                        |                       | ---------               --------             ---------|DPLL_CORE|             |DPLL_MPU|           | DPLL_DDR| ---------               --------             ---------2.sdram_init(); //初始化 DDR,这个函数初始化SDRAM注意:初始化SDRAM完成之后,才会通过函数am335x_get_efuse_mpu_max_freq(cdev)来读取 efuse_sma 寄存器的低 13 位来判别芯片 MPU 的最大频率 Fmax,。接着初始化 PMIC,使得芯片工作电压满足最高频率 。 最后设置 Core 频率=1G 和 Mpu 最大频率 Fmax,am3352返回最大的频率为600MHZ,从上述描述可以知道,SDRAM和MPU之间的没有关系以及时钟之间也没有关系,因为MPU一开始都是设置为300MHZ的频率,设置为最高的工作频率是在SDRAM后面开始设置的调试的时候:在sdram_init后面加入内存检查函数        uint *start_addr =  (uint *)0x80000000;        uint *src_start_addr =  (uint *)0x80000000;        int i;        uint tmpdata;        for(i = 0; i < 10; i++)        [                *(start_addr++) = i;        ]        for(i=0; i < 10; i ++)        [                tmpdata = *(src_start_addr ++);                if(tmpdata != i)                [                        debug_voip(100);//指示灯闪烁 快 (错误状态)                ]        ]                while(1)  //停止在这里        debug_voip(3000);//指示灯闪烁 慢将上面的SPL程序烧录到老版本的硬件板子,程序运行正常(不会进入到快闪烁指示),然后将程序烧录到新的硬件中,进入错误状态总结:因为内存电路包括内存芯片这一块完全相同,电源都测试过,都正常,并且程序都只运行到SDRAM初始化阶段,理论上烧录同一块SPL代码,都会进入到正常状态请教的问题:AM3352和AM3358是否完全兼容???上面的问题分析是否有误???DDR无法初始化是否和我换了MPU有关???

回帖(1)

吴思莹

2018-6-21 02:57:47
AM3352和AM3358是完全兼容的,所以如果是正确的DDR3的配置,同样的SPL是应该可以保证全启动起来的。
看你的描述,应该还是挂在DDR上面了,建议先确认一下对于DDR3的时钟配置和参数配置之类的信息是否都是正常配置成功了,一定要通过回读寄存器值的方式来查验。如果确认时钟方面配置一切正常了,对于DDR3问题的排查,建议分以下几步走:
1. 首先确认你的硬件设计,在先后的两板上,是否有差异,同时,确认一下,DDR3的型号,还有layout,以及外部VTT的使用是否都一致。
2. 根据DDR3的型号,和当前板子的layout走线长度,来对当前的办卡进行配置。注意:及时使用了同样的DDR3型号,板子层数不同,layout有差异,都是会对最终配置产生影响的,所以不要怕麻烦,先配置好EMIF的timing参数,SDRAMCONFIG参数,还有配置好PHY的初始值。
3. 最重要的一步!一定要做software leveling,获得可以让DDR3稳定工作的最优解。
至此,你拿到的这个配置,可以说才是完整的DDR3配置参数。然后更新到你的SPL中,应该就不会再次卡在这里了。
另外,MPU频率的改变和DDR3部分频率的改变是没有直接关系的,因为DDR3的时钟树和MPU时钟树是分开的。
此外,建议确认一下CORE的频率,这个部分经常被人忽略,也有些案例是在CORE频率设置上出现了问题的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分