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.

why the EMIFA SPEED SO SLOW IN C6747?

Other Parts Discussed in Thread: CCSTUDIO

hello

    I am using EMIFA in tms320c6747zkb3 in sram mode. The CLKIN is 24MHz. found the one IMIFA write cycle takes 300 nsec. Why this much time ? for verification I have measure the EMIFA clock source and found that it is at 133 MHz.(it is ok).I only write data from cs4, no any divice to connect.I flash the *.bin file to spi. C6747 boot from spi divice. I don't konwn what's wrong.I set the register follow:

*Enable Function for PSC0*/
void PSC0_lPSC_enable(Uint8 PD, Uint8 LPSC_num)
 {

  *(Uint32*) (PSC0_MDCTL+4*LPSC_num) = (*(Uint32*) (PSC0_MDCTL+4*LPSC_num) & 0xFFFFFFE0) | 0x0003;
  PSC0_PTCMD = 0x1<<PD;
  while( (PSC0_PTSTAT & (0x1<<PD) ) !=0) ; /*Wait for power state transition to finish*/
  while( (*(Uint32*)(PSC0_MDSTAT+4 * LPSC_num) & 0x1F) !=0x3);
}

/*Enable Function for PSC1*/
void PSC1_lPSC_enable(Uint8 PD, Uint8 LPSC_num)
 {

  *(Uint32*) (PSC1_MDCTL+4*LPSC_num) = (*(Uint32*) (PSC1_MDCTL+4*LPSC_num) & 0xFFFFFFE0) | 0x0003;
  PSC1_PTCMD = 0x1<<PD;
  while( (PSC1_PTSTAT & (0x1<<PD) ) !=0) ; /*Wait for power state transition to finish*/
  while( (*(Uint32*)(PSC1_MDSTAT+4 * LPSC_num) & 0x1F) !=0x3);
}

void initpsc( void)
{
   
   

    // PSC0
    PSC0_lPSC_enable(0, 0);
    PSC0_lPSC_enable(0, 1);
    PSC0_lPSC_enable(0, 2);
    PSC0_lPSC_enable(0, 3);  // EMIFA
    PSC0_lPSC_enable(0, 4);
    PSC0_lPSC_enable(0, 5);
    PSC0_lPSC_enable(0, 6);
    PSC0_lPSC_enable(0, 8);
    PSC0_lPSC_enable(0, 9);
    PSC0_lPSC_enable(0, 10);
    PSC0_lPSC_enable(0, 11);
    PSC0_lPSC_enable(0, 12);
    PSC0_lPSC_enable(0, 13);

 // PSC1
    PSC1_lPSC_enable(0, 1);
    PSC1_lPSC_enable(0, 2);
    PSC1_lPSC_enable(0, 3);
 PSC1_lPSC_enable(0, 4);
    PSC1_lPSC_enable(0, 5);
    PSC1_lPSC_enable(0, 6);  // EMIFB
    PSC1_lPSC_enable(0, 7);
    PSC1_lPSC_enable(0, 8);
    PSC1_lPSC_enable(0, 9);
    PSC1_lPSC_enable(0, 10);
    PSC1_lPSC_enable(0, 11);
    PSC1_lPSC_enable(0, 12);
    PSC1_lPSC_enable(0, 13);
    PSC1_lPSC_enable(0, 16);
    PSC1_lPSC_enable(0, 17);
    PSC1_lPSC_enable(0, 20);
    PSC1_lPSC_enable(0, 21);
    PSC1_lPSC_enable(0, 24);
    PSC1_lPSC_enable(0, 25);
    PSC1_lPSC_enable(0, 26);
    PSC1_lPSC_enable(0, 31);

   
}

void  SystemConfig(void)

