Part Number: TMS320C6655
Tool/software:
Currently we are taking the approach of storing and reading data in DDR3 memory via DSP.
However, since it has been confirmed that data is often uploaded abnormally, we are conducting tests by writing data to memory through DSP, reading it back after a while, and comparing the two data.
When data is incorrect, two major symptoms can be identified.
The first is when some of the data is off by one bit.
ex)
The second is that meaningless data is recorded repeatedly at specific intervals.
ex)
I modified the DSP initialization part to find what could be the cause of the symptom, but there was no significant change.
I tested it by modifying the values using the DDR3 PHY Calc v11 and DDR3 Register Calc v4 Excel documents provided by TI, but there was no particular change.
We are using MT41K128M16JT-125-k memory at 800Mhz speed.
The DSP initialize sequence is as follows:
------------------------------------------------------------------------------------------------------------------------------------------------
CSL_BootCfgUnlockKicker();
/* Wait for PLL to lock = min 500 ref clock cycles.
With refclk = 100MHz, = 5000 ns = 5us */
platform_delaycycles(50000);
/**************** 3.3 Leveling Register Configuration ********************/
CSL_BootCfgGetDDRConfig(0, &ddr3config);
ddr3config &= ~(0x007FE000); // clear ctrl_slave_ratio field
CSL_BootCfgSetDDRConfig(0, ddr3config);
CSL_BootCfgGetDDRConfig(0, &ddr3config);
ddr3config |= 0x00200000; // set ctrl_slave_ratio to 0x100
CSL_BootCfgSetDDRConfig(0, ddr3config);
CSL_BootCfgGetDDRConfig(12, &ddr3config);
ddr3config |= 0x08000000; // Set invert_clkout = 1
CSL_BootCfgSetDDRConfig(12, ddr3config);
CSL_BootCfgGetDDRConfig(0, &ddr3config);
ddr3config |= 0xF; // set dll_lock_diff to 15
CSL_BootCfgSetDDRConfig(0, ddr3config);
CSL_BootCfgGetDDRConfig(23, &ddr3config);
ddr3config |= 0x00000200;
CSL_BootCfgSetDDRConfig(23, ddr3config);
/**************** 3.3 Partial Automatic Leveling ********************/
ddr3config = 0x58; CSL_BootCfgSetDDRConfig(2, ddr3config);
ddr3config = 0x58; CSL_BootCfgSetDDRConfig(3, ddr3config);
ddr3config = 0x45; CSL_BootCfgSetDDRConfig(4, ddr3config);
ddr3config = 0x45; CSL_BootCfgSetDDRConfig(5, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(6, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(7, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(8, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(9, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(10, ddr3config);
ddr3config = 0xB4; CSL_BootCfgSetDDRConfig(14, ddr3config);
ddr3config = 0xB4; CSL_BootCfgSetDDRConfig(15, ddr3config);
ddr3config = 0xA1; CSL_BootCfgSetDDRConfig(16, ddr3config);
ddr3config = 0xA1; CSL_BootCfgSetDDRConfig(17, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(18, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(19, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(20, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(21, ddr3config);
ddr3config = 0x00; CSL_BootCfgSetDDRConfig(22, ddr3config);
/* Errata Advisory 29 */
ddr3config = (0x01000000); // clear ctrl_slave_ratio field
CSL_BootCfgSetDDRConfig(1, ddr3config);
/*Do a PHY reset. Toggle DDR_PHY_CTRL_1 bit 15 0->1->0 */
CSL_EMIF4F_GetPhyControl(&ddrPhyCtrl, &ddrPHYReadLatency);
ddrPhyCtrl &= ~(0x00008000);
CSL_EMIF4F_SetPhyControl(ddrPhyCtrl, ddrPHYReadLatency);
CSL_EMIF4F_GetPhyControl(&ddrPhyCtrl, &ddrPHYReadLatency);
ddrPhyCtrl |= (0x00008000);
CSL_EMIF4F_SetPhyControl(ddrPhyCtrl, ddrPHYReadLatency);
CSL_EMIF4F_GetPhyControl(&ddrPhyCtrl, &ddrPHYReadLatency);
ddrPhyCtrl &= ~(0x00008000);
CSL_EMIF4F_SetPhyControl(ddrPhyCtrl, ddrPHYReadLatency);
/***************** 3.4 Basic Controller and DRAM configuration ************/
/* enable configuration */
/* hEmif->SDRAM_REF_CTRL = 0x00005161; */
hEmif->SDRAM_REF_CTRL = 0x000061A8;
/* hEmif->DDR_PHY_CTRL_1 = 0x0010010F; */
ddrPHYReadLatency = 0x0F;
ddrPhyCtrl = (0x0010010F);
CSL_EMIF4F_SetPhyControl(ddrPhyCtrl, ddrPHYReadLatency);
/* hEmif->ZQ_CONFIG = 0x70074C1F; */
zqcfg.zqRefInterval = 0x4C1F;
zqcfg.zqZQCLMult = 3;
zqcfg.zqZQCLInterval = 1;
zqcfg.zqSFEXITEn = 1;
zqcfg.zqDualCSEn = 1;
zqcfg.zqCS0En = 1;
zqcfg.zqCS1En = 0;
CSL_EMIF4F_SetOutputImpedanceConfig(&zqcfg);
/* hEmif->PWR_MGMT_CTRL = 0x0; */
pwrmgmtcfg.csTime = 0;
pwrmgmtcfg.srTime = 0;
pwrmgmtcfg.lpMode = 0;
pwrmgmtcfg.dpdEnable = 0;
pwrmgmtcfg.pdTime = 0;
CSL_EMIF4F_SetPowerMgmtConfig (&pwrmgmtcfg);
/* New value with DYN_ODT disabled and SDRAM_DRIVE = RZQ/7 */
/* hEmif->SDRAM_CONFIG = 0x62466AB2; */
CSL_EMIF4F_GetSDRAMConfig (&sdramcfg);
sdramcfg.type = 3;
sdramcfg.iBankPos = 0;
sdramcfg.ddrTerm = 3;
sdramcfg.dynODT = 2;
sdramcfg.SDRAMDrive = 1;
sdramcfg.CASWriteLat = 3;
sdramcfg.narrowMode = 1;
sdramcfg.CASLatency = 0xA;
sdramcfg.rowSize = 5;
sdramcfg.iBank = 3;
sdramcfg.eBank = 0;
sdramcfg.pageSize = 2;
sdramcfg.disableDLL = 0;
sdramcfg.ddrDDQS = 0;
CSL_EMIF4F_SetSDRAMConfig (&sdramcfg);
hEmif->SDRAM_TIM_1 = 0x1557B9BD;
hEmif->SDRAM_TIM_2 = 0x40877FEB;
hEmif->SDRAM_TIM_3 = 0x559F87FF;
pll_delay(840336); /*Wait 600us for HW init to complete*/
/***************** 4.2.1 Partial automatic leveling ************/
/* www.ti.com/.../sprabl2d.pdf */
/* 3.2.1 Executing Partial Automatic Leveling */
CSL_EMIF4F_SetRefreshRate(0x0000189A);
/***************** 4.2.1 Partial automatic leveling ************/
/* hEmif->RDWR_LVL_RMP_CTRL = 0x80000000; */
CSL_EMIF4F_SetLevelingRampControlInfo(1, 0, 0, 0, 0);
/* Trigger full leveling - This ignores read DQS leveling result and uses ratio forced value */
/* hEmif->RDWR_LVL_CTRL = 0x80400000; */
//CSL_EMIF4F_SetLevelingControlInfo(1, 0, 64, 0, 0); //check
CSL_EMIF4F_SetLevelingControlInfo(1, 0, 0, 0, 0);
/************************************************************
Wait for min 1048576 DDR clock cycles for leveling to complete
= 1048576 * 1.5ns = 1572864ns = 1.57ms.
Actual time = ~10-15 ms
**************************************************************/
pll_delay(4201680); //Wait 3ms for leveling to complete
return (status);
------------------------------------------------------------------------------------------------------------------------------------------------
Is there anything else worth testing in the initialize section?
Or, I would like to know if there were any cases where similar problems occurred when the above symptoms occurred due to hardware problems.
