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.

6678 DDR3初始化问题

您好,

新做的6678板子,DDR3 芯片采用MT41J256M16,修改相关初始化参数之后,DDR3 leveling显示成功。但是进行内存测试时,写不进数据,请问这是什么原因呢?

谢谢

  • 您好,参考如下STK中的memory test例程进行DDR初始化,更新其中的DDR初始化参数,然后运行memory test工程。

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx

  • 您好,

    采用了memory test 例程测试,写入的数据通过view memory 没有写入,读回的数据也不对。通过view memory 查看0x80000000起始的内存块,数据不断跳变,不稳定

    在我修改的初始化参数中有以下几方面,请大家帮忙分析分析:

    DDR芯片为:MT41J256M16 (4Gb),DDR输入时钟为156.25MHZ,通过156.25*128/15/2=667MHZ,1333的数据率

    以下选用ti带的gel文件修改

    1:Leveling部分

    DATA0_WRLVL_INIT_RATIO = 0x88;
    DATA1_WRLVL_INIT_RATIO = 0x88;
    DATA2_WRLVL_INIT_RATIO = 0x88;
    DATA3_WRLVL_INIT_RATIO = 0x88;
    DATA4_WRLVL_INIT_RATIO = 0x88;
    DATA5_WRLVL_INIT_RATIO = 0x88;
    DATA6_WRLVL_INIT_RATIO = 0x88;
    DATA7_WRLVL_INIT_RATIO = 0x88;
    DATA8_WRLVL_INIT_RATIO = 0x88;

    DATA0_GTLVL_INIT_RATIO = 0xc2;
    DATA1_GTLVL_INIT_RATIO = 0xc2;
    DATA2_GTLVL_INIT_RATIO = 0xc2;
    DATA3_GTLVL_INIT_RATIO = 0xc2;
    DATA4_GTLVL_INIT_RATIO = 0xc2;
    DATA5_GTLVL_INIT_RATIO = 0xc2;
    DATA6_GTLVL_INIT_RATIO = 0xc2;
    DATA7_GTLVL_INIT_RATIO = 0xc2;
    DATA8_GTLVL_INIT_RATIO = 0xc2;

    2:DDR_SDTIM2部分

    /* DDR_SDTIM2 = 0x30b37FE3; */
    TEMP = 0;
    TEMP |= 0x3 << 28; // T_XP bit field 30:28
    TEMP |= 0xb3 << 16; // T_XSNR bit field 24:16
    TEMP |= 0x1ff << 6; // T_XSRD bit field 15:6
    TEMP |= 0x4 << 3; // T_RTP bit field 5:3
    TEMP |= 0x3; // T_CKE bit field 2:0
    DDR_SDTIM2 = TEMP;

    3:DDR_SDTIM3部分

    /* DDR_SDTIM3 = 0x559F8adF; */
    TEMP = 0;
    TEMP |= 0x5 << 28; // T_PDLL_UL bit field 31:28 (fixed value)
    TEMP |= 0x5 << 24; // T_CSTA bit field 27:24 (fixed value)
    TEMP |= 0x4 << 21; // T_CKESR bit field 23:21
    TEMP |= 0x3f << 15; // T_ZQCS bit field 20:15
    TEMP |= 0xad << 4; // T_RFC bit field 12:4
    TEMP |= 0xf; // T_RAS_MAX bit field 3:0 (fixed value)
    DDR_SDTIM3 = TEMP;

    4:DDR_SDCFG部分

    /* DDR_SDCFG = 0x63062b32; */
    /* New value with DYN_ODT disabled and SDRAM_DRIVE = RZQ/7 //0x63222A32; // last config write DRAM init occurs */
    TEMP = 0;
    TEMP |= 0x3 << 29; // SDRAM_TYPE bit field 31:29 (fixed value)
    TEMP |= 0x0 << 27; // IBANK_POS bit field 28:27
    TEMP |= 0x3 << 24; // DDR_TERM bit field 26:24
    TEMP |= 0x0 << 21; // DYN_ODT bit field 22:21
    TEMP |= 0x1 << 18; // SDRAM_DRIVE bit field 19:18
    TEMP |= 0x2 << 16; // CWL bit field 17:16
    TEMP |= 0x0 << 14; // NM bit field 15:14
    TEMP |= 0xA << 10; // CL bit field 13:10
    TEMP |= 0x6 << 7; // ROWSIZE bit field 9:7
    TEMP |= 0x3 << 4; // IBANK bit field 6:4
    TEMP |= 0x0 << 3; // EBANK bit field 3:3
    TEMP |= 0x2; // PAGESIZE bit field 2:0
    DDR_SDCFG = TEMP;

    谢谢!

  • 你好,我也刚接触6678初始化drr3这块,看了器件手册和ddr3 controller文档,但是对ddr3的初始化还没有什么概念。只知道要初始化pll,寄存器是ddr3的寄存器都要初始化还是有其他文档详细介绍初始化这部分?文档里写的初始化比较简单,例如leveling这部分在文档里提到的初始化流程里就没有,能否详细说明下,也可以邮件cuiqian198611@163.com,非常感谢

  • 你好,ddr初始化可以参看 二楼 提到的 STK下的common文件夹中KeyStone_DDR_Init.c,里面注释各方面比较详细,对照文档 应该不难看懂


  • 你这个leveling 设置感觉有点问题,所有的值都一样?这个你是依据什么得到的?

    6678有DDR3有专门的初始化工具,不知道你有没有用过,你可以搜一下,那些参数都是用工具计算出来的。

    还有推荐看看附件文档

    DDR3初始化及参数配置.pdf
  • DDR3参数计算表格参见:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/53384.aspx

  • 谢谢,

    我是用的DDR3 PHY Calc v10.xlsx计算的,只是比较粗糙的把所有的DQS stripline length设置成一样,把所有的CK stripline length设置成一样。可能这里有问题,一直没找时间去做

  • 你好,有没有emif16初始化的例子,通过emif16从nor flash启动,除了要初始化emif16是否还要初始化flash,是否能给出详细的知道呢,非常感谢

  • 你好,emif16 boot 我没试过,我的理解如下,仅供参考:

    选择emif16 boot 时,上电后ROM bootloader会配置EMIF16接口,然后跳转到EMIF16 0x70000000起始位置执行。因此不需要做相应的emif16或者flash的初始化,如果想做emif16相关的修改可以传入emif16 boot 参数表更新配置。

    仅要做的就是准备烧写镜像:

    A、用TI提供的hex6x.exe工具将.out文件转化为boot table 格式,如果是多核程序,将生成的多个.out文件分别用hex6x工具转化为table格式,再使用工具mergebtbl.exe将多个table文件合成一个table文件。

    B、使用工具b2ccs.exe将table格式的文件转化为ccs格式

    C、使用工具ccs2bin.exe将上述ccs格式的文件转化为.bin格式

    最终得到的.bin格式的文件就是需要烧写到nor flash中的镜像

    这种方案我没试过

  • 你好,

    emif16初始化如下:

    #include <ti\csl\tistdtypes.h>
    #include <stdint.h>
    #include <cslr_emif16.h>
    #include <cslr_device.h>
    #include <csl_pscAux.h>

    CSL_Emif16Regs * EMIF16_Regs= (CSL_Emif16Regs *)CSL_EMIF16_REGS;

    void EMIF_init(){

    uint32_t power_domain_num = 0;
    uint32_t mdctl_emif16_module_num = 3;

    /* Wake up EMIF16 module:*/
    /* program pdctl and mdctl to enable the module. */
    CSL_PSC_enablePowerDomain(power_domain_num);
    CSL_PSC_setModuleNextState (mdctl_emif16_module_num, PSC_MODSTATE_ENABLE);

    // start the process and wait. but timeout in 1000 loops.
    CSL_PSC_startStateTransition(power_domain_num);
    /* Wait until the state transition process is completed. */
    while (!CSL_PSC_isStateTransitionDone ( power_domain_num));

    /* Return PSC status */
    if ((CSL_PSC_getPowerDomainState( power_domain_num) == PSC_PDSTATE_ON) &&
    (CSL_PSC_getModuleState (mdctl_emif16_module_num) == PSC_MODSTATE_ENABLE))
    {
    /*Ready for use */
    printf("EMIF16 PSC success\n");;
    }
    else
    {
    /*Return error */
    printf("EMIF16 PSC fail\n");
    }

    EMIF16_Regs->A0CR = (0 \
    | (1 << 31) /* selectStrobe */ \
    | (0 << 30) /* extWait */ \
    | (1 << 26) /* writeSetup 12 ns */ \
    | (3 << 20) /* writeStrobe 24 ns */ \
    | (0 << 17) /* writeHold 6 ns */ \
    | (1 << 13) /* readSetup 12 ns */ \
    | (0x3f << 7) /* readStrobe    ns */ \
    | (0 << 4) /* readHold 6 ns */ \
    | (1 << 2) /* turnAround 12 ns */ \
    | (1 << 0)); /* asyncSize 16-bit bus */ \

    EMIF16_Regs->A1CR = (0 \
    | (1 << 31) /* selectStrobe */ \
    | (0 << 30) /* extWait */ \
    | (1 << 26) /* writeSetup 12 ns */ \
    | (3 << 20) /* writeStrobe 24 ns */ \
    | (0 << 17) /* writeHold 6 ns */ \
    | (1 << 13) /* readSetup 12 ns */ \
    | (0x3f << 7) /* readStrobe   ns */ \
    | (0 << 4) /* readHold 6 ns */ \
    | (1 << 2) /* turnAround 12 ns */ \
    | (1 << 0)); /* asyncSize 16-bit bus */ \

    /* Set the wait polarity */
    EMIF16_Regs->AWCCR = (0x80 /*0x80 max extended wait cycle */ \
    | (0 << 16) /* CE0 uses WAIT0 */ \
    | (0 << 18) /* CE1 uses WAIT0 */ \
    | (0 << 28)); /* WAIT0 polarity hi */\

    EMIF16_Regs->IRR = (1 /* clear async timeout */ \
    | (1 << 2)); /* clear wait rise */ \

    EMIF16_Regs->NANDFCTL=0; //非NAND模式


    *(Uint32*) 0x20C00008 |= 0x80000000; //Disable synchronous mode feature
    }

    这段代码DSP接FPGA是通的,配置了CE0和CE1,仅供参考

  • 通过flash启动,需要初始化flash么?
  • 你好,是否有通过6678初始化SRIO和SGMII的文档说明,比较详细的,最好能说明第一步第二步等干什么,非常感谢

  • 您好,看了您的帖子觉得您写的很好~

    我现在也在调试DDR3,leveling一直没通过,在CCS中查看0x80000000地址的数据也是不停的跳变。

    用excel计算的值重新配置gel文件后仍然没有用。

    请问您最后是怎么解决的呢?