项目板(OMAPL138+DDR+NAND FLASH构架),FM64D1G56A芯片提供mDDR+Nand Flash设备,按照OMAPL138数据手册配置DDR驱动,配置无法完成,挂死在配置过程中,详细描述如下:
static void PLL1Init(XD_Uint8 pllM, XD_Uint8 postDiv, XD_Uint8 div1, XD_Uint8 div2, XD_Uint8 div3)
{
// 解锁PLL1配置寄存器
CSL_FINST(G_sys0Regs->CFGCHIP3, SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK, FREE);
// 清零PLL1使能管脚
CSL_FINST(G_pll1Regs->PLLCTL, PLLC_PLLCTL_PLLENSRC, CLEAR);
// 禁用PLL1外部时钟资源
CSL_FINST(G_pll1Regs->PLLCTL, PLLC_PLLCTL_EXTCLKSRC, DISABLE);
// 切换到BYPASS模式
CSL_FINST(G_pll1Regs->PLLCTL, PLLC_PLLCTL_PLLEN, BYPASS);
// 切换完成需等待至少4个时钟周期 DelayCnt(12);
// 配置PLL1进入复位模式
CSL_FINST(G_pll1Regs->PLLCTL, PLLC_PLLCTL_PLLRST, ASSERT);
// 禁用PLL1模块
CSL_FINST(G_pll1Regs->PLLCTL, PLLC_PLLCTL_PLLDIS, ASSERT);
// PLL1模块上电
CSL_FINST(G_pll1Regs->PLLCTL, PLLC_PLLCTL_PLLPWRDN, POWERED_UP);
// 启用PLL1模块
CSL_FINST(G_pll1Regs->PLLCTL, PLLC_PLLCTL_PLLDIS, DEASSERT);
// PLL1模块启动稳定等待时间, 等待至少2000个时钟周期
DelayCnt(8000);
// 配置PLL1倍频系数
G_pll1Regs->PLLM = pllM;
// 配置PLL1后分频系数, 并使能
CSL_FINS(G_pll1Regs->POSTDIV, PLLC_POSTDIV_RATIO, postDiv);
CSL_FINST(G_pll1Regs->POSTDIV, PLLC_POSTDIV_POSTDEN, ENABLE);
// 等待PLL1配置状态OK
while(CSL_FEXT(G_pll1Regs->PLLSTAT, PLLC_PLLSTAT_GOSTAT));
// 配置PLL1相关分频系数, 并使能
CSL_FINS(G_pll1Regs->PLLDIV1, PLLC_PLLDIV1_RATIO, div1);
CSL_FINST(G_pll1Regs->PLLDIV1, PLLC_PLLDIV1_D1EN, ENABLE);
CSL_FINS(G_pll1Regs->PLLDIV2, PLLC_PLLDIV2_RATIO, div2);
CSL_FINST(G_pll1Regs->PLLDIV2, PLLC_PLLDIV2_D2EN, ENABLE);
CSL_FINS(G_pll1Regs->PLLDIV3, PLLC_PLLDIV3_RATIO, div3);
CSL_FINST(G_pll1Regs->PLLDIV3, PLLC_PLLDIV3_D3EN, ENABLE);
// 配置命令寄存器启动配置 CSL_FINST(G_pll1Regs->PLLCMD, PLLC_PLLCMD_GOSET, PHASE_ALIGN);
// 等待PLL1配置完成
while(CSL_FEXT(G_pll1Regs->PLLSTAT, PLLC_PLLSTAT_GOSTAT));
// 等待PLL1模块重启完成 DelayCnt(800);
// 配置PLL1进入正常模式
CSL_FINST(G_pll1Regs->PLLCTL, PLLC_PLLCTL_PLLRST, DEASSERT);
// 等待PLL1模块状态OK
DelayCnt(8000);
// 使能PLL1模块
CSL_FINST(G_pll1Regs->PLLCTL, PLLC_PLLCTL_PLLEN, PLL);
// 锁定PLL1配置寄存器
CSL_FINST(G_sys0Regs->CFGCHIP3, SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK, LOCK);
}
static void DDRInit(void)
{ // DDR电源模块使能
PSCTransition(G_psc1Regs, DOMAIN0, CSL_PSC_DDR2_MDDR, MDSTAT_ENABL);
// 检测VTP IO是否禁用
if (CSL_CHKBIT(G_sys1Regs->VTPIO_CTL, CSL_SYSCFG1_VTPIO_CTL_POWERDN_MASK))
{
// 使能VTP IO CSL_CLRBIT(G_sys1Regs->VTPIO_CTL, CSL_SYSCFG1_VTPIO_CTL_POWERDN_MASK);
CSL_CLRBIT(G_sys1Regs->VTPIO_CTL, CSL_SYSCFG1_VTPIO_CTL_LOCK_MASK);
// 构造脉冲初始化VTP IO
CSL_SETBIT(G_sys1Regs->VTPIO_CTL, CSL_SYSCFG1_VTPIO_CTL_CLKRZ_MASK);
DelayCnt(4);
CSL_CLRBIT(G_sys1Regs->VTPIO_CTL, CSL_SYSCFG1_VTPIO_CTL_CLKRZ_MASK);
DelayCnt(4);
CSL_SETBIT(G_sys1Regs->VTPIO_CTL, CSL_SYSCFG1_VTPIO_CTL_CLKRZ_MASK);
// 等待初始化完成(实测执行挂死,导致mDDR配置无法完成)
while(!CSL_CHKBIT(G_sys1Regs->VTPIO_CTL,
CSL_SYSCFG1_VTPIO_CTL_READY_MASK));
//DelayCnt(10000);
// 锁定配置寄存器并配置低功耗模式
CSL_SETBIT(G_sys1Regs->VTPIO_CTL, CSL_SYSCFG1_VTPIO_CTL_LOCK_MASK);
CSL_SETBIT(G_sys1Regs->VTPIO_CTL, CSL_SYSCFG1_VTPIO_CTL_PWRSAVE_MASK);
}
CSL_SETBIT(G_sys1Regs->VTPIO_CTL, CSL_SYSCFG1_VTPIO_CTL_IOPWRDN_MASK);
// 配置DDR相关定时参数(参考DDR手册进行配置)
G_mddrregs->DRPYC1R = CSL_DDR2_MDDR_DRPYC1R_EXT_STRBEN_MASK
| CSL_DDR2_MDDR_DRPYC1R_PWRDNEN_MASK
| (DDR2_DRPYC1R_RL << CSL_DDR2_MDDR_DRPYC1R_RL_SHIFT); G_sys1Regs->DDR_SLEW = CSL_SYSCFG1_DDR_SLEW_DDR_PDENA_MASK
| CSL_SYSCFG1_DDR_SLEW_CMOSEN_MASK;
CSL_SETBIT(G_mddrregs->SDCR, CSL_DDR2_MDDR_SDCR_BOOTUNLOCK_MASK); G_mddrregs->SDCR = CSL_DDR2_MDDR_SDCR_NM_MASK
| (DDR2_SDCR_CL << CSL_DDR2_MDDR_SDCR_CL_SHIFT)
| (DDR2_SDCR_IBANK << CSL_DDR2_MDDR_SDCR_IBANK_SHIFT)
| CSL_DDR2_MDDR_SDCR_PAGESIZE_1024WORD;
CSL_CLRBIT(G_mddrregs->SDCR, CSL_DDR2_MDDR_SDCR_BOOTUNLOCK_MASK); CSL_SETBIT(G_mddrregs->SDCR, CSL_DDR2_MDDR_SDCR_TIMUNLOCK_MASK);
G_mddrregs->SDCR2 = CSL_DDR2_MDDR_SDCR2_RESETVAL;
G_mddrregs->SDTIMR1 = (DDR2_SDTIMR1_T_RFC << CSL_DDR2_MDDR_SDTIMR1_T_RFC_SHIFT)
| (DDR2_SDTIMR1_T_RP << CSL_DDR2_MDDR_SDTIMR1_T_RP_SHIFT)
| (DDR2_SDTIMR1_T_RCD << CSL_DDR2_MDDR_SDTIMR1_T_RCD_SHIFT)
| (DDR2_SDTIMR1_T_WR << CSL_DDR2_MDDR_SDTIMR1_T_WR_SHIFT)
| (DDR2_SDTIMR1_T_RAS << CSL_DDR2_MDDR_SDTIMR1_T_RAS_SHIFT)
| (DDR2_SDTIMR1_T_RC << CSL_DDR2_MDDR_SDTIMR1_T_RC_SHIFT)
| (DDR2_SDTIMR1_T_RRD << CSL_DDR2_MDDR_SDTIMR1_T_RRD_SHIFT)
| (DDR2_SDTIMR1_T_WTR << CSL_DDR2_MDDR_SDTIMR1_T_WTR_SHIFT);
G_mddrregs->SDTIMR2 = (DDR2_SDTIMR2_T_RAS_MAX << CSL_DDR2_MDDR_SDTIMR2_T_RAS_MAX_SHIFT)
| (DDR2_SDTIMR2_T_XP << CSL_DDR2_MDDR_SDTIMR2_T_XP_SHIFT)
| (DDR2_SDTIMR2_T_XSNR << CSL_DDR2_MDDR_SDTIMR2_T_XSNR_SHIFT)
| (DDR2_SDTIMR2_T_XSRD << CSL_DDR2_MDDR_SDTIMR2_T_XSRD_SHIFT)
| (DDR2_SDTIMR2_T_RTP << CSL_DDR2_MDDR_SDTIMR2_T_RTP_SHIFT)
| (DDR2_SDTIMR2_T_CKE << CSL_DDR2_MDDR_SDTIMR2_T_CKE_SHIFT);
CSL_CLRBIT(G_mddrregs->SDCR, CSL_DDR2_MDDR_SDCR_TIMUNLOCK_MASK); G_mddrregs->SDRCR = CSL_DDR2_MDDR_SDRCR_LPMODEN_MASK
| CSL_DDR2_MDDR_SDRCR_MCLKSTOPEN_MASK
| (DDR2_SDRCR_RR << CSL_DDR2_MDDR_SDRCR_RR_SHIFT);
// 配置DDR电源模块进入同步复位状态
PSCTransition(G_psc1Regs, DOMAIN0, CSL_PSC_DDR2_MDDR, MDSTAT_SYNCRST);
// 配置DDR电源模块进入使能状态
PSCTransition(G_psc1Regs, DOMAIN0, CSL_PSC_DDR2_MDDR, MDSTAT_ENABL);
// 禁止DDR自刷新
CSL_CLRBIT(G_mddrregs->SDRCR, CSL_DDR2_MDDR_SDRCR_LPMODEN_MASK);
CSL_CLRBIT(G_mddrregs->SDRCR, CSL_DDR2_MDDR_SDRCR_MCLKSTOPEN_MASK);
G_mddrregs->PBBPR = DDR2_PBBPR;
}
// PLL1 配置参数定义//DDR2 300MHz, UART1/2、TIMER2/3、SPI1 150MHz
#define PLL1_MUL 11
#define PLL1_POSTDIV 1
#define PLL1_DIV1 0
#define PLL1_DIV2 1
#define PLL1_DIV3 2
// DDR 300MHz
PLL1Init(PLL1_MUL, PLL1_POSTDIV, PLL1_DIV1,PLL1_DIV2, PLL1_DIV3);
项目实测时程序挂死在标红位置,断点调试发现配置mDDR时,VTPIO_CTL寄存器相关功能配置不生效(bit置位无效),导致VTP状态不对,程序挂死,其他寄存器配置未出现这样的问题,请教各位TI技术专家,这个问题如何处理,项目急用,多谢!
Tony Tang:
是不是哪里顺序搞错了,为什么要自己写,直接用TI开发板提供的gel文件,改改时序参数就行了。