DDR3设计配置:
1.关于配置寄存器:
部分配置寄存器基地址在 0x2100_0000
#define DDR3_BASE_ADDR (0x21000000)
#define DDR_SDCFG (*(unsigned int*)(DDR3_BASE_ADDR + 0x00000008))
#define DDR_SDRFC (*(unsigned int*)(DDR3_BASE_ADDR + 0x00000010))
#define DDR_SDTIM1 (*(unsigned int*)(DDR3_BASE_ADDR + 0x00000018))
#define DDR_SDTIM2 (*(unsigned int*)(DDR3_BASE_ADDR + 0x00000020))
#define DDR_SDTIM3 (*(unsigned int*)(DDR3_BASE_ADDR + 0x00000028))
#define DDR_PMCTL (*(unsigned int*)(DDR3_BASE_ADDR + 0x00000038))
#define RDWR_LVL_RMP_WIN (*(unsigned int*)(DDR3_BASE_ADDR 0x000000D4))
#define RDWR_LVL_RMP_CTRL (*(unsigned int*)(DDR3_BASE_ADDR 0x000000D8))
+
+ #define 0x000000DC))
RDWR_LVL_CTRL (*(unsigned int*)(DDR3_BASE_ADDR +
#define DDR_ZQCFG (*(unsigned int*)(DDR3_BASE_ADDR + 0x000000C8))
#define DDR_PHYCTRL (*(unsigned int*)(DDR3_BASE_ADDR + 0x000000E4))
大部分寄存器位于chip-level registers 0x0262_0000
#define DDR3PLLCTL0 (*(unsigned int*)(0x02620330))
#define DDR3PLLCTL1 (*(unsigned int*)(0x02620334))
#define DATA0_WRLVL_INIT_RATIO (*(unsigned int*)(0x0262040C))
#define DATA1_WRLVL_INIT_RATIO (*(unsigned int*)(0x02620410))
#define DATA2_WRLVL_INIT_RATIO (*(unsigned int*)(0x02620414))
#define DATA3_WRLVL_INIT_RATIO (*(unsigned int*)(0x02620418))
#define DATA4_WRLVL_INIT_RATIO (*(unsigned int*)(0x0262041C))
#define DATA5_WRLVL_INIT_RATIO (*(unsigned int*)(0x02620420))
#define DATA6_WRLVL_INIT_RATIO (*(unsigned int*)(0x02620424))
#define DATA7_WRLVL_INIT_RATIO (*(unsigned int*)(0x02620428))
#define DATA8_WRLVL_INIT_RATIO (*(unsigned int*)(0x0262042C))
#define DATA0_GTLVL_INIT_RATIO (*(unsigned int*)(0x0262043C))
#define DATA1_GTLVL_INIT_RATIO (*(unsigned int*)(0x02620440))
#define DATA2_GTLVL_INIT_RATIO (*(unsigned int*)(0x02620444))
#define DATA3_GTLVL_INIT_RATIO (*(unsigned int*)(0x02620448))
#define DATA4_GTLVL_INIT_RATIO (*(unsigned int*)(0x0262044C))
#define DATA5_GTLVL_INIT_RATIO (*(unsigned int*)(0x02620450))
#define DATA6_GTLVL_INIT_RATIO (*(unsigned int*)(0x02620454))
#define DATA7_GTLVL_INIT_RATIO (*(unsigned int*)(0x02620458))
#define DATA8_GTLVL_INIT_RATIO (*(unsigned int*)(0x0262045C))
#define DDR3_CONFIG_REG_0 (*(unsigned int*)(0x02620404))
#define DDR3_CONFIG_REG_12 (*(unsigned int*)(0x02620434))
#define DDR3_CONFIG_REG_23 (*(unsigned int*)(0x02620460))
#define DDR3_CONFIG_REG_24 (*(unsigned int*)(0x026204))
二、KICK Unlock和DDR3 PLL配置
初始化DDR3控制器之前必须完成 KICK Unlock和DDR3 PLL的配置。
1.关于KICK Unlock,在写DDR3 PLL控制寄存器之前需解锁KICK,完成配置之后加锁KICK。 DDR3PLLCTL0 和 DDR3PLLCTL1控制其PLL。
关于6672KICK机制:
以下寄存器(基地址0x02620000)
详见芯片手册Device State Control Registers(途中仅显示部分)
属于芯片的Chip-Level Registers,受KICK保护。
解锁kick,要写入特定的值:
KICK0 0x83e70b13.
KICK1 0x95a4f1e0
关于DDR3 PLL配置的流程可以参照如下:(在此之前需保证主PLL和PLL控制器已初始化)
1. In DDR3PLLCTL1, write ENSAT = 1 (for optimal PLL operation)
2. In DDR3PLLCTL0, write BYPASS = 1 (set the PLL in Bypass)
3. In DDR3PLLCTL1, write PLLRST = 1 (PLL is reset)
4. Program PLLM and PLLD in DDR3PLLCTL0 register
5. Program BWADJ[7:0] in DDR3PLLCTL0 and BWADJ[11:8] in DDR3PLLCTL1 register. BWADJ value must
be set to ((PLLM + 1) >> 1) - 1)
6. Wait for at least 5 us based on the reference clock (PLL reset time)
7. In DDR3PLLCTL1, write PLLRST = 0 (PLL reset is released)
8. Wait for at least 500 *REFCLK cycles * (PLLD + 1) (PLL lock time)
9. In DDR3PLLCTL0, write BYPASS = 0 (switch to PLL mode)
2.关于DDR3 PLL
DDR3 PLL以DDR3CLKinput为输入参考时钟并将其倍频到DDR3接口所需的时钟频率。DDR3时钟( DDR3-1333)频率是其数据频率(666.67 MHz)的一半。
输入时钟进来要先被PLLD分频,然后和PLLM相乘,和PLLM相乘的结果不能超过3.4G,最后2分频输出。
DDR3 PLL配置函数:
int KeyStone_PLL_init (PLL_ControlRegs * PLL_Regs, unsigned int inputDivisor, unsigned int multiplier, unsigned int outputDivisor)
三、Leveling Register的配置和考虑
考虑到DDR3full leveling特性(也叫做auto leveling)是write leveling, read data eye training和 read DQS gate training的总称。由于Fly-by的结构,不同DDR3颗粒间的控制、时钟和数据总线时序都是靠leveling来保证,所以需要配置Leveling Register(具体的请参见DDR3 Software Leveling and Registers Configuration)
1.需先写写DDR3_CONFIG_REG_0,DDR3_CONFIG_REG_12
DDR3_CONFIG_REG_2来正确的配置leveling 操作:
DDR3的电路板布局一些到第一个DRAM有很短的fly-by路由而一些有很长的路由,从而形成了回路。个别的DRAM到第一个DRAM通常有一个fly-by路由延迟,即大约等于数据组到该DRAM芯片延迟。由于在DDR3 PHY电路上时间的不确定性,只要电路板布线延迟的时钟只要不比数据路由长至少四分之一的时钟周期, leveling可能会失败。
为了解决这个问题,通过将DDR3的时钟输出反向,增加一个周期的一半的扩展时钟到时钟网和其他相关联的fly-by来解决:
设置DDR3_CONFIG_REG_12寄存器 INVERT_CLKOUT将其置1来使能 INVERT_CLKOUT功能
同时必须保证 DDR3_CONFIG_REG_0寄存器值为0x100.
如果INVERT_CLKOUT 位为0 则需保证 DDR3_CONFIG_REG_0寄存器值为0x80.
同时配置DLL_LOCK_DIFF为15.
2.配置 chip-level registers来初始化 automatic leveling
此处如需更改请参照参照 TI提供的DDR3 PHY Calc v10.xlsx,来计算初始值,并将其转化为适当的值。(如需更改请参照上述文件中的说明来得到初试值)
处理板的默认值为:
//initial vale for leveling
/*WRLVL_INIT_RATIO*/
gpBootCfgRegs->DDR3_CONFIG_REG[2] = 0x20;
gpBootCfgRegs->DDR3_CONFIG_REG[3] = 0x24;
gpBootCfgRegs->DDR3_CONFIG_REG[4] = 0x3A;
gpBootCfgRegs->DDR3_CONFIG_REG[5] = 0x38;
gpBootCfgRegs->DDR3_CONFIG_REG[6] = 0x51;
gpBootCfgRegs->DDR3_CONFIG_REG[7] = 0x5E;
gpBootCfgRegs->DDR3_CONFIG_REG[8] = 0x5E;
gpBootCfgRegs->DDR3_CONFIG_REG[9] = 0x5E;
gpBootCfgRegs->DDR3_CONFIG_REG[10] = 0x44;
/*GTLVL_INIT_RATIO*/
gpBootCfgRegs->DDR3_CONFIG_REG[14] = 0xA1;
gpBootCfgRegs->DDR3_CONFIG_REG[15] = 0x9E;
gpBootCfgRegs->DDR3_CONFIG_REG[16] = 0xA7;
gpBootCfgRegs->DDR3_CONFIG_REG[17] = 0xA9;
gpBootCfgRegs->DDR3_CONFIG_REG[18] = 0xCA;
gpBootCfgRegs->DDR3_CONFIG_REG[19] = 0xBE;
gpBootCfgRegs->DDR3_CONFIG_REG[20] = 0xDD;
gpBootCfgRegs->DDR3_CONFIG_REG[21] = 0xDD;
gpBootCfgRegs->DDR3_CONFIG_REG[22] = 0xBA;
DATA0_WRLVL_INIT_RATIO~DATA8_WRLVL_INIT_RATIODDR3_CONFIG_2~DDR3_CONFIG_10的
低
20
位
,
0x0262_040C~0x0262_042C。
DATA0_GTLVL_INIT_RATIO~DATA8_GTLVL_INIT_RATIODDR3_CONFIG_14~DDR3_CONFIG_22
的
低
20
位
,
对地
址
空
对地
址
空
应间
为
应间
为
0x0262_043C~0x0262_045C。
3.配置PHY_RESET脉冲将上述配置值所存到PHY logic
具体操作见函数:
KeyStone_DDR_latch_leveling_configuration ();
四、DDR3控制器和DRAM 配置
此处配置控制器的关键时间参数和DRAM模式寄存器参数
请参见TI提供的DDR3 Register Calc v4.xlsx来根据需求计算相关寄存器值
DDR3使用说明:
关于GEL文件:
gel文件主要是初始化PLL及ddr,可以根据设计修改其配置。默认正常使用就行 不用修改