📄 lpc2000_can_sys.c
字号:
//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 + -