📄 can.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 + -