⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r2808init.c

📁 TMS320F2808的完整驱动测试程序源码
💻 C
字号:
/*H*****************************************************************************
*
* $Archive::                                                                   $
* $Revision::                                                                  $
* $Date::                                                                      $
* $Author::                                                                    $
*
* DESCRIPTION: R2808 Post
*
* GLOBALS 
*
* PUBLIC FUNCTIONS:
*                              
* PRIVATE FUNCTIONS:
*
* USAGE/LIMITATIONS:
*
* NOTES:  
*     
* (C) Copyright 2004 by Spectrum Digital Incorporated
* All rights reserved
*
*H*****************************************************************************/
#include <stdio.h>
#include "DSP280x_Device.h"
#include "r2808cfg.h"
#include "r2808init.h"

//---------------------------------------------------------------------------
// XINTF_Init() : Init the external memory system
//---------------------------------------------------------------------------                                     
void XINTF_Init( void )
{
	// Empty for F2808 or we could turn off XCLKOUT
}

interrupt void rsvd_ISR(void)          // for test
{
  
  // Stop in debug else wait for WD to cause reset
#if defined( _DEBUG )
  asm ("      ESTOP0");
#endif 
  for(;;);
}

//---------------------------------------------------------------------------
// InitSysCtrl:  Taken from DSP28_SysCtrl.c
//---------------------------------------------------------------------------
void InitSysCtrl(void)
{
	volatile Uint16 iVol;
	int      val = 10; // 100MHz

	
	// Disable watchdog module
	EALLOW;
	SysCtrlRegs.WDCR= 0x0068;
	EDIS;
	
	// Initalize PLL.  This sets the pll for x10/2 or 100MHz when using a 30
	// MHz input clock, i.e. eZdsp or VDB.
	// Make sure the PLL is not not running in limp mode
	if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 1)
	{
	   if (SysCtrlRegs.PLLCR.bit.DIV != val)
	   {
	
	      EALLOW;
	      // Before setting PLLCR turn off missing clock detect
	      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 or 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.  
	      // Note this bit is not available on 281x devices.  For those devices
	      // use a software loop to perform the required count. 
	
	      while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1) { }
	      
	      EALLOW;
	      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;
	      EDIS;
	   }
	}
	
	// If the PLL is in limp mode, shut the system down
	else 
	{
	  // Replace this line with a call to an appropriate
	  // SystemShutdown(); function. 
	  asm("        ESTOP0");
	}
	
	EALLOW;	   
	// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
	SysCtrlRegs.HISPCP.all = 0x0001;
	SysCtrlRegs.LOSPCP.all = 0x0002;
	
	SysCtrlRegs.XCLK.bit.XCLKOUTDIV=2;
	  	
	// Peripheral clock enables set for the selected peripherals.   
	// If you are not using a peripheral you may want to leave
	// the clock off to save on power. 
	// 
	// Note: not all peripherals are available on all 280x derivates.
	// Refer to the datasheet for your particular device. 
	
	SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC
	SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;   // I2C
	
	SysCtrlRegs.PCLKCR0.bit.SPIAENCLK=1;     // SPI-A
	SysCtrlRegs.PCLKCR0.bit.SPIBENCLK=1;     // SPI-B
	SysCtrlRegs.PCLKCR0.bit.SPICENCLK=1;     // SPI-C
	SysCtrlRegs.PCLKCR0.bit.SPIDENCLK=1;     // SPI-D
	
	SysCtrlRegs.PCLKCR0.bit.SCIAENCLK=1;     // SCI-A
	SysCtrlRegs.PCLKCR0.bit.SCIBENCLK=1;     // SCI-B
	
	SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1;    // eCAN-A
	SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1;    // eCAN-B
	
	SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;  // eCAP1
	SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;  // eCAP2
	SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;  // eCAP3
	SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;  // eCAP4
	
	SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1
	SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;  // ePWM2
	SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;  // ePWM3
	SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;  // ePWM4
	SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;  // ePWM5
	SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  // ePWM6
	
	SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1;  // eQEP1
	SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1;  // eQEP2
	                    
	EDIS;

}

