国产DSP FT-M6678开发-DDR配置

本文介绍了DDR3的调试重点,包括配置DDR3控制器、PLL和PSC,以及如何通过FT-M6678DDR3的接口函数进行初始化。着重讲解了PLL时钟配置、DDR3时钟域启用和控制器参数设置。建议使用官方例程并选择相似的DDR芯片以简化调试过程。
摘要由CSDN通过智能技术生成

        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不通有可能是硬件问题,也有可能是配置问题~

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值