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.

28335 Clock Setup



I just happen to run into an issue that I can’t seem to fix.  I can’t get the XCLKOUT to clock out at anything faster than ¼ the SYSCLKOUT.

 

Here is the code I am using.

 

#define DSP28_DIVSEL     2 // Enable /2 for SYSCLKOUT

#define DSP28_PLLCR   10

 

void InitSysCtrl(void)

{

                // Disable the watchdog

                DisableDog();

 

                // Initialize the PLL control: PLLCR and DIVSEL

                // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h

                InitPll(DSP28_PLLCR,DSP28_DIVSEL);

 

                // Initialize the peripheral clocks

                InitPeripheralClocks();

}

 

 

void InitPll(Uint16 val, Uint16 divsel)

{

                EALLOW;

 

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

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

                {

                // Missing external clock has been detected

                // Replace this line with a call to an appropriate

                // SystemShutdown(); function.

                asm("        ESTOP0");

                }

 

                // 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)

                {

                SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;

                }

 

                // Change the PLLCR

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

                {

                // Before setting PLLCR turn off missing clock detect logic

                SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;

                SysCtrlRegs.PLLCR.bit.DIV = val;;

 

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

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

                {

                                // Uncomment to service the watchdog

                // ServiceDog();

                }

 

                SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;

    }

 

    // If switching to 1/2

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

                {

                                SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;

                }

 

                // NOTE: ONLY USE THIS SETTING IF PLL IS BYPASSED (I.E. PLLCR = 0) OR OFF

                // 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)

                {

                    SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;

                    DELAY_US(50L);

                    SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;

    }

   

                EDIS;

}

 

 

 

void InitPeripheralClocks(void)

{

                EALLOW;

 

// HISPCP/LOSPCP prescale register settings, normally it will be set to default values

                SysCtrlRegs.HISPCP.all = 0x0001;

                SysCtrlRegs.LOSPCP.all = 0x0002;

 

 

 

// This function is not written to be an example of efficient code.

 

                SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC clock enabled

 

                // *IMPORTANT*

                // The ADC_cal function, which  copies the ADC calibration values from TI reserved

                // OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the

                // Boot ROM. If the boot ROM code is bypassed during the debug process, the

                // following function MUST be called for the ADC to function according

                // to specification. The clocks to the ADC MUST be enabled before calling this

                // function.

                // See the device data manual and/or the ADC Reference

                // Manual for more information.

 

                ADC_cal();

 

 

                SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 0;                                                         // I2C clock off

                SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 0;                                                         // SCI-A clock off

                SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 0;                                                         // SCI-B clock off

                SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 0;                                                         // SCI-C clock off

                SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 0;                                                         // SPI-A clock off

                SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 0;                                   // McBSP-A clock off

                SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 0;                                  // McBSP-B clock off

                SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=0;                                       // eCAN-A clock off

                SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=0;                                       // eCAN-B clock off

 

                SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;                                                        // Disable TBCLK within the ePWM

                SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;                                     // ePWM1 clock on

                SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;                                     // ePWM2 clock on

                SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;                                     // ePWM3 clock on

                SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;                                     // ePWM4 clock on

                SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;                                     // ePWM5 clock on

                SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;                                     // ePWM6 clock on

                SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;                                                        // Enable TBCLK within the ePWM

 

                SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 0;                                      // eCAP3 clock off

                SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 0;                                      // eCAP4 clock off

                SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 0;                                      // eCAP5 clock off

                SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 0;                                      // eCAP6 clock off

                SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0;                                      // eCAP1 clock off

                SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 0;                                      // eCAP2 clock off

                SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 0;                                      // eQEP1 clock off

                SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 0;                                      // eQEP2 clock off

 

                SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;             // CPU Timer 0 clock on

                SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 0;             // CPU Timer 1 clock off

                SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 0;             // CPU Timer 2 clock off

 

                SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;                                         // DMA Clock clock on

                SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 0;                                    // GPIO input clock clock off

 

                SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;                                       // XTIMCLK clock on

               // Set XCLKOUT to SYSCLKOUT ratio to 1:1

                XintfRegs.XINTCNF2.bit.XTIMCLK = 0;                                                // XTIMCLK = SYSCLKOUT

                XintfRegs.XINTCNF2.bit.CLKMODE = 0;                                              // XCLKOUT = XTIMCLK

                XintfRegs.XINTCNF2.bit.CLKOFF = 0;                                                  // Enable XCLKOUT

 

                EDIS;

}

 

 

It seems that whenever I make a change to the XintfRegs.XINTCNF2 register the pin no longer outputs the clockout.