|
楼主 |
发表于 2016-9-19 16:40:04
|
显示全部楼层
void send_cand3(uchar ch)
{
uchar can_flag,can_dog;
dog_flag=0;
TH1=(65536-917)/256;
TL1=(65536-917)%256;
TR1=1;
SEL_CANd3=0x0;//XBYTE[0xB0FF]=0x00; //CAN片选有效
can_flag=XBYTE[SR]&0x08; //读状态寄存器
while(can_flag==0x00) //上次发送没有完成,等待
{
SEL_CANd3=0x1; //XBYTE[0xB0FF]=0xFF;//片选无效
can_dog=dog_flag;//读看门狗状态
if((can_dog&0x01)==0x01)
{
can3_error=0x00;
SEL_CANd3=0x1;
return;
}
SEL_CANd3=0x0;// XBYTE[0xB0FF]=0x00;//CHANNEL_SJA1000=0;
XBYTE[CMR]=0x02;//停止发送
can_flag=XBYTE[SR];
can_flag=can_flag&0x08; //读状态寄存器,
}
SEL_CANd3=0x0;
can_flag=XBYTE[SR];
can_flag=can_flag&0x04; //读状态寄存器
while(can_flag==0x00) //缓冲器没有释放,等待
{
SEL_CANd3=0x1; //XBYTE[0xB0FF]=0xFF;//片选无效
can_dog=dog_flag;//读看门狗状态
if((can_dog&0x01)==0x01)
{
can3_error=0x00;
SEL_CANd3=0x1;
return;
}
SEL_CANd3=0x0;//XBYTE[0xB0FF]=0x00;//CHANNEL_SJA1000=0;
can_flag=XBYTE[SR];
can_flag=can_flag&0x04; //读状态寄存器
}
SEL_CANd3=0x0;
switch(ch)
{
case 0x00: // 正常100ms周期发送自搜索目标信息
XBYTE[0x10]=can_send[0];//发送帧信息
XBYTE[0x11]=can_send[1];//发送识别地址1 给综合管理器和操控单元
XBYTE[0x12]=can_send[2];//发送识别地址2
XBYTE[0x13]=can_send[3];//发送识别地址3
XBYTE[0x14]=can_send[4];//发送识别地址4
XBYTE[0x15]=can_send[5];//发送第1字节
XBYTE[0x16]=can_send[6];//发送第2字节
XBYTE[0x17]=can_send[7];//发送第3字节
XBYTE[0x18]=can_send[8];//发送第4字节
XBYTE[0x19]=can_send[9];//发送第5字节
XBYTE[0x1a]=can_send[10];//发送第6字节
break;
case 0x01: //发送自检结果
XBYTE[0x10]=0x85;//发送帧信息
XBYTE[0x11]=0x18;//发送识别地址1 给综合管理器和操控单元
XBYTE[0x12]=0xf0;//发送识别地址2
XBYTE[0x13]=0x78;//发送识别地址3
XBYTE[0x14]=0x76;//发送识别地址4
XBYTE[0x15]=zj_result;//0x11;//zj_result设备自检正常0x11,0x12自检故障
break;
case 0x02://发送软件版本信息
XBYTE[0x10]=0x85;//发送帧信息
XBYTE[0x11]=0x18;//发送识别地址1 给综合管理器和操控单元
XBYTE[0x12]=0xf0;//发送识别地址2
XBYTE[0x13]=0x78;//发送识别地址3
XBYTE[0x14]=0x76;//发送识别地址4
XBYTE[0x15]=1;//信息长度
XBYTE[0x16]=0;//信息串序列
XBYTE[0x17]=0x6f;//软件标识
XBYTE[0x18]=0x8c;//软件配置项编码
XBYTE[0x19]=0;//软件版本号 0:方案样机;1:初样;2:正样;3:定型样机
XBYTE[0x1a]=0;//软件更改版本号,起始0,更改1次加1
XBYTE[0x1b]=0;//软件修订版本号,起始0,更改1次加1
XBYTE[0x1c]=0x63;//保留
break;
case 0x03: //发送开机自检结果
XBYTE[0x10]=0x85;//发送帧信息
XBYTE[0x11]=0x18;//发送识别地址1 给综合管理器和操控单元
XBYTE[0x12]=0xf0;//发送识别地址2
XBYTE[0x13]=0x78;//发送识别地址3
XBYTE[0x14]=0x76;//发送识别地址4
XBYTE[0x15]=zj_result;//0x11;//zj_result设备自检正常0x15,0x16自检故障
break;
default:
break;
}
XBYTE[CMR]=0x01;//启动发送
SEL_CANd3=0x1;//XBYTE[0xB0FF]=0xFF;//片选无效
can3_error=0xff;
can3_counter=0;
TR1=0;
TH1=(65536-917)/256;
TL1=(65536-917)%256;
can_flag=0x00;//将can总线清除到目标信息发送
return;
}
/**************定时器0中断服程序****************************/
void time0_int(void) interrupt 1
{
TH0=(65536-917)/256;
TL0=(65536-917)%256; //1ms定时
can3_send_frq=can3_send_frq+1;
can4_send_frq=can4_send_frq+1;
}
/**************定时器1中断服程序****************************/
void time1_int(void) interrupt 3
{
TH1=(65536-917)/256;
TL1=(65536-917)%256; //1ms定时
dog_flag=0x01;
test=~test;
}
/**************定时器2中断服程序****************************/
void time2_int(void) interrupt 5
{
TF2=0; //!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!
TH2=(65536-917)/256;
TL2=(65536-917)%256; //1ms定时
dog_flag2=0x01;
// dog_flag=0x01;
// test=~test;
}
/****************************sja1000d4 int**************/
void init_sja1000d4(void)//can口初始化程序
{
uchar can_temp;
RestCANd4=0; //can硬件复位
delay();
RestCANd4=1;
SEL_CANd4=0x0;//片选有效,可以对SJA1000进行操作了
XBYTE[0x09]=0xaa;//测试CAN连接
can_temp=XBYTE[0x09];
if(can_temp!=0xaa)
{
//不相等连接没有 ,初始化失败,退出
SEL_CANd4=0x1;//片选无效
//XBYTE[0xc000]=0x1; //点故障灯3个灯全亮
//XBYTE[0xc100]=0x1;
//XBYTE[0xc200]=0x1;
return;
}
SEL_CANd4=0x0;//XBYTE[0xB0FF]=0x00;
XBYTE[MODE]=0x09; //进入软件复位
can_temp=XBYTE[MODE]&0x01;//确认进入了复位
if(can_temp==0x00)
{
SEL_CANd4=0x1;//XBYTE[0xB0FF]=0x0FF;//片选无效
//XBYTE[0xc000]=0x1;//XBYTE[0xc400]=0x03; //点故障灯2个灯亮
//XBYTE[0xc100]=0x1;
return;
}
XBYTE[CDR] =0xC8 ;//c8设置时钟分频器 CDR CAN工作在扩展模式,RX1必须接到固定电平,关闭时钟输出B
//XBYTE[IER] =0x09 ;//中断使能,开放发送中断超载中断和错误警告中断 IER0x09
XBYTE[BTR0] =0x03 ;//设置波特率 同步跳转为2,晶振频率16M,分频数为16,波特率为001c,500K 011c,250K BTR0 031c 125k
XBYTE[BTR1] =0x1c ;//总线定时寄存器1 BTR1
XBYTE[OCR] =0x1a ;//aa输出控制寄存器设置 OCR 正常工作模式
XBYTE[RXERR] =0x00 ;//RXERR 清0 接收错误寄存器
XBYTE[TXERR] =0x00 ;//发送错误寄存器
XBYTE[ACR] =0x05 ;//设置帧信息,验收码ACR 0~3 BIT7=1 CAN工作在扩展模式;BIT3=1数据为8个
XBYTE[ACR+1] =0x00 ;
XBYTE[ACR+2] =0x80 ;
XBYTE[ACR+3] =0x00 ;
XBYTE[AMR] =0xfa ;//设置屏蔽码,bitx=1表示该位不参与校验AMR0~3
XBYTE[AMR+1] =0xff ;
XBYTE[AMR+2] =0xff ;
XBYTE[AMR+3] =0xff ;
XBYTE[0x1e] =0x00 ;//设置接收缓冲器起始地址
XBYTE[MODE]=0x08; //清除软件复位
// XBYTE[0x10]=0x88; //发送帧信息
XBYTE[IER] =0x09 ;//中断使能,开放发送中断超载中断和错误警告中断 IER0x09
SEL_CANd4=0x1;//XBYTE[0xB0FF]=0xFF;//片选无效
SEL_CANd4=0x1;//XBYTE[0xB0FF]=0xFF;
return;
}
/********************************************send_can4********************/
void send_cand4(uchar ch)
{
uchar can_flag,can_dog;
// dog_flag=0;
// TH1=(65536-917)/256;
// TL1=(65536-917)%256;
// TR1=1;
dog_flag2=0;
TH2=(65536-917)/256;
TL2=(65536-917)%256;
TR2=1; //启动定时器2
//XBYTE[0xE000]=0xFF; //关狗,复位狗
//XBYTE[0xE000]=0x00; //开狗
SEL_CANd4=0x0;//XBYTE[0xB0FF]=0x00; //CAN片选有效
can_flag=XBYTE[SR]&0x08; //读状态寄存器,
while(can_flag==0x00) //上次发送没有完成,等待
{
SEL_CANd4=0x1; //XBYTE[0xB0FF]=0xFF;//片选无效
// XBYTE[0xc000]=0x01; //点灯1个亮
can_dog=dog_flag2;//读看门狗状态
if((can_dog&0x01)==0x01)
{
can4_error=0x00;
SEL_CANd4=0x1;
return;
}
SEL_CANd4=0x0;// XBYTE[0xB0FF]=0x00;//CHANNEL_SJA1000=0;
XBYTE[CMR]=0x02;//停止发送
can_flag=XBYTE[SR];
can_flag=can_flag&0x08; //读状态寄存器,
}
SEL_CANd4=0x0;
can_flag=XBYTE[SR];
can_flag=can_flag&0x04; //读状态寄存器
while(can_flag==0x00) //缓冲器没有释放,等待
{
SEL_CANd4=0x1; //XBYTE[0xB0FF]=0xFF;//片选无效
// XBYTE[0xc100]=0x01; //点灯1个亮
can_dog=dog_flag2;//读看门狗状态
if((can_dog&0x01)==0x01)
{
can4_error=0x00;
SEL_CANd4=0x1;
return;
}
SEL_CANd4=0x0;// XBYTE[0xB0FF]=0x00;// CHANNEL_SJA1000=0;
can_flag=XBYTE[SR];
can_flag=can_flag&0x04; //读状态寄存器
}
SEL_CANd4=0x0;
switch(ch)
{
case 0x00: // 正常100ms周期发送自搜索目标信息
XBYTE[0x10]=can_send[0];//发送帧信息
XBYTE[0x11]=can_send[1];//发送识别地址1 给综合管理器和操控单元
XBYTE[0x12]=can_send[2];//发送识别地址2
XBYTE[0x13]=can_send[3];//发送识别地址3
XBYTE[0x14]=can_send[4];//发送识别地址4
XBYTE[0x15]=can_send[5];//发送第1字节
XBYTE[0x16]=can_send[6];//发送第2字节
XBYTE[0x17]=can_send[7];//发送第3字节
XBYTE[0x18]=can_send[8];//发送第4字节
XBYTE[0x19]=can_send[9];//发送第5字节
XBYTE[0x1a]=can_send[10];//发送第6字节
//XBYTE[0x1b]=can_send[11];//发送第7字节
//XBYTE[0x1c]=can_send[12];//发送第8字节
break;
case 0x01: //发送自检结果
XBYTE[0x10]=0x85;//发送帧信息
XBYTE[0x11]=0x18;//发送识别地址1 给综合管理器和操控单元
XBYTE[0x12]=0xf0;//发送识别地址2
XBYTE[0x13]=0x78;//发送识别地址3
XBYTE[0x14]=0x76;//发送识别地址4
XBYTE[0x15]=zj_result;//0x11;//zj_result设备自检正常0x11,0x12自检故障
//XBYTE[0x16]=zj_data;
//XBYTE[0x17]=rec_m2[2];
break;
case 0x02://发送软件版本信息
XBYTE[0x10]=0x85;//发送帧信息
XBYTE[0x11]=0x18;//发送识别地址1 给综合管理器和操控单元
XBYTE[0x12]=0xf0;//发送识别地址2
XBYTE[0x13]=0x78;//发送识别地址3
XBYTE[0x14]=0x76;//发送识别地址4
XBYTE[0x15]=1;//信息长度
XBYTE[0x16]=0;//信息串序列
XBYTE[0x17]=0x6f;//软件标识
XBYTE[0x18]=0x8c;//软件配置项编码
XBYTE[0x19]=0;//软件版本号 0:方案样机;1:初样;2:正样;3:定型样机
XBYTE[0x1a]=0;//软件更改版本号,起始0,更改1次加1
XBYTE[0x1b]=0;//软件修订版本号,起始0,更改1次加1
XBYTE[0x1c]=0x63;//保留
break;
case 0x03: //发送开机自检结果
XBYTE[0x10]=0x85;//发送帧信息
XBYTE[0x11]=0x18;//发送识别地址1 给综合管理器和操控单元
XBYTE[0x12]=0xf0;//发送识别地址2
XBYTE[0x13]=0x78;//发送识别地址3
XBYTE[0x14]=0x76;//发送识别地址4
XBYTE[0x15]=zj_result;//0x11;//zj_result设备自检正常0x15,0x16自检故障
//XBYTE[0x16]=zj_data;
break;
default:
break;
}
XBYTE[CMR]=0x01;//启动发送
SEL_CANd4=0x1;//XBYTE[0xB0FF]=0xFF;//片选无效
can4_error=0xff;
can4_counter=0;
// TR1=0;
// TH1=(65536-917)/256;
// TL1=(65536-917)%256;
TR2=2; //关闭定时器2
TH2=(65536-917)/256;
TL2=(65536-917)%256;
can_flag=0x00;//将can总线清除到目标信息发送
return;
}
void rec_can3(void)
{
uchar can_reg,can_flag;
SEL_CANd3=0x0; //XBYTE[0xB0FF]=0x00;//CHANNEL_SJA1000=0;//片选有效
can_reg=XBYTE[0x03];//读状态寄存器
can_flag=can_reg&0x08;//看是否为数据溢出中断
if(can_flag==0x08)
{
XBYTE[0x01]=0x0c;//清除数据溢出以及释放接收缓冲器
SEL_CANd3=0x1; //XBYTE[0xB0FF]=0xFF;//CHANNEL_SJA1000=1;//取消片选
can3_error=0x00;
//XBYTE[0xc200]=0x1;//写灯
return;
}
can_flag=can_reg&0x01;//接收中断位为继续执行,否则跳出子程序
if(can_flag==0x00)
{
SEL_CANd3=0x1; //XBYTE[0xB0FF]=0xFF;//CHANNEL_SJA1000=1;//取消片选
//XBYTE[0xc200]=0x1;//写灯
can3_error=0x00;
return;
}
//开始接收
can3_rec[0]=XBYTE[0x10];//接收中断位为1跳转 ACR0
can_flag=can3_rec[0]&0x40;//远程帧判断
if(can_flag==0x40)
{
XBYTE[0x01]=0x04;//信息为远程帧,释放接收缓冲后退出
SEL_CANd3=0x1; //XBYTE[0xB0FF]=0xFF;//CHANNEL_SJA1000=1;//取消片选
//XBYTE[0xc200]=0x1;//写灯
can3_error=0x00;
return;
}
can3_rec[1]=XBYTE[0x11];// ACR1
can3_rec[2]=XBYTE[0x12];// ACR2
can3_rec[3]=XBYTE[0x13];// ACR3
can3_rec[4]=XBYTE[0x14];// ACR4
can3_rec[5]=XBYTE[0x15];// DATA1
can3_rec[6]=XBYTE[0x16];// DATA2
can3_rec[7]=XBYTE[0x17];// DATA3
can3_rec[8]=XBYTE[0x18];// DATA4
can3_rec[9]=XBYTE[0x19];// DATA5
can3_rec[10]=XBYTE[0x1a];// DATA6
//can3_rec[11]=XBYTE[0x1b];// DATA7
//can3_rec[12]=XBYTE[0x1c];// DATA8
XBYTE[0x01]=0x04;//读完数据后,释放接收缓冲后退出
SEL_CANd3=0x1;//XBYTE[0xB0FF]=0xFF;//CHANNEL_SJA1000=1;//取消片选
return;
}
/****************554判断*************/
void read_554_cha(void)//554通道判读
{
uchar flag;
//EA=0;
CSA=0; //选中554,对554进行操作
flag=XBYTE[0x0200]&0x0c; //判断数据口
switch(flag) //完整接收
{
case 0x04:
read554(0x01);
data_process_ch(0x01);//正常接收
break;
case 0x0c:
read554(0x01);
data_process_ch(0x01);//超时中断,将接收FIFO读空
break;
default:
break;
}
CSA=1;//取消554选择
//EA=1;
return;
}
void read_554_chb(void)//554通道判读
{
uchar flag;
//EA=0;
CSB=0; //选中554,对554进行操作
flag=XBYTE[0x0200]&0x0c; //判断数据口
switch(flag) //完整接收
{
case 0x04:
read554(0x02);
data_process_ch(0x02);//正常接收
break;
case 0x0c:
read554(0x02);
data_process_ch(0x02);//超时中断,将接收FIFO读空
break;
default:
break;
}
CSB=1;//取消554选择
//EA=1;
return;
}
void rec_can4(void)
{
uchar can_reg,can_flag;
SEL_CANd4=0x0; //XBYTE[0xB0FF]=0x00;//CHANNEL_SJA1000=0;//片选有效
can_reg=XBYTE[0x03];//读状态寄存器
can_flag=can_reg&0x08;//看是否为数据溢出中断
if(can_flag==0x08)
{
XBYTE[0x01]=0x0c;//清除数据溢出以及释放接收缓冲器
SEL_CANd4=0x1; //XBYTE[0xB0FF]=0xFF;//CHANNEL_SJA1000=1;//取消片选
can3_error=0x00;
//XBYTE[0xc200]=0x1;//写灯
return;
}
can_flag=can_reg&0x01;//接收中断位为继续执行,否则跳出子程序
if(can_flag==0x00)
{
SEL_CANd4=0x1; //XBYTE[0xB0FF]=0xFF;//CHANNEL_SJA1000=1;//取消片选
//XBYTE[0xc200]=0x1;//写灯
can3_error=0x00;
return;
}
//开始接收
can4_rec[0]=XBYTE[0x10];//接收中断位为1跳转 ACR0
can_flag=can4_rec[0]&0x40;//远程帧判断
if(can_flag==0x40)
{
XBYTE[0x01]=0x04;//信息为远程帧,释放接收缓冲后退出
SEL_CANd4=0x1; //XBYTE[0xB0FF]=0xFF;//CHANNEL_SJA1000=1;//取消片选
//XBYTE[0xc200]=0x1;//写灯
can3_error=0x00;
return;
}
can4_rec[1]=XBYTE[0x11];// ACR1
can4_rec[2]=XBYTE[0x12];// ACR2
can4_rec[3]=XBYTE[0x13];// ACR3
can4_rec[4]=XBYTE[0x14];// ACR4
can4_rec[5]=XBYTE[0x15];// DATA1
can4_rec[6]=XBYTE[0x16];// DATA2
can4_rec[7]=XBYTE[0x17];// DATA3
can4_rec[8]=XBYTE[0x18];// DATA4
can4_rec[9]=XBYTE[0x19];// DATA5
can4_rec[10]=XBYTE[0x1a];// DATA6
//can4_rec[11]=XBYTE[0x1b];// DATA7
//can4_rec[12]=XBYTE[0x1c];// DATA8
XBYTE[0x01]=0x04;//读完数据后,释放接收缓冲后退出
SEL_CANd4=0x1;//XBYTE[0xB0FF]=0xFF;//CHANNEL_SJA1000=1;//取消片选
return;
}
|
|