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 芯片采用MT41J256M16,修改相关初始化参数之后,DDR3 leveling显示成功。但是进行内存测试时,写不进数据,请问这是什么原因呢?
谢谢
您好,
采用了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,非常感谢
你这个leveling 设置感觉有点问题,所有的值都一样?这个你是依据什么得到的?
6678有DDR3有专门的初始化工具,不知道你有没有用过,你可以搜一下,那些参数都是用工具计算出来的。
还有推荐看看附件文档
谢谢,
我是用的DDR3 PHY Calc v10.xlsx计算的,只是比较粗糙的把所有的DQS stripline length设置成一样,把所有的CK stripline length设置成一样。可能这里有问题,一直没找时间去做
你好,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,仅供参考
您好,看了您的帖子觉得您写的很好~
我现在也在调试DDR3,leveling一直没通过,在CCS中查看0x80000000地址的数据也是不停的跳变。
用excel计算的值重新配置gel文件后仍然没有用。
请问您最后是怎么解决的呢?