This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DSP can not run on external SDRAM



HI dear ,I'm sorry that my English is very poor.

Our  products  use the C6747, run the program which load from FLASH  to the SDRAM . Found a lot of board can not run the program affter two years later .We compared the difference between the new and the damaged circuit board .Found that the amplitude of the SDRAM's clock has changed,like list picture   

                         Damaged  board clk                                                                                                                          ok board CLK

Here is our circuit diagram

Here is our EMB configuration with the SDRAM connection

void InitPLL1(void)
{
int i = 0;

/* Configure ARM, DSP at 300MHz, EMIFs at 133MHz */
//Uint8 DIV45_EN = 1;
Uint8 CLKMODE = 0;
Uint8 PLLM = 29;
//Uint8 PLLM = 14;//150M
Uint8 POSTDIV = 1;
Uint8 PLLDIV3 = 2;
Uint8 PLLDIV5 = 3;
Uint8 PLLDIV7 = 7;
Uint8 PREDIV = 0;

// Moved step 2c and 2d to step 0
/*Set PLLEN=0 and PLLRST=0, Reset the PLL*/
PLL0_PLLCTL &= 0xFFFFFFFE; /*PLL BYPASS MODE*/

/*wait for 4 cycles to allow PLLEN mux switches properly to bypass clock*/
for(i=0; i<PLLEN_MUX_SWITCH; i++) {;} /*Make PLLEN_MUX_SWITCH as bootpacket*/

/*Select the Clock Mode bit 8 as External Clock or On Chip Oscilator*/
PLL0_PLLCTL &= 0xFFFFFEFF;
PLL0_PLLCTL |= (CLKMODE<<8); /* Make CLKSRC as BootPacket to pass the value*/

/*Set PLLENSRC '0',bit 5, PLL Enable(PLLEN) selection is controlled through MMR*/
PLL0_PLLCTL &= 0xFFFFFFDF;

/*PLLCTL.EXTCLKSRC bit 9 should be left at 0 for Primus*/
PLL0_PLLCTL &= 0xFFFFFDFF;

/* Clear PLLRST bit to 0 -Reset the PLL */
PLL0_PLLCTL &= 0xFFFFFFF7;

/*Disable the PLL output*/
PLL0_PLLCTL |= 0x10;

/*PLL initialization sequence*/

/*Power up the PLL- PWRDN bit set to 0 to bring the PLL out of power down bit*/
PLL0_PLLCTL &= 0xFFFFFFFD;

/*Enable the PLL from Disable Mode PLLDIS bit to 0 - This is step is not required for Primus*/
PLL0_PLLCTL &= 0xFFFFFFEF;

/*PLL stabilisation time- take out this step , not required here when PLL in bypassmode*/
// for(i=0; i<PLL_STABILIZATION_TIME; i++) {;} /* Make PLL_STABILIZATION_TIME as bootpacket*/
PLL0_PREDIV = 0x8000 | PREDIV;
/*Program the required multiplier value in PLLM*/
PLL0_PLLM = PLLM; /* Make PLLMULTIPLEIR as bootpacket*/

/*If desired to scale all the SYSCLK frequencies of a given PLLC, program the POSTDIV ratio*/

PLL0_POSTDIV = 0x8000 | POSTDIV; /* Make POSTDIV as bootpacket*/

/*If Necessary program the PLLDIVx*/
/*Check for the GOSTAT bit in PLLSTAT to clear to 0 to indicate that no GO operation is currently in progress*/
while(PLL0_PLLSTAT & 0x1==1){}

/*Program the RATIO field in PLLDIVx with the desired divide factors. In addition, make sure in this step you leave the PLLDIVx.DxEN bits set so clocks are still enabled (default).*/
PLL0_PLLDIV3 = 0x8000 | PLLDIV3; /* Make PLLDIV3 as bootpacket, do it for other PLLDIVx to if required*/
PLL0_PLLDIV5 = 0x8000 | PLLDIV5; /* Make PLLDIV5 as bootpacket, do it for other PLLDIVx to if required*/
PLL0_PLLDIV7 = 0x8000 | PLLDIV7; /* Make PLLDIV7 as bootpacket, do it for other PLLDIVx to if required*/

/*Set the GOSET bit in PLLCMD to 1 to initiate a new divider transition.*/
PLL0_PLLCMD |= 0x1;

/*Wait for the GOSTAT bit in PLLSTAT to clear to 0 (completion of phase alignment).*/
while(PLL0_PLLSTAT & 0x1==1) { }


/*Wait for PLL to reset properly. See PLL spec for PLL reset time - This step is not required here -step11*/
// for(i=0; i<PLL_RESET_TIME_CNT; i++) {;} /*128 MXI Cycles*/ /*Make PLL_RESET_TIME_CNT as boot packet*/

/*Set the PLLRST bit in PLLCTL to 1 to bring the PLL out of reset*/
PLL0_PLLCTL |= 0x8;

/*Wait for PLL to lock. See PLL spec for PLL lock time*/
for(i=0; i<PLL_LOCK_TIME_CNT; i++) {;} /*Make PLL_LOCK_TIME_CNT as boot Packet*/

/*Set the PLLEN bit in PLLCTL to 1 to remove the PLL from bypass mode*/
PLL0_PLLCTL |= 0x1;

KICK0R = 0x83e70b13; // Kick0 register + data (unlock)
KICK1R = 0x95a4f1e0; // Kick1 register + data (unlock)
CFGCHIP3 |= 0x4; // Enable 4.5 divider PLL
CFGCHIP3 &= 0xfe;
//CFGCHIP3 |= 0x1; // Select 4.5 divider for EMIFB clock source only (not EMIFA)

}


void emifconfig1(void)
{
// ISSI IS42S16160B-6BL SDRAM, 2 x 16M x 16 (32-bit data path), 133MHz
EMIFB_SDCFG = 0 // SDRAM Bank Config Register
|( 1 << 15) // Unlock timing registers
|( 3 << 9 ) // CAS latency is 3
|( 2 << 4 ) // 4 bank SDRAM devices
|( 1 << 0 ); // 512-word pages requiring 9 column address bits

EMIFB_SDREF = 0 // SDRAM Refresh Control Register
|( 0 << 31) // Low power mode disabled
|( 0 << 30) // MCLK stoping disabled
|( 0 << 23) // Selects self refresh instead of power down
|(1038 <<0);

EMIFB_SDTIM1 = 0 // SDRAM Timing Register 1
|( 8<< 25) // (67.5ns / 7.55ns) - 1 = TRFC @ 133MHz 70ns
|( 2 << 22 ) // (20ns / 7.5ns) - 1 =TRP 20ns
|( 2 << 19 ) // (20ns / 7.5ns) - 1 = TRCD 20ns
|( 1 << 16 ) // (14ns / 7.5ns) - 1 = TWR 20ns
|( 5 << 11 ) // (45ns / 7.5ns) - 1 = TRAS 50ns
|( 8 << 6 ) // (67.5ns / 7.5ns) - 1 = TRC 70ns
|( 1 << 3 ); // *(((4 * 14ns) + (2 * 7.5ns)) / (4 * 7.5ns)) -1. = TRRD
// but it says to use this formula if 8 banks but only 4 are used here.
// and SDCFG1 register only suports upto 4 banks.

EMIFB_SDTIM2 = 0 // SDRAM Timing Register 2
|( 13<< 27) //2015.3.24 16 改为13 // not sure how they got this number. the datasheet says value should be
// "Maximum number of refresh_rate intervals from Activate to Precharge command"
// but has no equation. TRASMAX is 120k.
|( 9 << 16) // ( 70 / 7.5) - 1 70ns
|( 5 << 0 ); // ( 45 / 7.5 ) - 1 40ns

EMIFB_SDCFG = 0 // SDRAM Bank Config Register
|( 1 << 16)
|( 0 << 15) // Unlock timing registers
|( 3 << 9 ) // CAS latency is 2
|( 2 << 4 ) // 4 bank SDRAM devices
|( 1 << 0 ); // 512-word pages requiring 9 column address bits

}

Now we use the DSP frequency of  600MHz, SDRAM frequency of 133Mhz

There is a strange phenomenon, if I use the electric iron heating C6747, the program can run normally. When it cooling, I  power on the board it  can not run again. If  I reduce the frequency of SDRAM, the program can run normally  too.

I modify the configuration, so that the program is loaded into the internal RAM of DSP, and  check the external SDRAM  by reading and writing  data. The result is all pass.

So We want to consult what is wrong with the DSP ?

We have done a lot of  experiments, such as HALT & HASS, Vibration Test,  low high temperature test .

please help us,thank you very much.

  • Hello,

    Could you please help me understand your problem in a better way.

    Did you check all the voltage rails in failed boards ? All are in nominal level ?

    Any other abnormalities in the failed board ?

    Any difference between the new and failed boards ?

    What is the end application of the board ?

    Regards,
    Senthil
  • Did you check all the voltage rails in failed boards ? All are in nominal level ?   yes ,all of them are ok, also  the power on sequence.

    Any other abnormalities in the failed board ?   There is no other abnormalities except  can not start up

    Any difference between the new and failed boards ? There is no difference except that failed boards have  been used for about two years.Then return back after damage.

    What is the end application of the board ?  Application in Iron and steel casting industry, collect FPGA data which the sampling of the ADC, then  sent to PC by network after  calculation.

    Is it a question of the SDRAM configuration. We are using 10Mhz active crystal, frequency doubled to 600MHZ. PCB is  six layers board 

  • we found that the program run in DSP internal RAM and check the external SDRAM by reading and writing data. also there are errors occur When the temperature is low. Now temperature is about 2℃.
  • HI,We modify the SDRAM frequency to 100MHz, the program can starts properly, but in the aging box inside the low temperature(about -5℃), and then error again.
    we are compared with the new and failed boards, found the failed boards would crash at low temperatures,but new boards would not.
    TI FAE in china said that this is certain batch of C6747's feature which the clk Pin drive capability would changes.
    The equipment sent out in the first few years, now more and more damage and return. please help us how to Solve it. thank you very much.
  • Hello,

    The C6747 had a problem with aging related to total life based on the number of clocks that occur on the device. Your statements of your problem make it sound like it could be similar.

    What is the silicon revision that you were using in the failed boards ? Please share the device marking as well ?

    Regards,
    Senthil