//---------------------------------------------------------------------------
// InitPieCtrl: Taken from DSP28_PieCtrl.c
//---------------------------------------------------------------------------
// This function initializes the PIE control registers to a known state.
//
void InitPieCtrl(void)
{
    // Disable the PIE
    PieCtrlRegs.PIECTRL.bit.ENPIE = 0;

	// Clear all PIEIER registers:
	PieCtrlRegs.PIEIER1.all = 0;
	PieCtrlRegs.PIEIER2.all = 0;
	PieCtrlRegs.PIEIER3.all = 0;	
	PieCtrlRegs.PIEIER4.all = 0;
	PieCtrlRegs.PIEIER5.all = 0;
	PieCtrlRegs.PIEIER6.all = 0;
	PieCtrlRegs.PIEIER7.all = 0;
	PieCtrlRegs.PIEIER8.all = 0;
	PieCtrlRegs.PIEIER9.all = 0;
	PieCtrlRegs.PIEIER10.all = 0;
	PieCtrlRegs.PIEIER11.all = 0;
	PieCtrlRegs.PIEIER12.all = 0;

	// Clear all PIEIFR registers:
	PieCtrlRegs.PIEIFR1.all = 0;
	PieCtrlRegs.PIEIFR2.all = 0;
	PieCtrlRegs.PIEIFR3.all = 0;	
	PieCtrlRegs.PIEIFR4.all = 0;
	PieCtrlRegs.PIEIFR5.all = 0;
	PieCtrlRegs.PIEIFR6.all = 0;
	PieCtrlRegs.PIEIFR7.all = 0;
	PieCtrlRegs.PIEIFR8.all = 0;
	PieCtrlRegs.PIEIFR9.all = 0;
	PieCtrlRegs.PIEIFR10.all = 0;
	PieCtrlRegs.PIEIFR11.all = 0;
	PieCtrlRegs.PIEIFR12.all = 0;

	// Enable PIE:
	PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
	PieCtrlRegs.PIEACK.all = 0xFFFF;
}	

//---------------------------------------------------------------------------
// InitPieVectTable: Taken from PieVect.c and sripped down
//---------------------------------------------------------------------------
// This function initializes the PIE vector table to a known state.
// This function must be executed after boot time.
//

void InitPieVectTable(void)
{
	int16	i;

	Uint32  Source = (Uint32)rsvd_ISR;
	Uint32 * Dest = (void *) &PieVectTable;
	
	EALLOW;	
	for(i=0; i < 128; i++)
		*Dest++ = Source;	
		
    //PieVectTable.TINT0 = Int1Isr;
	EDIS;

	// Enable the PIE Vector Table
	PieCtrlRegs.PIECTRL.bit.ENPIE = 1;	
			
}

#define CSMSCR       (volatile Uint16*)0x00000AEF   // CSM status and control register 
	
#define KEY0         (volatile Uint16*)0x00000AE0   /* low word of the 128-bit key */
#define KEY1         (volatile Uint16*)0x00000AE1   /* next word in 128-bit key */
#define KEY2         (volatile Uint16*)0x00000AE2   /* next word in 128-bit key */ 
#define KEY3         (volatile Uint16*)0x00000AE3   /* next word in 128-bit key */
#define KEY4         (volatile Uint16*)0x00000AE4   /* next word in 128-bit key */
#define KEY5         (volatile Uint16*)0x00000AE5   /* next word in 128-bit key */
#define KEY6         (volatile Uint16*)0x00000AE6   /* next word in 128-bit key */
#define KEY7         (volatile Uint16*)0x00000AE7   /* high word of the 128-bit key */
#define PWL0         (volatile Uint16*)0x003F7FF8   /* Password 0 */
#define PWL1         (volatile Uint16*)0x003F7FF9   /* Password 1 */
#define PWL2         (volatile Uint16*)0x003F7FFA   /* Password 2 */
#define PWL3         (volatile Uint16*)0x003F7FFB   /* Password 3 */
#define PWL4         (volatile Uint16*)0x003F7FFC   /* Password 4 */
#define PWL5         (volatile Uint16*)0x003F7FFD   /* Password 5 */
#define PWL6         (volatile Uint16*)0x003F7FFE   /* Password 6 */
#define PWL7         (volatile Uint16*)0x003F7FFF   /* Password 7 */

int CSM_unlock()
{
    volatile Uint16 temp;
    
    // Load the key registers with the current password
    EALLOW;
    *KEY0 = 0xFFFF;
    *KEY1 = 0xFFFF;
    *KEY2 = 0xFFFF;
    *KEY3 = 0xFFFF;
    *KEY4 = 0xFFFF;
    *KEY5 = 0xFFFF;
    *KEY6 = 0xFFFF;
    *KEY7 = 0xFFFF;   
    EDIS;

    // Perform a dummy read of the password locations
    // if they match the key values, the CSM will unlock     
    temp = *PWL0;
    temp = *PWL1;
    temp = *PWL2;
    temp = *PWL3;
    temp = *PWL4;
    temp = *PWL5;
    temp = *PWL6;
    temp = *PWL7;
 
    return(  ((*CSMSCR & 0x0001) == 0) ? 1:0 );
}

