?? can.c
字號:
#include "main.h"
//#pragma interrupt_handler can_ReceiveData:19
/*******************************************************************
CAN initialization:
Mailbox 0: Receive --> interrupt
Mailbox 1: Transmit --> polling
*******************************************************************/
#define TYP_RESET 5
#define TYP_BAUD 10
#define SELFID 2
extern unsigned char sysrst,Pass_Flag;
unsigned char canbaud;
extern VCI_CAN_OBJ rece_data[20];
extern unsigned char soundoff_flag,ack_flag,alarm_flag;
const unsigned char CanBaud[6][3]={{0x02,0x04,0x13},{0x06,0x04,0x13},{0x0E,0x04,0x13},{0x12,0x04,0x13},{0x1E,0x04,0x13},{0x26,0x04,0x13}};
//波特率數組
//15個MOB的ID和MID
unsigned long CANMOBID[15]={0x10000000,0x20000000,0x30000000,0x40000000,0x50000000,0x60000000,0x01000000,0x01000001,0x0200ff00,0x12000001,0x01000002,0x01000003,0x01000004,0x01000005,0x1300ff01};
unsigned long CANMOBMD[15]={0x00ff000f,0x00ff000f,0x00ff000f,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff};
unsigned char CANIDT[15][4]={0};
unsigned char CANIDM[15][4]={0};
unsigned char counterTemp;
extern unsigned char send_count;
extern SHD_LED pannel_led[48];
extern unsigned char soundoff[48];
void can_init (void) //CAN初始化函數
{
canMob_init();
}
void canMob_init (void) //MOB初始化函數
{
unsigned char i,j;
unsigned long temp;
unsigned int temp1,temp2;
CLI(); //關中斷
//DDRD=(1<<PD5)|(0<<PD6); //TXCAN, RXCNA
DDRD|=0x20; //CAN管腳初始化
DDRD&=0xBF;
CANGCON |= (1<<SWRES); //reset CAN interface
Pass_Flag = 0x00;
//CANMOBID[2]=(unsigned long)(SELFID<<8)|CANMOBID[2];
for(i=0;i<6;i++) //15個郵箱初始化
{
temp=CANMOBID[i]<<3; //ID初始化
temp1=(unsigned int)temp;
temp2=(unsigned int)(temp/0x00010000);
CANIDT[i][3]=(unsigned char)temp1;
CANIDT[i][2]=(unsigned char)(temp1>>8);
CANIDT[i][1]=(unsigned char)temp2;
CANIDT[i][0]=(unsigned char)(temp2>>8);
Pass_Flag = Pass_Flag + 1;
NOP();
}
if(Pass_Flag!=0x06)
RESET;
WDR();
Pass_Flag = 0x00;
for(i=0;i<6;i++)
{
temp=CANMOBMD[i]<<3;
temp1=(unsigned int)temp; //低16位
temp2=(unsigned int)(temp/0x00010000); //高16位
CANIDM[i][3]=(unsigned char)temp1;
CANIDM[i][2]=(unsigned char)(temp1>>8);
CANIDM[i][1]=(unsigned char)temp2;
CANIDM[i][0]=(unsigned char)(temp2>>8);
Pass_Flag = Pass_Flag + 1;
NOP();
}
if(Pass_Flag!=0x06)
RESET;
//reset all MObs
Pass_Flag = 0x00;
for (i=0; i<15; i++)
{
CANPAGE = (i<<4); //select MOb
CANCDMOB = 0; //disable MOb
CANSTMOB = 0; //clear status
CANIDT1 = 0; //clear ID
CANIDT2 = 0;
CANIDT3 = 0;
CANIDT4 = 0;
CANIDM1 = 0; //clear mask
CANIDM2 = 0;
CANIDM3 = 0;
CANIDM4 = 0;
for (j=0; j<8; j++)
CANMSG = 0; //clear data
Pass_Flag = Pass_Flag + 1;
}
if(Pass_Flag!=0x0f)
RESET;
WDR();
CANBT1 = CanBaud[2][0];
CANBT2 = CanBaud[2][1];
CANBT3 = CanBaud[2][2];
//configure MObi
/******************************************************************/
Pass_Flag = 0x00;
for (i=0; i<3; i++)
{
CANPAGE = (i<<4); //MOb 0,1,2設置為接收模式模式
CANIDT1 = CANIDT[i][0]; //初始化 ID
CANIDT2 = CANIDT[i][1];
CANIDT3 = CANIDT[i][2];
CANIDT4 = CANIDT[i][3];
CANIDM1 = CANIDM[i][0]; //初始化 mask
CANIDM2 = CANIDM[i][1];
CANIDM3 = CANIDM[i][2];
CANIDM4 = CANIDM[i][3]; //0 = ignore bit
//CANIDM4 = (1<<IDEMSK); //identifier extention mask
CANCDMOB = (2<<CONMOB0)|(1<<IDE)|(8<<DLC0); //reception, ext. ID,rev2.0B
NOP();
Pass_Flag = Pass_Flag + 1;
}
if(Pass_Flag!=0x03)
RESET;
WDR();
Pass_Flag = 0x00;
for(i=3;i<6;i++)
{
CANPAGE = (i<<4); //MOb3,4,5設置為發送模式
CANIDT1 = CANIDT[i][0]; //初始化 ID
CANIDT2 = CANIDT[i][1];
CANIDT3 = CANIDT[i][2];
CANIDT4 = CANIDT[i][3];
CANIDM1 = CANIDM[i][0]; //初始化 mask
CANIDM2 = CANIDM[i][1];
CANIDM3 = CANIDM[i][2];
CANIDM4 = CANIDM[i][3]; //0 = ignore bit
CANCDMOB = (1<<IDE)|(8<<DLC0);
NOP();
Pass_Flag = Pass_Flag + 1;
}
if(Pass_Flag!=0x03)
RESET;
CANGCON = (1<<ENASTB); //start CAN interface, enable mod
CANGIE = (1<<ENIT)| (1<<ENRX)|(1<<ENTX); //enable receive interrupt and transmitte interrupt
CANIE1 = 0x00;
CANIE2 = 0x3f; //enable ALL MObs interrupt
WDR();
while (!(CANGSTA & (1<<ENFG))); //wait until module ready
CANGCON |= (1<<ENA); //enable CAN controller
SEI();
}
/*******************************************************************
CAN transmission via mailbox 1 (polling)
*******************************************************************/
void can_tx (VCI_CAN_OBJ msg)
{
unsigned char i,index,pass_Flag;
long temp_id;
pass_Flag = 0x01;
pass_Flag <<= 1;
msg.ID <<= 3;
temp_id = msg.ID&0x0f000000 ;
index =( unsigned char )(temp_id>>24);
index = index + 3;
CANPAGE = (index<<4);
CANCDMOB = (1<<IDE) |(8<<DLC0);
pass_Flag <<= 1;
CANIDT4 = (unsigned char) (msg.ID&0xF8);
CANIDT3 = (unsigned char) (msg.ID>>8);
CANIDT2 = (unsigned char) (msg.ID>>16);
pass_Flag <<= 1;
CANIDT1 = (unsigned char) (msg.ID>>24);
if(pass_Flag!=0x08)
RESET;
for(i=0;i<8;i++)
{
CANMSG = msg.Data[i];
}
CANCDMOB |= (1<<CONMOB0); //enable transmission
}
#pragma interrupt_handler can_ReceiveData:19
void can_ReceiveData (void) //receive interrupt
{
unsigned char nb_data;
unsigned char i,err_temp,sta_temp;
unsigned int RCtemp2,tempp,RCF;
long id_temp;
VCI_CAN_OBJ msg[3];
WDR();
CANGIE &= ~((1<<ENRX)|(1<<ENTX)); //關接收中斷
RCtemp2=CANSIT2; //讀取中斷信息
err_temp = CANTEC; //讀取發送錯誤計數器
if(err_temp>96)
RESET;
err_temp = CANREC; //讀取接收錯誤計數器
if(err_temp>128)
RESET;
if(RCtemp2&(0x38))
{
for(i=3;i<6;i++) //查詢前三個郵箱中斷狀態
{
tempp=(1<<i);
RCF=(RCtemp2&tempp);
if(RCF!=0)
{
CANPAGE = i<<4;
sta_temp = CANSTMOB;
if(sta_temp&0x40) //是發送完成中斷
{
send_count = 0; //清發送計數器
if(LED)
send_led_on;
else
send_led_off ;
WDR();
}
}
}
}
else if(RCtemp2&(0x07))
{
for(i=0;i<3;i++) //判斷哪個郵箱產生接收中斷
{
tempp=(1<<i);
RCF=(RCtemp2&tempp);
if(RCF!=0)
{
if(LED)
rece_led_on;
else
rece_led_off;
CANPAGE = i<<4;
WDR();
id_temp = 0;
id_temp |= ((unsigned long) CANIDT1<<24); //get identifier
id_temp |= ((unsigned long) CANIDT2<<16);
id_temp |= ((unsigned long) CANIDT3<<8);
id_temp |= (CANIDT4&0xF8);
id_temp >>= 3;
WDR();
switch(id_temp)
{
case 0x280000 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[0].Data[nb_data]=CANMSG;
}
WDR();
rece_data[0].ID= 0x280000;
break;
}
case 0x280001 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[1].Data[nb_data]=CANMSG;
}
WDR();
rece_data[1].ID= 0x280001;
break;
}
case 0x280002 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[2].Data[nb_data]=CANMSG;
}
WDR();
rece_data[2].ID= 0x280002;
break;
}
case 0x280100 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[3].Data[nb_data]=CANMSG;
}
WDR();
rece_data[3].ID= 0x280100;
break;
}
case 0x280101 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[4].Data[nb_data]=CANMSG;
}
WDR();
rece_data[4].ID= 0x280101;
break;
}
case 0x280200 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[5].Data[nb_data]=CANMSG;
}
WDR();
rece_data[5].ID= 0x280200;
break;
}
case 0x280201 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[6].Data[nb_data]=CANMSG;
}
WDR();
rece_data[6].ID= 0x280201;
break;
}
case 0x280300 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[7].Data[nb_data]=CANMSG;
}
WDR();
rece_data[7].ID= 0x280300;
break;
}
case 0x280301 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[8].Data[nb_data]=CANMSG;
}
WDR();
rece_data[8].ID= 0x280301;
break;
}
case 0x280400 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[9].Data[nb_data]=CANMSG;
}
WDR();
rece_data[9].ID= 0x280400;
break;
}
case 0x280401 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[10].Data[nb_data]=CANMSG;
}
WDR();
rece_data[10].ID= 0x280401;
break;
}
case 0x280500 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[11].Data[nb_data]=CANMSG;
}
WDR();
rece_data[11].ID= 0x280500;
break;
}
case 0x280501 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[12].Data[nb_data]=CANMSG;
}
WDR();
rece_data[12].ID= 0x280501;
break;
}
case 0x280600 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[13].Data[nb_data]=CANMSG;
}
WDR();
rece_data[13].ID= 0x280600;
break;
}
case 0x280601 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[14].Data[nb_data]=CANMSG;
}
WDR();
rece_data[14].ID= 0x280601;
break;
}
case 0x280602 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[15].Data[nb_data]=CANMSG;
}
WDR();
rece_data[15].ID= 0x280602;
break;
}
case 0x280700 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[16].Data[nb_data]=CANMSG;
}
WDR();
rece_data[16].ID= 0x280700;
break;
}
case 0x280701 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[17].Data[nb_data]=CANMSG;
}
WDR();
rece_data[17].ID= 0x280701;
break;
}
case 0x280702 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[18].Data[nb_data]=CANMSG;
}
WDR();
rece_data[18].ID= 0x280702;
break;
}
case 0x8282801 :{
for (nb_data = 0; nb_data <8; nb_data++)
{
rece_data[19].Data[nb_data]=CANMSG;
}
WDR();
if(rece_data[19].Data[0]==0x5a)
{
soundoff_flag=0x5a;
}
else if(rece_data[19].Data[0]==0xa5)
{
ack_flag=0x5a;
}
else if(rece_data[19].Data[0]==0xff)
{
alarm_flag = 0x5a;
}
break;
}
default:RESET;
}
}
}
}
CANSTMOB &= ~((1<<RXOK)|(1<<TXOK));
CANCDMOB = 0x98; //接收使能
CANGIE |= (1<<ENRX); //開中斷
CANGIE |= (1<<ENTX);
WDR();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -