This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3359 DDR3调试问题,肯定指教!!!!,非常感谢!!

公司基于ICEV2的硬件开发的板,我从下面步骤进行调试,

第一步:配置EMIF参数,由于公司的DDR容量、型号和 ICEV2完全相同:MT41J128M16JT-125。所以EMIF的参数为:

//400MHz 

#define ALLOPP_DDR3_SDRAM_TIMING1   0x0AAAD4DB 

#define ALLOPP_DDR3_SDRAM_TIMING2   0x26437FDA   

#define ALLOPP_DDR3_SDRAM_TIMING3   0x501F83FF 

#define ALLOPP_DDR3_SDRAM_CONFIG    0x61C052B2 

#define ALLOPP_DDR3_REF_CTRL        0x00000C30  //400 * 7.8us = 0xC30

#define ALLOPP_DDR3_ZQ_CONFIG       0x50074BE4

 

第二步:配置PHY参数

如下图所示

第三步:将上述参数写入GEL文件,然后使用DDR3_slave_ratio_search_auto.out,算出几组最优参数。

PARAMETER                       MAX  |  MIN  | OPTIMUM |  RANGE   

***************************************************************

DATA_PHY_RD_DQS_SLAVE_RATIO    0x068 | 0x009 |  0x038  | 0x05f

DATA_PHY_FIFO_WE_SLAVE_RATIO   0x138 | 0x000 |  0x09c  | 0x138

DATA_PHY_WR_DQS_SLAVE_RATIO    0x06b | 0x01a |  0x042  | 0x051

DATA_PHY_WR_DATA_SLAVE_RATIO   0x0a9 | 0x04a |  0x079  | 0x05f 

问题:

(1)     OPTIMUM参数非常敏感,多次运行DDR3_slave_ratio_search_auto.out得出的结果(可能相差在1或2,相差很小),在用这些参数跑工程时,有的能跑过,有的会直接跑飞。

(2)     相同的参数跑代码量小,无中断的例程能跑过,跑代码量大有中断的例程会跑飞。

 

现在我不知道这些问题的原因是什么?是还有别的参数需要优化,还是我配置的参数有问题,请指教,非常感谢!!

  • 请问DDR3的布线也和ICEV2板子一模一样吗?
  • 感谢回复。我们直接拷贝过去的,DDR_CLK这些线长都一样。 请问我的调试步骤有问题么?还是有其他参数需要设置,谢谢
  • xiangqian zhao65 说:
    相同的参数跑代码量小,无中断的例程能跑过,跑代码量大有中断的例程会跑飞。

    这个问题到底是跟DDR3配置相关,还是跟代码工程相关呢?

    另外,降低DDR_CLK频率试试?

  • Dear Tony,
    谢谢你的回复。
    工程问题是可以排除的,我手上有两块开发板,一个是官方ICEV2,一个是创龙的,这个工程在这两个硬件上都能正常运行的。DDR3的频率我降到303看过,还是一样的问题。现在找不到原因了
  • 一共有几块板?几块有这种问题?及几块没有问题?

    跑代码小的没问题,是指跑在DDR上还是片上内存?

    将invert clock设为1试试?

  • 我有一块ICEV2的板子,没问题。一块创龙的开发板,也没问题。自己的硬件就有这个问题。怎么也调试不好
  • Dear Tony,
    谢谢你的回复。
    将invert clock设为1,整不出来参数,全为0
    ***************************************************************
    The Slave Ratio Search Program Values are...
    ***************************************************************
    PARAMETER MAX | MIN | OPTIMUM | RANGE
    ***************************************************************
    DATA_PHY_RD_DQS_SLAVE_RATIO 0x000 | 0x000 | 0x000 | 0x000
    DATA_PHY_FIFO_WE_SLAVE_RATIO 0x000 | 0x000 | 0x000 | 0x000
    DATA_PHY_WR_DQS_SLAVE_RATIO 0x000 | 0x000 | 0x000 | 0x000
    DATA_PHY_WR_DATA_SLAVE_RATIO 0x000 | 0x000 | 0x000 | 0x000
    ***************************************************************
  • 你是说你只有一块自己做的板子?
  • Dear Tony,
    谢谢你的回复
    我有10块自己做的板子 情况都类似,没有和ICEV2表现相同的板子
  • 还有个问题没回答我:跑代码小的没问题,是指跑在DDR上还是片上内存?

    另外目前CPU的频率跑在多少?降低CPU的频率试试。

  • Dear Tony,
    谢谢你的回复。

    跑代码小的程序也是在DDR内部跑的。现在我的GEL对时钟配置如下,跑的是600M,DDR3我降到303M试过没有效果。
    MPU_PLL_Config( CLKIN, 23, 600, 1);
    CORE_PLL_Config( CLKIN, 23, 1000, 10, 8, 4);
    DDR_PLL_Config( CLKIN, 23, 400, 1);
    PER_PLL_Config( CLKIN, 23, 960, 5);
    DISP_PLL_Config( CLKIN, 23, 48, 1);
  • xiangqian zhao65 说:
    DDR_PLL_Config( CLKIN, 23, 400, 1);

    把DDR频率降更低比如200MHz, 或250Mhz试试。

    xiangqian zhao65 说:
    MPU_PLL_Config( CLKIN, 23, 600, 1);

    把主频降低为300MHz试试?

  • Dear Tony,
    谢谢你的回复

    DDR3只能支持400和303.
    MPU_PLL_Config( CLKIN, 23, 500, 1);
    CORE_PLL_Config( CLKIN, 23, 1000, 10, 8, 4);
    DDR_PLL_Config( CLKIN, 23, 303, 1);
    PER_PLL_Config( CLKIN, 23, 960, 5);
    DISP_PLL_Config( CLKIN, 23, 48, 1);

    我把频率改成这样后,再次整定参数,
    ***************************************************************
    The Slave Ratio Search Program Values are...
    ***************************************************************
    PARAMETER MAX | MIN | OPTIMUM | RANGE
    ***************************************************************
    DATA_PHY_RD_DQS_SLAVE_RATIO 0x06d | 0x008 | 0x03a | 0x065
    DATA_PHY_FIFO_WE_SLAVE_RATIO 0x13e | 0x000 | 0x09f | 0x13e
    DATA_PHY_WR_DQS_SLAVE_RATIO 0x06d | 0x015 | 0x041 | 0x058
    DATA_PHY_WR_DATA_SLAVE_RATIO 0x0aa | 0x046 | 0x078 | 0x064


    //******************************************************************
    #define ALLOPP_DDR3_READ_LATENCY 0x07 //RD_Latency = (CL + 2) - 1

    //400MHz
    #define ALLOPP_DDR3_SDRAM_TIMING1 0x0AAAD4DB
    #define ALLOPP_DDR3_SDRAM_TIMING2 0x26437FDA
    #define ALLOPP_DDR3_SDRAM_TIMING3 0x501F83FF

    #define ALLOPP_DDR3_SDRAM_CONFIG 0x61C052B2 //termination = 1 (RZQ/4) //old - 0x61C04AB2
    //dynamic ODT = 2 (RZQ/2)
    //SDRAM drive = 0 (RZQ/6)
    //CWL = 0 (CAS write latency = 5)
    //CL=4 (CAS latency=6) //old - CL = 2 (CAS latency = 5)
    //ROWSIZE = 5 (14 row bits)
    //PAGESIZE = 2 (10 column bits)
    #define ALLOPP_DDR3_REF_CTRL 0x0000093B //303* 7.8us = 0x93B


    #define ALLOPP_DDR3_ZQ_CONFIG 0x50074BE4

    结果main函数都无法进入了。而且这个板子感觉参数很敏感,同样的参数ICEV2的都能跑通
  • 另外,我这个PCB硬件布板是用的4层板,这个有影响吗?
  • xiangqian zhao65 说:
    我这个PCB硬件布板是用的4层板,这个有影响吗?

    这个应该会有大的影响,具体看布线的地平面是否连续,否则对信号完整性影响会很大。有条件的话,用示波器量一下信号质量。

  • Dear Tony,

              降频测试也是过不了。但是我做了一个测试,源码在附件中。这个源码就是TI官方提供的定时器例程,我在main函数中增加了三角函数运算,目的是为了增加芯片负载。测试结果是在我们的板上运行5分钟左右就死机,但是ICEV2的板子上,同样的OUT文件是能一直运行的。6712.dmtimer.c

  • 如果是布线造成的DDR不稳定就难办了。

    我建议做一下DDR的测试来初步验证一下DDR的稳定性。用一个小的程序运行在片上内存,读写DDR并校验数据是否正确。

    这种测试最终要用EDMA的方式以及用高负载的DDR loading数据模式。目前手上没有AM335x的裸跑DDR EDMA测试程序。 

    下面贴子里有一个L138上的EDMA DDR测试例程,你可以参考一下其思路与方法。

  • Dear Tony,

               非常感谢,我马上测试一下