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

📄 lpc2000_can_sys.c

📁 飞利浦LPC2000系列CAN控制器驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//Fpclk = Fcclk/2 = 48MHz/2 = 24MHz
//-----------------------------------------------  
  T1PR = 0;				// Disable prescaler
  T1MCR = 0x03;			// Using T1MR0 match T1TC,Enable interrupt,reset T1TC
  T1MR0 = Fpclk/100;	// 10ms each Timer interrupt
  T1TCR = 0x02;			// Reset T1TC, by set TCR:2
  T1TCR = 0x01;			// Must CLR TCR:2, then can Start T1TC


//-----------------------------------------------
//Config UART0
//-----------------------------------------------  
  Uart0_Config.Datalength = 8;
  Uart0_Config.Stopbit = 1;
  Uart0_Config.Paritybit = 0;
  uart0_config(9600,Uart0_Config);
  
  U0IER = 0x01;		// Enable Rx interrupt

//-----------------------------------------------
//Config CAN1,CAN2
//-----------------------------------------------  
  lpc2000CANdriver_CANInit( LPC2000_CANCHANNEL_1, LPC2000_CANDRIVER_CANBITRATE100K24MHZ );
  lpc2000CANdriver_CANInit( LPC2000_CANCHANNEL_2, LPC2000_CANDRIVER_CANBITRATE100K24MHZ );

  lpc2000CANdriver_SetACFMode( LPC2000_ACC_BYPASS );
  lpc2000CANdriver_LoadAcceptanceFilter ();

  CAN2IER = 0x000007FF;  //Enable all CAN2 interrupt


//-----------------------------------------------
//Config VIC, 
//In <Starup.s> enable IRQ by CLR I bit in CPSR
//Vectored interrupt Timer1 by slot-0
//Vectored interrupt UART0 by slot-1
//Vectored interrupt CAN2Rx by slot-2
//-----------------------------------------------  
  
  VICIntSelect = 0x00000000;			// All interrupt be IRQ
  VICVectCntl0 = 0x20|5;				// Assign Timer1 to IRQ Slot0
  VICVectAddr0 = (UInt32)IRQ_Timer1; 	// Assign IRQ Address for IRQ_Timer1
  VICVectCntl1 = 0x20|6;				// Assign UART0 to IRQ slot1
  VICVectAddr1 = (UInt32)IRQ_UART0; 	// Assign IRQ Address for IRQ_UART0  
  VICVectCntl2 = 0x20|27;				// Assign CAN2Rx to IRQ Slot2
  VICVectAddr2 = (UInt32)IRQ_CAN2Rx; 	// Assign IRQ Address for IRQ_CAN2Rx
  
  VICIntEnable = (1<<5)|(1<<6)|(1<<27);	// Enable Timer1+UART0+CAN2Rx interrupt

}

/****************************************************************************
* Name: Delay()
* Function: Delay 
* Input(s): delaytime		30 about 0.5s
* Returns : none
****************************************************************************/
void  delay(UInt32  delaytime)
{  UInt32  i;

   for(; delaytime>0; delaytime--) 
      for(i=0; i<50000; i++);
}

/****************************************************************************
* Name: uart0_config(UInt32,UART0MODE)
* Function: UART0 config 
* Input(s): Baudrate
*           U0_config
* Returns : none
****************************************************************************/
void uart0_config(UInt32 Baudrate,UART0MODE U0_config)
{
  UInt32 temp_uart0;
  
//-------------------------
// UART0 Baudrate config
//-------------------------
  U0LCR = 0x80;			// DLAB=1, Can use U0DLM, U0DLL 
  temp_uart0 = (Fpclk/16)/Baudrate;
  
  U0DLM = temp_uart0>>8;
  U0DLL = temp_uart0&0xFF;
  
//-------------------------
// UART0 mode config
//------------------------- 
  temp_uart0 = U0_config.Datalength - 5;				// Data Length prepare
  
  if( U0_config.Stopbit == 2 ) temp_uart0 |= 0x04;		// Data Stop bit prepare
  
  if( U0_config.Paritybit != 0 )						// Data Parity bit prepare
    {
      U0_config.Paritybit = U0_config.Paritybit - 1;
      temp_uart0 |= 0x08;
    }
  temp_uart0 |= U0_config.Paritybit<<4;
  
  
  U0LCR = temp_uart0; 	// Data Length, Stop bit, Parity bit  setup 
}

/****************************************************************************
* Name: IRQ_Timer1()
* Function: Timer1 interrupt function, inverse LED4(P0.25)
* Input(s): none
* Returns : none
****************************************************************************/
void __irq  IRQ_Timer1(void)
{  
  
  LED_Counter++;

  if( LED_Counter == 50)		// 10ms*50=0.5s led inverse
    {
      if( LED_Flag == 0) LED_Flag = 1;
      else LED_Flag = 0;
  
      LED_Counter = 0;
    }
             
   T1IR = 0x01;	    			// CLR Timer1 interrupt flag
   VICVectAddr = 0x00;			// Inform VIC interrupt is end
}


