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

📄 can.h

📁 经过改进之后的CAN-USB接口卡固件程序
💻 H
字号:
//CAN0接收中断
__interrupt void CAN0_Receive(void)
{
	UINT i = 0;           
    
    static uchar led_count = 0;
    
    Recv_Over_Flag[0] = 0;
    
    led_count++;
	if(led_count < 50)
		CAN0_RX_LED_ON;
	else if(led_count < 100)
	{		
		CAN0_RX_LED_OFF;
	}
	else
		led_count = 0;
	
    
    if(Recv_index[USB_Packet_Use_flag] >= CAN_RECV_BUF_LENGTH-1)//没有空闲的缓冲区 ( 注意:必须是CAN_RECV_BUF_LENGTH-1 !!!!)
    {
    	CAN0RFLG_RXF = 1;//接收完毕,写1清除中断位   
    	Recv_buffer_overflow++; 
    	Recv_Over_Flag[0] = 1;	
		return;
    }
    else
    	Recv_index[USB_Packet_Use_flag]++;
    	
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.CAN_frame_num++;
    
    //装载接收的CAN数据帧
//-----------------------------------------------------------
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].time = CAN_REV_COUNT++;//时间标志
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].channel = 1;//接收通道
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Recv_buffer_overflow_status = Recv_buffer_overflow;
//-----------------------------------------------------------
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ExternFlag = CAN0RXIDR1_IDE;
    if(CAN0RXIDR1_IDE == 1)    
		USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].RemoteFlag = CAN0RXIDR3_RTR;
    else
    	USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].RemoteFlag = CAN0RXIDR1_SRR;

	USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[0] = CAN0RXDSR0;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[1] = CAN0RXDSR1;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[2] = CAN0RXDSR2;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[3] = CAN0RXDSR3;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[4] = CAN0RXDSR4;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[5] = CAN0RXDSR5;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[6] = CAN0RXDSR6;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[7] = CAN0RXDSR7;
    
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].DataLen = 0x0F & CAN0RXDLR;
    
    if(USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ExternFlag == 1)
    {
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID = ( CAN0RXIDR3 & 0xFE)>>1;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN0RXIDR2 ))<<7;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN0RXIDR1 & 0x07))<<15;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN0RXIDR1 & 0xE0))<<13;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN0RXIDR0 ))<<21; 
    }
    else
    {
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID = ( CAN0RXIDR1 & 0xE0)>>5;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN0RXIDR0 ))<<3;
    }      
//-----------------------------------------------------------


    CAN0RFLG_RXF = 1;//接收完毕,写1清除中断位    	
	
	Recv_Over_Flag[0] = 1;
	
    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;	
    
    //获得可用的发送缓冲区编号,取编号值最小的缓冲区
    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;   
}


//CAN1接收中断
__interrupt void CAN1_Receive(void)
{
	UINT i = 0;           
    
    static uchar led_count = 0;
    
    Recv_Over_Flag[1] = 0;
    
    led_count++;
	if(led_count < 50)
		CAN1_RX_LED_ON;
	else if(led_count < 100)
	{		
		CAN1_RX_LED_OFF;
	}
	else
		led_count = 0;
	
    
    if(Recv_index[USB_Packet_Use_flag] >= CAN_RECV_BUF_LENGTH-1)//没有空闲的缓冲区 ( 注意:必须是CAN_RECV_BUF_LENGTH-1 !!!!)
    {
    	CAN0RFLG_RXF = 1;//接收完毕,写1清除中断位   
    	Recv_buffer_overflow++; 
    	Recv_Over_Flag[1] = 1;	
		return;
    }
    else
    	Recv_index[USB_Packet_Use_flag]++;
    	
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.CAN_frame_num++;
    
    //装载接收的CAN数据帧
//-----------------------------------------------------------
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].time = CAN_REV_COUNT++;//时间标志
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].channel = 1;//接收通道
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Recv_buffer_overflow_status = Recv_buffer_overflow;
//-----------------------------------------------------------
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ExternFlag = CAN1RXIDR1_IDE;
    if(CAN1RXIDR1_IDE == 1)    
		USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].RemoteFlag = CAN1RXIDR3_RTR;
    else
    	USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].RemoteFlag = CAN1RXIDR1_SRR;

	USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[0] = CAN1RXDSR0;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[1] = CAN1RXDSR1;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[2] = CAN1RXDSR2;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[3] = CAN1RXDSR3;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[4] = CAN1RXDSR4;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[5] = CAN1RXDSR5;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[6] = CAN1RXDSR6;
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].Data[7] = CAN1RXDSR7;
    
    USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].DataLen = 0x0F & CAN1RXDLR;
    
    if(USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ExternFlag == 1)
    {
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID = ( CAN1RXIDR3 & 0xFE)>>1;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN1RXIDR2 ))<<7;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN1RXIDR1 & 0x07))<<15;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN1RXIDR1 & 0xE0))<<13;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN1RXIDR0 ))<<21; 
    }
    else
    {
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID = ( CAN1RXIDR1 & 0xE0)>>5;
        USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].ID += ((unsigned long)( CAN1RXIDR0 ))<<3;
    }      
//-----------------------------------------------------------


    CAN1RFLG_RXF = 1;//接收完毕,写1清除中断位    	
	
	Recv_Over_Flag[1] = 1;
	
    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;	
    
    //获得可用的发送缓冲区编号,取编号值最小的缓冲区
    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;   
}

⌨️ 快捷键说明

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