DDR3内存更换调试总结

来源:互联网 发布:ubuntu备份与恢复 编辑:程序博客网 时间:2024/05/21 11:32
    这段日子,PM说板子内存小了点,得换个大点的。心想我以前换过,还算有谱应该问题不大。然后把活儿接了下来,没想到这一调试一路的杯具。更换各大厂家的内存,话说这个4Gb的DDR3芯片确实不一样(经过半个多月的折腾才发现)。Datasheet都快翻烂了,依然没有头绪。寄存器过了一遍又一遍,结果发现某些重要的寄存器由于信息不足无法配置value(这就是OEM的最大BUG)。放弃了,发email给厂商。人家说已经有成功的客户了,为啥你们就不行呢。这点真是让人郁闷坏了,我承认我RP有时候确实差了些。但也不能这么操蛋吧,于是一个一个排查。
    一开始手焊的板子全部发到工厂去重焊,结果回来bootloader还是起不来。郁闷了,手头的那个入门级示波器对这样问题只能是“干瞪眼”。没辙,去方案商公司吧,这一折腾又是一个礼拜。他们也没弄明白怎么回事,各种邮件飞来飞去,咨询的很多的负责该项目的engineer。最后连这位技术支持都说,这帮人真是光吃饭不办事。自己负责的模块还得去问别人是怎么弄的。我表示淡定——貌似这是个通病。。。
    扯了一堆,说正题。首先板子更换大容量内存后,出现了无法烧写bootloader镜像的问题。SOC串口打印信息正常,说明SOC芯片引导启动模块焊接无误,电源网络也正常。bootloader无法从串口加载到DDR,可能的原因有:
1、BGA焊接问题;
2、DDRC初始化失败,bootloaer的CPU初始化参数设置有问题;
3、PCB设计缺陷(jitter和skew等)。
    依据上述的基本判断,我们借助高速示波器和仿真器等工具,对DDR3的时钟信号进行了测试。同时比对了更换内存前后的时钟信号。看到了下面的这幅图片:
    SOC什么都没有烧写,竟然出现了“谐波”。主波为12MHz,该谐波有410MHz左右。一时之间,大家都有点晕乎。这个谐波是相当的稳定。后来当我们咨询的多位工程师后判定这个高频波不是谐波,而是内部pll倍频产生的。因此我们抓到的波形是正常的波形,这一点在之前的正常的板子上得到了验证。
    通过仿真器的测试,我们发现当对内存指定地址进行简单写和读的操作时,写入和读取的值始终是不一致的。而且是随机的,不论是对某个地址读写还是对地址段进行读写,问题一直存在。我们得出的结论是:时序出了问题。
    其实这个结论有很多种可能性的原因造成。时序问题,一种可能是硬件设计的问题;第二,比如说DDR3工作模式弄错了,或者关于时间的参数没有配置正确等等。这样的结论让人无法继续解决问题。后来证实这样确实是把问题复杂化了,方向没找到。
    最后问题的解决,只需要更改一项关于刷新延迟参数的寄存器就可以了。而这个信息在数据手册上也写着很明显。而我却没有注意这个小小的细节变化。结果,我们将DDR3的刷新时间调大以后,一切又恢复了正常,但是依然有许多遗留的问题。更改DDR刷新时间,我的理解是:由于单位BANK内的物理空间增加了,较之原来的DDR3,需要刷新的物理空间增加。因此,刷新时间对于大容量的颗粒也必然增加。查阅数据手册后发现,确实如此。
    虽然目前得到了突破性的解决,但是还有很多地方有待于进一步的测试和业务考验。