?? can.h
字號(hào):
//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)//沒(méi)有空閑的緩沖區(qū) ( 注意:必須是CAN_RECV_BUF_LENGTH-1 !!!!)
{
CAN0RFLG_RXF = 1;//接收完畢,寫(xiě)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數(shù)據(jù)幀
//-----------------------------------------------------------
USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].time = CAN_REV_COUNT++;//時(shí)間標(biāo)志
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;//接收完畢,寫(xiě)1清除中斷位
Recv_Over_Flag[0] = 1;
return;
}
//CAN0發(fā)送中斷
__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;
//發(fā)送中斷禁止
CAN0TIER = 0x00;
//獲得可用的發(fā)送緩沖區(qū)編號(hào),取編號(hào)值最小的緩沖區(qū)
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;
}
}
//--------------------------------------------------------------------------
// 將發(fā)送緩沖區(qū)選擇寄存器賦值給發(fā)送緩沖區(qū)標(biāo)志寄存器
// 將自動(dòng)將該緩沖區(qū)內(nèi)的數(shù)據(jù)加入發(fā)送隊(duì)列發(fā)送
//--------------------------------------------------------------------------
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)//沒(méi)有空閑的緩沖區(qū) ( 注意:必須是CAN_RECV_BUF_LENGTH-1 !!!!)
{
CAN0RFLG_RXF = 1;//接收完畢,寫(xiě)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數(shù)據(jù)幀
//-----------------------------------------------------------
USB_Packet[USB_Packet_Use_flag].USB_Packet_struct.Recv_Frame[Recv_index[USB_Packet_Use_flag]].time = CAN_REV_COUNT++;//時(shí)間標(biāo)志
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;//接收完畢,寫(xiě)1清除中斷位
Recv_Over_Flag[1] = 1;
return;
}
//CAN1發(fā)送中斷
__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;
//發(fā)送中斷禁止
CAN1TIER = 0x00;
//獲得可用的發(fā)送緩沖區(qū)編號(hào),取編號(hào)值最小的緩沖區(qū)
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;
}
}
//--------------------------------------------------------------------------
// 將發(fā)送緩沖區(qū)選擇寄存器賦值給發(fā)送緩沖區(qū)標(biāo)志寄存器
// 將自動(dòng)將該緩沖區(qū)內(nèi)的數(shù)據(jù)加入發(fā)送隊(duì)列發(fā)送
//--------------------------------------------------------------------------
CAN1TFLG = CAN1TBSEL;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -