www.pudn.com > CAN_USB.rar > CAN.h


//CAN0接收中断 
__interrupt void CAN0_Receive(void) 
{ 
	UINT Recv_index = 0; 
	UINT i = 0;            
     
    static uchar led_count = 0; 
	led_count++; 
	if(led_count < 50) 
		CAN0_RX_LED_ON; 
	else if(led_count < 100) 
	{		 
		CAN0_RX_LED_OFF; 
	} 
	else 
		led_count = 0; 
	 
    DisableInterrupts;//中断使能 
     
    for(Recv_index=0;Recv_index>1; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR2 ))<<7; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR1 & 0x07))<<15; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR1 & 0xE0))<<13; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR0 ))<<21;  
    } 
    else 
    { 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID = ( CAN0RXIDR1 & 0xE0)>>5; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR0 ))<<3; 
    }       
//----------------------------------------------------------- 
 
 
    CAN0RFLG_RXF = 1;//接收完毕,写1清除中断位    	 
	 
	EnableInterrupts;//中断使能 
	 
    return; 
} 
 
 
 
//CAN0发送中断 
__interrupt void CAN0_Transmit(void) 
{     
	static uchar led_count = 0; 
	led_count++; 
	if(led_count < 50) 
		CAN0_TX_LED_ON; 
	else if(led_count < 100) 
	{		 
		CAN0_TX_LED_OFF; 
	} 
	else 
		led_count = 0; 
	 
    //发送中断禁止 
    CAN0TIER = 0x00;	 
	 
    //中断屏蔽 
    asm 
    { 
        sei; 
    } 
     
    //获得可用的发送缓冲区编号,取编号值最小的缓冲区 
    CAN0TBSEL = CAN0TFLG; 
   
    if( SendFrame.ExternFlag == 1 ) 
    { 
        CAN0TXIDR3 = (SendFrame.ID & 0x0000007F)<<1; 
        CAN0TXIDR2 = (SendFrame.ID & 0x00007F80)>>7; 
        CAN0TXIDR1 = (SendFrame.ID & 0x00038000)>>15; 
        CAN0TXIDR1+= (SendFrame.ID & 0x001C0000)>>13; 
        CAN0TXIDR0 = (SendFrame.ID & 0x1FE00000)>>21; 
        CAN0TXIDR1_IDE = 1; 
        CAN0TXIDR1_SRR = 1; 
        if( SendFrame.RemoteFlag == 1 ) 
        { 
            CAN0TXIDR3_RTR = 1; 
        } 
        else 
        {     
            CAN0TXIDR3_RTR = 0; 
            CAN0TXDSR0 = SendFrame.Data[0]; 
            CAN0TXDSR1 = SendFrame.Data[1]; 
            CAN0TXDSR2 = SendFrame.Data[2]; 
            CAN0TXDSR3 = SendFrame.Data[3]; 
            CAN0TXDSR4 = SendFrame.Data[4]; 
            CAN0TXDSR5 = SendFrame.Data[5]; 
            CAN0TXDSR6 = SendFrame.Data[6]; 
            CAN0TXDSR7 = SendFrame.Data[7]; 
            CAN0TXDLR  = SendFrame.DataLen; 
        } 
    } 
    else 
    { 
        CAN0TXIDR1 = (SendFrame.ID & 0x0007)<<5; 
        CAN0TXIDR0 = (SendFrame.ID & 0x01F8)>>3; 
        CAN0TXIDR1_IDE = 0; 
        if( SendFrame.RemoteFlag == 1 ) 
        { 
            CAN0TXIDR1_SRR = 1; 
        } 
        else 
        { 
            CAN0TXIDR1_SRR = 0; 
            CAN0TXDSR0 = SendFrame.Data[0]; 
            CAN0TXDSR1 = SendFrame.Data[1]; 
            CAN0TXDSR2 = SendFrame.Data[2]; 
            CAN0TXDSR3 = SendFrame.Data[3]; 
            CAN0TXDSR4 = SendFrame.Data[4]; 
            CAN0TXDSR5 = SendFrame.Data[5]; 
            CAN0TXDSR6 = SendFrame.Data[6]; 
            CAN0TXDSR7 = SendFrame.Data[7]; 
            CAN0TXDLR  = SendFrame.DataLen; 
        } 
    } 
//-------------------------------------------------------------------------- 
//   将发送缓冲区选择寄存器赋值给发送缓冲区标志寄存器 
//   将自动将该缓冲区内的数据加入发送队列发送 
//--------------------------------------------------------------------------       
    CAN0TFLG = CAN0TBSEL;    
	 
    //清除中断屏蔽 
    asm 
    { 
        cli; 
    } 
 
    //中断返回 
    asm 
    { 
        rti; 
    } 
} 
 
 
//CAN1接收中断 
__interrupt void CAN1_Receive(void) 
{ 
	UINT Recv_index = 0; 
	UINT i = 0;            
     
    static uchar led_count = 0; 
    led_count++; 
	if(led_count < 50) 
		CAN1_RX_LED_ON; 
	else if(led_count < 100) 
	{		 
		CAN1_RX_LED_OFF; 
	} 
	else 
		led_count = 0; 
	 
    DisableInterrupts;//中断使能 
     
    for(Recv_index=0;Recv_index>1; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN1RXIDR2 ))<<7; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN1RXIDR1 & 0x07))<<15; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN1RXIDR1 & 0xE0))<<13; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN1RXIDR0 ))<<21;  
    } 
    else 
    { 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID = ( CAN1RXIDR1 & 0xE0)>>5; 
        USB_Packet.USB_Packet_struct.Recv_Frame[Recv_index].ID += ((unsigned long)( CAN1RXIDR0 ))<<3; 
    }       
//----------------------------------------------------------- 
 
 
    CAN1RFLG_RXF = 1;//接收完毕,写1清除中断位    	 
	 
	EnableInterrupts;//中断使能 
	 
    return; 
} 
 
 
 
//CAN1发送中断 
__interrupt void CAN1_Transmit(void) 
{     
	static uchar led_count = 0; 
	led_count++; 
	if(led_count < 50) 
		CAN1_TX_LED_ON; 
	else if(led_count < 100) 
	{ 
		CAN1_TX_LED_OFF; 
	} 
	else 
		led_count = 0; 
	 
    //发送中断禁止 
    CAN1TIER = 0x00;	 
	 
    //中断屏蔽 
    asm 
    { 
        sei; 
    } 
     
    //获得可用的发送缓冲区编号,取编号值最小的缓冲区 
    CAN1TBSEL = CAN1TFLG; 
   
    if( SendFrame.ExternFlag == 1 ) 
    { 
        CAN1TXIDR3 = (SendFrame.ID & 0x0000007F)<<1; 
        CAN1TXIDR2 = (SendFrame.ID & 0x00007F80)>>7; 
        CAN1TXIDR1 = (SendFrame.ID & 0x00038000)>>15; 
        CAN1TXIDR1+= (SendFrame.ID & 0x001C0000)>>13; 
        CAN1TXIDR0 = (SendFrame.ID & 0x1FE00000)>>21; 
        CAN1TXIDR1_IDE = 1; 
        CAN1TXIDR1_SRR = 1; 
        if( SendFrame.RemoteFlag == 1 ) 
        { 
            CAN1TXIDR3_RTR = 1; 
        } 
        else 
        {     
            CAN1TXIDR3_RTR = 0; 
            CAN1TXDSR0 = SendFrame.Data[0]; 
            CAN1TXDSR1 = SendFrame.Data[1]; 
            CAN1TXDSR2 = SendFrame.Data[2]; 
            CAN1TXDSR3 = SendFrame.Data[3]; 
            CAN1TXDSR4 = SendFrame.Data[4]; 
            CAN1TXDSR5 = SendFrame.Data[5]; 
            CAN1TXDSR6 = SendFrame.Data[6]; 
            CAN1TXDSR7 = SendFrame.Data[7]; 
            CAN1TXDLR  = SendFrame.DataLen; 
        } 
    } 
    else 
    { 
        CAN1TXIDR1 = (SendFrame.ID & 0x0007)<<5; 
        CAN1TXIDR0 = (SendFrame.ID & 0x01F8)>>3; 
        CAN1TXIDR1_IDE = 0; 
        if( SendFrame.RemoteFlag == 1 ) 
        { 
            CAN1TXIDR1_SRR = 1; 
        } 
        else 
        { 
            CAN1TXIDR1_SRR = 0; 
            CAN1TXDSR0 = SendFrame.Data[0]; 
            CAN1TXDSR1 = SendFrame.Data[1]; 
            CAN1TXDSR2 = SendFrame.Data[2]; 
            CAN1TXDSR3 = SendFrame.Data[3]; 
            CAN1TXDSR4 = SendFrame.Data[4]; 
            CAN1TXDSR5 = SendFrame.Data[5]; 
            CAN1TXDSR6 = SendFrame.Data[6]; 
            CAN1TXDSR7 = SendFrame.Data[7]; 
            CAN1TXDLR  = SendFrame.DataLen; 
        } 
    } 
//-------------------------------------------------------------------------- 
//   将发送缓冲区选择寄存器赋值给发送缓冲区标志寄存器 
//   将自动将该缓冲区内的数据加入发送队列发送 
//--------------------------------------------------------------------------       
    CAN1TFLG = CAN1TBSEL;    
	 
    //清除中断屏蔽 
    asm 
    { 
        cli; 
    } 
 
    //中断返回 
    asm 
    { 
        rti; 
    } 
}