{

 
    KICK0R = 0x83e70b13;  // Kick0 register + data (unlock)
    KICK1R = 0x95a4f1e0;  // Kick1 register + data (unlock)

    PINMUX0  = 0x11111188;  // EMIFB, Check EMU0/RTCK
    PINMUX1  = 0x11111111;  // EMIFB
    PINMUX2  = 0x11111111;  // EMIFB
    PINMUX3  = 0x11111111;  // EMIFB
    PINMUX4  = 0x11111111;  // EMIFB
    PINMUX5  = 0x11111111;  // EMIFB
    PINMUX6  = 0x11111111;  // EMIFB
    PINMUX7  = 0x18111111;  // EMIFB, SPI0,GP5[3]
    PINMUX8  = 0x21122111;  // UART2, McASP1, I2C0, I2C1
    PINMUX9  = 0x11021111;  // RMII CLK, McASP0, USB_DRVVBUS, UART2
    PINMUX10 = 0x22222228;  // RMII/ McASP0
    PINMUX11 = 0x11112222;  // McASP1, UART1, McASP0, MDIO (last 2 digits 0x22 for MDIO instead of GPIO)
    PINMUX12 = 0x11111111;  // McASP0 / McASP1
    PINMUX13 = 0x11888888;//0x22111111;  // SD / McASP1
    PINMUX14 = 0x11111111;//0x88222222;  // SD / EMIFA
    PINMUX15 = 0x11111111;//0x21888888;  // SD / EMIFA
    PINMUX16 = 0x11111111;//0x11111112;  // SD / EMIFA
    PINMUX17 = 0x20111111;//0x20100111;  // EMIFA,EMA_CS4********
    PINMUX18 = 0x11111112;//0x11111112;  // EMIFA,EMA_CS5,EMA_CS3,EMA_CS2
    PINMUX19 = 0x00000001;  // EMIFA

 KICK0R = 0;  // Kick0 register + data (lock)
    KICK1R = 0;  // Kick1 register + data (lock)
  
}