/****************************************************************************
* Name: IRQ_UART0()
* Function: UART0 interrupt
* Input(s): none
* Returns : none
****************************************************************************/
void   __irq IRQ_UART0(void)
{  
  UInt32 Temp_UART0_IRQ;
  
  if( (U0IIR & 0x0F) == 0x04 )
    {
      Temp_UART0_IRQ = U0RBR - 48;
	  switch( Temp_UART0_IRQ )
	  {
        case 1:
		  	System_Status = 1;   // indicate CAN simple communication
		    break;
		case 2:
		    System_Status = 2;   // indicate CAN communication with ACC
			break;
		case 41:                 // receive "Y"
		case 73:				 // receive "y"
		    if( System_Status == 3) System_Status = 5;
			break;
		case 30:				 // receive "N"
		case 62:				 // receive "n"
			if( System_Status == 3 ) System_Status = 7;
			break;
	  	case 49:		         // when receive "a", reverse LED2
            Temp_UART0_IRQ = IO1SET;
            if( (Temp_UART0_IRQ & LED1CON) == 0 )
              {  
                IO1SET = LED1CON;
              }
            else
              {  
                IO1CLR = LED1CON;
              }
		  	break;
	  	case 50:		// when receive "b", reverse LED1	  	
		  	Temp_UART0_IRQ = IO1SET;
            if( (Temp_UART0_IRQ & LED2CON) == 0 )
              {  
                IO1SET = LED2CON;
              }
            else
              {  
                IO1CLR = LED2CON;
              }              
		  	break;
 		default:
			break;
      }      
    }
  
  
  Temp_UART0_IRQ = U0RBR;		//clear UART0-Rx interrupt flag, when U0IIR != 04,
  VICVectAddr = 0x00;
}


/****************************************************************************
* Name: IRQ_CAN2Rx()
* Function: IRQ_CAN2Rx interrupt
* Input(s): none
* Returns : none
****************************************************************************/
void   __irq IRQ_CAN2Rx(void)
{
  UInt32  Temp_CAN2Rx_IRQ=0;
  UInt8   i=0;
  plpc2000CANdriver_RXObj_t pCAN2_Rcv_Data_IRQ;


  i = 0;
  CAN2Rx_Return_Message_Flag[i] = 1;  //indicate one Rx interrupt happened
  i++;

  Temp_CAN2Rx_IRQ = CAN2ICR;

  if( (Temp_CAN2Rx_IRQ & 0x00000001) == 0x00000001 )
    {
	  // put Rcv data to Rcv-Buffer, must assign value to pointer before used
	  pCAN2_Rcv_Data_IRQ = CAN_Rcv_Data + CAN_Rcv_Data_Counter;
      Return_Value = lpc2000CANdriver_ReceiveMessageCh2 (pCAN2_Rcv_Data_IRQ);
	  CAN_Rcv_Data_Counter++;
	  
	  CAN_Rcv_Status = 1;  	   // communication successful
	}

  if( ((Temp_CAN2Rx_IRQ>>2) & 0x00000001) == 0x00000001 )
    {
	  CAN2Rx_Return_Message_Flag[i] = 1;
	  //Add code for "Error Warning Interrupt-EI"	  
	}
	  i++;

  if( ((Temp_CAN2Rx_IRQ>>3) & 0x00000001) == 0x00000001 )
    {
	  CAN2Rx_Return_Message_Flag[i] = 1;
	  //Add code for "Data Overrun Interrupt-DOI"	  
	}
  i++;

  if( ((Temp_CAN2Rx_IRQ>>4) & 0x00000001) == 0x00000001 )
    {
	  CAN2Rx_Return_Message_Flag[i] = 1;
	  //Add code for "Wake-Up Interrupt-WUI"	  
	}
  i++;

  if( ((Temp_CAN2Rx_IRQ>>5) & 0x00000001) == 0x00000001 )
    {
	  CAN2Rx_Return_Message_Flag[i] = 1;
	  //Add code for "Error Passive Interrupt-EPI"	  
	}
  i++;

  if( ((Temp_CAN2Rx_IRQ>>6) & 0x00000001) == 0x00000001 )
    {
	  CAN2Rx_Return_Message_Flag[i] = 1;
	  //Add code for "Arbitration Lost Interrupt-ALI"	  
	}
  i++;

  if( ((Temp_CAN2Rx_IRQ>>7) & 0x00000001) == 0x00000001 )
    {
	  CAN2Rx_Return_Message_Flag[i] = 1;
	  //Add code for "Bus Error Interrupt-BEI"	  
	}
  i++;

  if( ((Temp_CAN2Rx_IRQ>>8) & 0x00000001) == 0x00000001 )
    {

	  //Add code for "ID Ready Interrupt-IDI"	  
	}


  VICVectAddr = 0x00;
  
}

⌨️ 快捷键说明

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