DDR3的调试一直是CPU开发的重点,如果DDR3没有调通,那么后面的开发就很难继续下去了。DDR3主要是配置DDR3控制器,参数与DDR3芯片匹配一致,从而使DDR3存储器能够正常工作。
FT-M6678 DDR3配置官方提供了相应的接口驱动函数,同时也可以通过参考gel文件来实现。在讲DDR配置之前简单介绍一下PSC以及PLL配置,对于PSC来说,FT-M6678与TI-C6678是有差异的。
首先,配置PLL时钟:
有三种PLL:主PLL、DDR PLL、PASS PLL。主PLL 主要用来给 CorePacs 和部分外设部件提供时钟,主 PLL 控制器根据PLL 输出时钟产生了以下系统时钟;DDR PLL 用来专门给 DDR 部件提供旁路时钟 DDR_BYPCLK 和参考时钟DDR_REFCLK;PASS PLL 主要用来给 PCIe、 SRIO、 GMAC 三大外设部件提供时钟。在DDR配置之前需要配置MAIN PLL以及DDR PLL。
MainPLL(40,1,1,1);
DDRpll(ddr_freq);
其次,使能DDR3的时钟域:
在DDR初始化之前,需要使能DDR3的时钟域,对于TI-C6678来说DDR3时钟域总是打开的,而FT-M6678是软件控制或者硬件管脚配置的。
软件控制使能方式为:
PSC_Open_Clk("DDR3");
最后,配置DDR3控制器:
a. 设置XMC,与TI的基本一致;
b. 设置DDR3控制器各个参数;
DDR初始化时接口函数如下:
DDR_entry(DDR_CLK_t ddr_freq, DDR_ROW_NUM_t row_num,DDR_DRAM_WIDTH_t dram_width, unsigned char ecc, WIDTH_BIT)
功能: DDR 初始化测试
ddr_freq: 配置 DDR 颗粒运行频率的, 本工程默认是DDR_CLK_800MHz。 即 DDR 速率为 1600 MT/s(注: DDR 是时钟上下边沿采样的,其数据传输速度为运行时钟频率的两倍, 所以 DDR3 频率为 800MHz 时,其传输速率为 1600MT/s,其他频率同理可得其传输速率),用户可根据自己的需求和所选用 DDR 颗粒的参数设置为其他频率。
row_num: 配置 DDR 颗粒的行地址宽度的, 本工程默认为 ROW_15, 即 DDR 颗粒的行地址宽为 15,用户可根据自己所选用的 DDR 颗粒的行地址宽度具体配置。
dram_width: 配置 DDR 颗粒的位宽, 本工程默认为 WIDTH_x16,即16 位宽。 用户可根据自己所选用的 DDR 颗粒位宽来配置。可选项同样参见注释说明。
ecc: 配置 ECC 校验使能的, 本工程默认是 ECC_TYPE, 即使能 ECC 校验。 如用户自己的板卡没有接做 ECC 校验的 DDR 颗粒,务必将此参数配置为 NO_ECC_TYPE 即不使能 ECC 校验。
WIDTH_BIT: WIDTH_64BIT 表示 DDR full Datapath 模式,WIDTH_32BIT 表示 DDR Half Datapath 模式; DDR Half Datapath 模式仅针对在 M6678_V3 芯片上使用。
以上参数是较为重要的参数,更细节的配置参数在ddr_regconfig_800M.c中,DDR3的PHY配置在ddr_regconfig_phy_800M.c,而数组对应的寄存器定义在DDR_Regdefine.h中,需要更改时可以调整对应参数(参数实际使用的DDR芯片)。
for (i = 0; i < CTL_NUM; i++) {
*(unsigned int *) (DDR_BASE_ADDR + (i << 2)) =
(unsigned int) MCU_CTRL_VALUE_800M[i];
}
for (i = 576; i < PHY_NUM; i++) {
*(unsigned int *) (PHY_ADDR + (i << 2)) =
(unsigned int) MCU_PHY_VALUE_800M[i];
}
for (i = 0; i < 575; i++) {
*(unsigned int *) (PHY_ADDR + (i << 2)) =
(unsigned int) MCU_PHY_VALUE_800M[i];
}
目前官方提供的例程,DDR3跑的800M,建议在硬件设计时采用与FT-M6678 DSK相似的DDR芯片,减少调试开销同时也更便于定位和排查。毕竟DDR3不通有可能是硬件问题,也有可能是配置问题~