void InitPLL(void)
{
    int i = 0;

    /* Configure ARM, DSP at 300MHz, EMIFs at 133MHz */
    //Uint8 DIV45_EN = 1;
    Uint8 CLKMODE = 0;
    Uint8 PLLM = 24;
    Uint8 POSTDIV = 1;
 Uint8 PLLDIV2 = 2;
    Uint8 PLLDIV3 = 2;
    Uint8 PLLDIV5 = 2;//5
    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 &=  0xFFFFFFF6;  /*PLL BYPASS MODE*///********0xFFFFFFFE
  
   /*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 &= 0xFFFFFFFF;  //***************************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;//*************0xFFFFFDF

   /* 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;///*****************0xFFFFFFEF
  
 
  for(i=0; i<0xffff; i++) {;}   /*PLL stabilisation*/
   /*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_PLLDIV2 = 0x8000 | PLLDIV2; /* Make PLLDIV2 as bootpacket, do it for other PLLDIVx to if required*/
    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*/
   for(i=0; i<0xffff; i++) {;}  
   /*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 |= 0x2;   // Select 4.5 divider for EMIFA clock source only (not EMIFB)
   CFGCHIP3 |= 0x1;       // Select 4.5 divider for EMIFB clock source only (not EMIFA)
}


void emifconfig(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 2
        |( 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
        |( 8192 <<0);       // Refresh rate = 7812.5ns / 7.5ns

    EMIFB_SDTIM1 = 0        // SDRAM Timing Register 1
        |( 8 << 25)        // (67.5ns / 7.55ns) - 1 = TRFC  @ 133MHz
        |( 2 << 22 )        // (20ns / 7.5ns) - 1 =TRP
        |( 2 << 19 )        // (20ns / 7.5ns) - 1 = TRCD
        |( 1 << 16 )        // (14ns / 7.5ns) - 1 = TWR
        |( 5 << 11 )        // (45ns / 7.5ns) - 1 = TRAS
        |( 8 <<  6 )        // (67.5ns / 7.5ns) - 1 = TRC
        |( 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
        |( 16<< 27)         // 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
        |( 5 << 0 );        // ( 45 / 7.5 ) - 1

    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

}

void CEint()
{
   AEMIF_A2CR = 0    //CE3
     | ( 0 << 31 )           // selectStrobe
        | ( 0 << 30 )           // extWait
       | ( 1 << 26 )           // writeSetup  //1    //   0 ns
       | ( 8 << 20 )           // writeStrobe //4    //  40 ns
       | ( 2 << 17 )           // writeHold   //1    //   0 ns
       | ( 1 << 13 )           // readSetup   //1    //   0 ns
       | ( 6 << 7 )            // readStrobe //8     //  80 ns
       | ( 2 << 4 )            // readHold   // 1    //  10 ns
        | ( 3 << 2 )            // turnAround    //3  //  10 ns
        | ( 0 << 0 );           // asyncSize       // 8-bit bus          // asyncSize       //  8-bit bus*/

 AEMIF_A3CR = 0    //CE4
     | ( 0 << 31 )           // selectStrobe
        | ( 0 << 30 )           // extWait
       | ( 1 << 26 )           // writeSetup  //1    //   0 ns********2
       | ( 2 << 20 )           // writeStrobe //4    //  50 ns*******24
       | ( 1 << 17 )           // writeHold   //1    //   0 ns********2
       | ( 2 << 13 )           // readSetup   //1    //   0 ns
       | ( 2 << 7 )            // readStrobe //20     //  200 ns*****24
       | ( 2 << 4 )            // readHold   // 1    //  10 ns
        | ( 3 << 2 )            // turnAround    //3  //  10 ns********3
        | ( 1 << 0 );           // asyncSize       // 16-bit bus    

   AEMIF_A4CR = 0    //CE5
     | ( 0 << 31 )           // selectStrobe
        | ( 0 << 30 )           // extWait
       | ( 1 << 26 )           // writeSetup  //1    //   0 ns
       | ( 8 << 20 )           // writeStrobe //4    //  40 ns
       | ( 2 << 17 )           // writeHold   //1    //   0 ns
       | ( 1 << 13 )           // readSetup   //1    //   0 ns
       | ( 6 << 7 )            // readStrobe //8     //  80 ns
       | ( 2 << 4 )            // readHold   // 1    //  10 ns
        | ( 3 << 2 )            // turnAround    //3  //  10 ns
        | ( 1 << 0 );           // asyncSize       // 16-bit bus         

}

The cmd file follow:


-l rts64plus.lib
-l ..\..\..\C6747_common\lib\C6747bsl.lib

-stack           0x00001000      /* Stack Size */
-heap            0x00001000      /* Heap Size */

MEMORY
{
    VECS:        o = 0xFFFF0000  l = 0x00000080
    ARMRAM:      o = 0xFFFF0080  l = 0x00001f80
    DSPRAM:      o = 0x11800000  l = 0x00040000
    SHAREDRAM:   o = 0x80000000  l = 0x00020000
    SDRAM:       o = 0xC0000000  l = 0x20000000
 ASRAM:   o = 0x64000000  l = 0x02000000
}

