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.

TMS320F28035 - Flash API - EEPROM EMULATION

Dear Supplier,

The document TMS320F2803x PiccoloTM Flash API using CCS4.0v, Release version: 2010.05.03, Release date: May 03, 2010

Provides the following informations:

In your application, before calling any Flash API functions do the following:

Step 4 -> Initialize the PLL control register (PLLCR) and wait for the PLL to lock.

Step 5 -> Make sure the PLL is not running in limp mode. If the PLL is in limp mode, do not call any of the API functions as the device will not be running at the proper frequency.

The code shown below must be execute every time a Flash API function is used or it needs to be executed only at the initialization after the power up of the DSC TMS320F2803x

 

void InitPll(Uint16 val, Uint16 divsel)

{

   volatile Uint16 iVol;

   // Make sure the PLL is not running in limp mode

   if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)

   {

      EALLOW;

      // OSCCLKSRC1 failure detected. PLL running in limp mode.

      // Re-enable missing clock logic.

      SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1;

      EDIS;

      // Replace this line with a call to an appropriate

      // SystemShutdown(); function.

      __asm("        ESTOP0");     // Uncomment for debugging purposes

   }

 

   // DIVSEL MUST be 0 before PLLCR can be changed from

   // 0x0000. It is set to 0 by an external reset XRSn

   // This puts us in 1/4

   if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)

   {

       EALLOW;

       SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;

       EDIS;

   }

 

   // Change the PLLCR

   if (SysCtrlRegs.PLLCR.bit.DIV != val)

   {

 

      EALLOW;

      // Before setting PLLCR turn off missing clock detect logic

      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;

      SysCtrlRegs.PLLCR.bit.DIV = val;

      EDIS;

 

      // Optional: Wait for PLL to lock.

      // During this time the CPU will switch to OSCCLK/2 until

      // the PLL is stable.  Once the PLL is stable the CPU will

      // switch to the new PLL value.

      //

      // This time-to-lock is monitored by a PLL lock counter.

      //

      // Code is not required to sit and wait for the PLL to lock.

      // However, if the code does anything that is timing critical,

      // and requires the correct clock be locked, then it is best to

      // wait until this switching has completed.

 

      // Wait for the PLL lock bit to be set.

 

      // The watchdog should be disabled before this loop, or fed within

      // the loop via ServiceDog().

 

      // Uncomment to disable the watchdog

      DisableDog();

 

      while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)

      {

          // Uncomment to service the watchdog

          // ServiceDog();

      }

 

      EALLOW;

      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;

      EDIS;

    }

 

    // If switching to 1/2

    if((divsel == 1)||(divsel == 2))

    {

        EALLOW;

        SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;

        EDIS;

    }

 

    // If switching to 1/1

    // * First go to 1/2 and let the power settle

    //   The time required will depend on the system, this is only an example

    // * Then switch to 1/1

    if(divsel == 3)

    {

        EALLOW;

        SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;

        DELAY_US(50L);

        SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;

        EDIS;

    }

}

 

Best Regards.