//---------------------------------------------------------------------------
// Configure the minimal set of pins to access populated eZdsp connectors.
// This minimal set is configured for loopback testing of SCI/CAN modules
// in the factory.
// 
// SCIB    - GPIO9,11
// CANB    - GPIO9,10
// SCIA    - GPIO28,29
// CANB    - GPIO30,31
// I2C     - GPIO32,33
// LED     - GPIO34
// 
// Other GPIO go to expansion header and can be configured as required
// by user.
//
// Other assumptions for factory test:
// SW2 1-4 ON to select on-board drivers through QS mux
// SW1 4 ON, enable I2C writes
// SW1 5 ON, enable I2C 5K pullups
// SW1 6 OFF, I2C located at addres 0b00
// 
void InitGpio()
{
	EALLOW;	
	
	// Enable SCI-B on GPIO9, GPIO11
	GpioCtrlRegs.GPAQSEL1.bit.GPIO9  = 3;  // asynch input
	GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 3;  // asynch input
	GpioCtrlRegs.GPAPUD.bit.GPIO9    = 0;  // Enable pullup on GPIO9  
	GpioCtrlRegs.GPAPUD.bit.GPIO11   = 0;  // Enable pullup on GPIO11             
	GpioCtrlRegs.GPAMUX1.bit.GPIO9   = 2;  // GPIO9 = SCITXDB
	GpioCtrlRegs.GPAMUX1.bit.GPIO11  = 2;  // GPIO11 = SCIRXDB
	
	// Enable CAN-B on GPIO8 - GPIO10   
	GpioCtrlRegs.GPAMUX1.bit.GPIO8  = 2;    // Configure GPIO8 for CANTXB operation
	GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 2;	// Configure GPIO10 for CANRXB operation
	GpioCtrlRegs.GPAPUD.bit.GPIO8   = 0;	// Enable internal pull-up for GPIO8
	GpioCtrlRegs.GPAPUD.bit.GPIO10  = 0;	// Enable internal pull-up for GPIO10
	
	// Enable SCI-A on GPIO28 - GPIO29
	GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;  // asynch input
	GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 3;  // asynch input
	GpioCtrlRegs.GPAPUD.bit.GPIO28   = 0;  // Enable pullup on GPIO28 
	GpioCtrlRegs.GPAPUD.bit.GPIO29   = 0;  // Enable pullup on GPIO29              
	GpioCtrlRegs.GPAMUX2.bit.GPIO28  = 1;  // GPIO28 = SCIRXDA
	GpioCtrlRegs.GPAMUX2.bit.GPIO29  = 1;  // GPIO29 = SCITXDA
    
	// Enable CAN-A on GPIO30 - GPIO31 
	GpioCtrlRegs.GPAPUD.bit.GPIO30    = 0;	// Enable internal pull-up for GPIO8
	GpioCtrlRegs.GPAPUD.bit.GPIO31    = 0;	// Enable internal pull-up for GPIO10
	GpioCtrlRegs.GPAQSEL2.bit.GPIO30  = 3;  // asynch input
	GpioCtrlRegs.GPAQSEL2.bit.GPIO31  = 3;  // asynch input
	GpioCtrlRegs.GPAMUX2.bit.GPIO30   = 1;	// Configure GPIO30 for CANTXA operation
	GpioCtrlRegs.GPAMUX2.bit.GPIO31   = 1;	// Configure GPIO31 for CANRXA operation

	
	// Enable I2C-A on GPIO32 - GPIO33
	GpioCtrlRegs.GPBMUX1.bit.GPIO32  = 1; // GPIO32 = SDAA   
	GpioCtrlRegs.GPBMUX1.bit.GPIO33  = 1; // GPIO33 = SCLA
	
	// Make GPIO34 an output
	GpioCtrlRegs.GPBPUD.bit.GPIO34   = 0; // Enable pullup on GPIO34   
	GpioCtrlRegs.GPBMUX1.bit.GPIO34  = 0; // GPIO34 = GPIO34
	GpioCtrlRegs.GPBDIR.bit.GPIO34   = 1; // GPIO34 = output   
	
    EDIS;    	  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -