你好!
这几天在测试DSP以太加载前配置DDR3,但是发现DDR3还是不能访问。
以太配置DDR3 方法:
0x00800000 入口地址
0x00000004 0xYYYYYYYY 0xZZZZZZZZ
0x00000004 0xYYYYYYYY 0xZZZZZZZZ
0x00000004 0xYYYYYYYY 0xZZZZZZZZ
。。。。
0x00000004 0xYYYYYYYY 0xZZZZZZZZ配置需要DDR EMIF的寄存器
具体:
使用仿真器把DDR3 EMIF接口寄存器值抓了出来,然后按此做到以太加载流程中,以太加载完成后,读取EMIF寄存器值确实写了进去,但是访问DDR3写进去的值和读出来的值不一致,说明
DDR3没有初始化成功。
然后查找原因,发现TI提供的一些DDR3初始化函数代码中,在配置一些如PLL等寄存器过程中,是需要一套时序的,如对于同一个寄存器要先写什么,后写什么,然后还要等一些延时待完成。
这种情况挺复杂的,不知道该如何操作了,如何把这套时序加到以太加载流程中?
以下是摘取了一段TI 提供的DDR3配置函数:
这个函数在配置过程中有延时,类似的情况还有,不知在以太流程中如何模拟或规避它。
int KeyStone_DDR_full_leveling()
{
Uint32 uwStatus;
/*enable full leveling*/
gpDDR_regs->RDWR_LVL_RMP_CTRL =
(unsigned int)(1<<CSL_EMIF4F_RDWR_LVL_RMP_CTRL_REG_RDWRLVL_EN_SHIFT);
/*start full leveling*/
gpDDR_regs->RDWR_LVL_CTRL =
(unsigned int)(1<<CSL_EMIF4F_RDWR_LVL_CTRL_REG_RDWRLVLFULL_START_SHIFT);
/*Read back any of the DDR3 controller registers.
This ensures full leveling is complete because this step is executed
only after full leveling completes.*/
uwStatus= gpDDR_regs->RDWR_LVL_RMP_CTRL; //dummy read
//Wait 3ms for leveling to complete
TSC_delay_ms(3);
if(gpDDR_regs->STATUS&(CSL_EMIF4F_STATUS_REG_RDLVLGATETO_MASK
|CSL_EMIF4F_STATUS_REG_RDLVLTO_MASK
|CSL_EMIF4F_STATUS_REG_WRLVLTO_MASK))
{
printf("DDR3 leveling has failed, STATUS = 0x%x\n", gpDDR_regs->STATUS);
uwStatus = 1;
return uwStatus;
}
uwStatus = 0;
return uwStatus;
}