SECTIONS
{
    .bss        >   SHAREDRAM
    .cinit      >   SHAREDRAM
    .cio        >   SHAREDRAM
    .const      >   SHAREDRAM
    .stack      >   SHAREDRAM
    .sysmem     >   SHAREDRAM
    .text       >   SHAREDRAM
    .switch     >   SHAREDRAM
    .far        >   SHAREDRAM
}

  • aongkun said:
    I am using EMIFA in tms320c6747zkb3 in sram mode. The CLKIN is 24MHz. found the one IMIFA write cycle takes 300 nsec. Why this much time ?

    Based on your configuration I would expect the EMIFA to take (1+1) + (2+1) + (1+1) = 7 EMIF cycles for every 8-bits.  At 133MHz that is 52ns.  For 32-bits, that would be 52 x 4 = 208ns. 

    Can you provide more information on how you are measuring 300ns?  Are you measuring the CS4 low pulse width or measuring the time from CS4 low to CS4 low?

  • GUS Martinez

          thank you very much.

          I have change EMIFA to (0+1)+(1+1)+(0+1)=4 EMIFA cycles ,but It's no difference with the configuration   (1+1) + (2+1) + (1+1).My EMIFA is configed as 16bits.

          I use the follow code to test,and I test the data pin (such as EMIFA_D0), It change from high to low in about 300ns.I measure the CS4,the width is about 50ns,and low to low is about 300ns(rise to rise).

    void EMIFAtest(void)
    {

        Uint32 i;
     Uint16 DataTemp,DataTempNot;

        Uint16 *EMIFA_StartAdd;

        Uint32 Length=0x1000000;
        EMIFA_StartAdd = (Uint16 *)0x64000000;
        DataTemp=0x5555;
     DataTempNot=0xAAAA;
     
     i=0;

     while(1)
     {
      *(EMIFA_StartAdd) = DataTemp;
      *(EMIFA_StartAdd) = DataTempNot;
      
     }
     printf("\nWriting 0x00000000 is ok.");

    }

  • CPU writes are non-optimal, there will always be delays between writes.  If you need higher data rates, you should use the EDMA and/or the data cache.  If you measure the CS low pulse, you should see it stay low for a duration equal to your setup, strobe, and hold periods.

  • Gus Martinez

             thank you very much!

            I want to to as you suggestion. but I can't kown how to use the  data cache.you say  " If you need higher data rates, you should use the EDMA and/or the data cache. " Can you give some knowleg?

    aongkun

  • You can get tons of information on the cache and the EDMA from their user guides located here:

    http://focus.ti.com/docs/prod/folders/print/tms320c6747.html

    I am not sure if you plan to use CSL, but there is a CSL cache example given in the BIOS PSP release.  If you don't have the PSP already, you can get it from this link:

    http://software-dl.ti.com/dsps/dsps_registered_sw/sdo_sb/targetcontent/psp/bios_psp/index.html

    The example is located here:

    <PSPINSTALLDIR>\pspdrivers_<VERSION>\packages\ti\pspiom\cslr\evm6747\examples\cache

     

  • Gus Martinez

           when I use the example in the path <PSPINSTALLDIR>\pspdrivers_<VERSION>\packages\ti\pspiom\cslr\evm6747\examples\cache,it display an error: cannot find file "bios6747.a674". I search the the path <PSPINSTALLDIR>\pspdrivers_<VERSION>,but cannot find it? Can you tell me , how can I do next?

    aongkun

     

  • What CCS version and emulator are you using?  I compiled the project using CCSv3.3 and it compiled without issues.

  • This is the DSP/BIOS binary.

    You need to find out where is bios installed in your computer (for example C:\CCStudio_v3.3\bios_5_41_03_17\packages\ti\bios\lib) and:

    1) Set up the BIOS_INSTALL_DIR - environmental variable in windows, se this page for an example.

    2) Or put the path in the linker library include path (Build Options) directly:

    C:\CCStudio_v3.3\bios_5_41_03_17\packages\ti\bios\lib

  • What is connected to CS4?  SRAM?  FPGA?  FIFO?

  • Brad Griffis

              thanks very much.

            I use ccs3.3.49 and SEED-XDS560PLUS. I have change the bios path,now it is working.but the speed is stell so slow. I connet the cs4 to FPGA, and in FPGA I design a sram(or fifo).

           can you help me aggain?

    aongkun

  • Open up your BIOS tcf file in the graphical editor.  Right-click on Global and select Properties.  Click the 64Plus tab, take a screenshot (alt-printscreen, paste to paint, save as jpg), and then post it into this thread.  Click the "insert media" icon (looks like a movie film strip) to insert it.

  • Brad Griffis

           thanks.

          But I don't know where the BIOS tcf file are.

    aongkun