📄 can1.c
字号:
//------mck use can0 --------------------
#include "mb90540.h"
/////////////////////////////
//注意 各文件之间的定义 不要冲突
//---above is type define------
//--------------can1 (ml) bps-------
#define BTR_4M_4545K_02_12_3 0x4FA7 //CAN 波特率 0x4FA7
/////////////////////////////////////
//BYTE a, c,ch;
//int i,p,t0,t1,j=0;;
extern IO_BYTE yk_fm[32][2]; //标2-0是单元号;标2-1是单元内点号
////////////////can1_ML 变量//////////
IO_BYTE Len1, pos1;
IO_LWORD Data1;
__far unsigned int can1_buf_rxaddr;
__far unsigned int can1_buf_rxpaddr;
extern unsigned int msecond;
extern IO_BYTE second;
extern IO_BYTE minute;
////////////////时间变量/////////////////////////
IO_LWORD SecondInMonth[4][12]={{0,2678400,5184000,7862400,10454400,13132800,15724800,18403200,21081600,23673600,26352000,28944000},
{0,2678400,5097600,7776000,10368000,13046400,15638400,18316800,20995200,23587200,26265600,28857600},
{0,2678400,5097600,7776000,10368000,13046400,15638400,18316800,20995200,23587200,26265600,28857600},
{0,2678400,5097600,7776000,10368000,13046400,15638400,18316800,20995200,23587200,26265600,28857600}};
//1 2 3 4 5 6 7 8 9 10 11 12
#define HOUR_S 3600
#define DATE_S 86400
IO_LWORD SecondInYear[2]={31622400,31536000};
union B_W{
unsigned char b[4];
unsigned short w[2];
unsigned long dw;
}time_s;
IO_WORD soe_p1;
IO_BYTE ml_unit ; //单元号
IO_BYTE can1_len ; //报文长度
IO_BYTE fun_code; //功能码
IO_BYTE frame_no=0;
IO_BYTE frame_flag=0;
///------------对时所用的变量--------------------------
IO_LWORD SecondInHour[24]={0,3600,7200,10800,14400,18000,21600,
25200,28800,32400,36000,39600,43200,
46800,50400,54000,57600,61200,64800,
68400,72000,75600,79200,82800/*,86400,*/
};
/////////////////////////////////////////
void InitCan1_ml(void)
{
//can0_init
// CAN
CSR1 = 0x81; // bit 7: enable transmit output pin
// bit 0: stop bus operation
while (! CSR1_HALT);
BVALR1 = 0; // all message buffer are invalid
BTR1 = BTR_4M_4545K_02_12_3; //0X2F4F;
// activate can bus operation
// acceptance mask definition
AMRX01 = 0xFFFFFF7F;
AMRX11 = 0;
CSR1 = 0x0080;
LEIR1=0X00;
ROVRR1=0X0000;
//--------缓存0 use receive; buffer1 use tx-------
// set frame format for messagebuffer 0
BVALR1_BVAL0 = 0; // message buffer are invalid
BVALR1_BVAL1=0;
IDER1_IDE0 = 1; // 29bit 标识符
IDER1_IDE1=1;
IDRX1(0) = 0x00000080;
IDRX1(1)=0X00;
AMSR1_AMS0 = 2; // full bit compare
AMSR1_AMS1 = 1;
TIER1_TIE0 = 0;
BVALR1_BVAL0 = 1; // message buffer are valid
BVALR1_BVAL1=1;
RIER1_RIE0=1; //接收允许
// set data
TREQR1_TREQ0 = 0; // no transmition
TREQR1_TREQ1=0;
RFWTR1_RFWT0 = 0; // no wait for remote requeset
RFWTR1_RFWT1=0;
TRTRR1_TRTR0 = 0; // data frame transfer
TRTRR1_TRTR1=0;
can1_buf_rxaddr=0;
can1_buf_rxpaddr=0;
soe_p1=0;
}
//-----------------------------------------
void can1_soe(void)
{
IO_BYTE b,c,d,i;
b=(ml_unit-1)*8+ can1_rx_buf(can1_buf_rxpaddr+11)/8;//偏移量(单元号,单元内点号偏移)
d=(can1_rx_buf(can1_buf_rxpaddr+12)) & 0x80;//状态
c=(d>>7)&0x01;
switch(can1_rx_buf(can1_buf_rxpaddr+11)%8)//点号
{
case 0x00 : if(c==(yx_1l(b) & 0x01) )return;
else {if(c==1) yx_1l(b)|=c; //更新yx区
else yx_1l(b)&=0xfe;
}
break;
case 0x01 : if((c*2)==(yx_1l(b) & 0x02))return;
else {if(c==1) yx_1l(b)|=c*2;
else yx_1l(b)&=0xfd;
}
break;
case 0x02 : if(c*4==(yx_1l(b) & 0x04))return;
else { if(c==1) yx_1l(b)|=c*4;
else yx_1l(b)&=0xfb;
}
break;
case 0x03 : if(c*8==(yx_1l(b) & 0x08))return;
else { if(c==1) yx_1l(b)|=c*8;
else yx_1l(b)&=0xf7;
}
break;
case 0x04 : if(c*16==(yx_1l(b) & 0x10))return;
else {if(c==1) yx_1l(b)|=c*16;
else yx_1l(b)&=0xef;
}
break;
case 0x05 : if(c*32==(yx_1l(b) & 0x20)) return;
else {if(c==1) yx_1l(b)|=c*32;
else yx_1l(b)&=0xdf;
}
break;
case 0x06 : if(c*64==(yx_1l(b) & 0x40))return;
else {if(c==1) yx_1l(b)|=c*64;
else yx_1l(b)&=0xbf;
}
break;
case 0x07 : if(c*128==(yx_1l(b) & 0x80))return;
else {if(c==1) yx_1l(b)|=c*128;
else yx_1l(b)&=0x7f;
}
break;
}//更新yx区
ml_soe_1l(soe_p1++)=ml_unit;//存单元号
for(i=0;i<8;i++)
ml_soe_1l(soe_p1++)=can1_rx_buf(can1_buf_rxpaddr+5+i);//存soe
if(soe_p1>=128)soe_p1=0;
}
//---------------------------------------------------
void can1_yx(void)
{
IO_BYTE b,i;
b=(ml_unit-1)*8;//偏移量 1个单元64个 yx
for(i=0;i<can1_len;i++)//判断长度
yx_1l(b+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);
}
//-------------------------------------------------
void can1_yc(void)
{
IO_BYTE i;
IO_WORD a,b;//偏移量为字型
b=(ml_unit-1)*36;//偏移量 18 yc
a=b+frame_no*8;
for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
{
yc_1ll(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);
// ns_yc_1l[a+i+1]=(*can1_rxpro_pointer++) & 0x0f;
}
}
//--------------------------------------------
void can1_bhyc(void)
{
IO_BYTE c,i;
IO_WORD a,b;
b=(ml_unit-1)*36;
for(i=0;i<can1_len;i+=4)
{
c=can1_rx_buf(can1_buf_rxpaddr+5+i);//点号
a=b+c*2;
yc_1ll(a)=can1_rx_buf(can1_buf_rxpaddr+7+i);//yc的低字节
yc_1ll(a+1)=can1_rx_buf(can1_buf_rxpaddr+8+i);//yc的高字节 是否与0x0f???
}
}
//------------------------------------------------------------------
void can1_ykxk(void)
{
IO_BYTE b, c;
//
b=yk_fm_para(yk_dx*4)&0x3f;
//
cyk_mask|=0x10;//有返校标识
can_mask&=0xdf;//清 发送遥控
if(cdt_ykmark0 & 0x10)
{
cdt_ykmark0|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cdt_ykmark0|=0x01;//返校对
cyk_mask|=0x60;
}
else
{
cdt_ykmark0|=0x02;//返校错
yk_xz=0xff;
}
}
if(cdt_ykmark & 0x10)
{
cdt_ykmark|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cdt_ykmark|=0x01;//返校对
cyk_mask|=0x60;
}
else
{
cdt_ykmark|=0x02;//返校错
yk_xz=0xff;
}
}
}
//------------------------------------------------------------------
void can1_ykzx(void)
{
IO_BYTE b,c;
//
b=yk_fm_para(yk_dx*4)&0x3f;
//
cyk_mask|=0x10;//有返校
can_mask&=0xdf;//清??
if(cdt_ykmark0 & 0x10)
{
cdt_ykmark0|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cdt_ykmark0|=0x04;//返校对
cyk_mask|=0x06;
}
else
{
cdt_ykmark0|=0x08;//返校错
}
}
if(cdt_ykmark & 0x10)
{
cdt_ykmark|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cdt_ykmark|=0x04;//返校对
cyk_mask|=0x06;
}
else
{
cdt_ykmark|=0x08;//返校错
}
}
cyk_soe=0;
}
//---------------------------------------------------------------
void can1_ykck(void)
{
IO_BYTE b,c;
//
b=yk_fm_para(yk_dx*4)&0x3f;
//
cyk_mask|=0x10;//有返校
can_mask&=0xdf;//清??
if(cdt_ykmark0 & 0x10)
{
cdt_ykmark0|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cyk_mask|=0x01;//撤控
}
}
if(cdt_ykmark & 0x10)
{
cdt_ykmark|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cyk_mask|=0x01;//撤控
}
}
}
//-------------------------------------
//------can1 tx 发送--下发给模块 ------------------------------------------------------------
//-------------------------------------
void can1_tx_init(void)
{
IO_BYTE b;
DLCR1(1) = 0;
IDRX1(1) = 0X00FC0100;//单元号 是0X7F??
b=(CSR1&0XC000)>>8;
// if(b&0x40)return; //总线有数
TREQR1_TREQ1 = 1; // transmition request
// if ((TCR1_TC1!=0)&&(TREQR1_TREQ1==0))
// {
// TCR1_TC1=0;
// }
}
//------------------------------------
void can1_tx_time(void) //对时
{
;
DLCR1(1) = 8; // data length
IDRX1(1) = 0x00FC0108;//单元号是0x7f 命令码是0x20
DTR1_WORD(1,0) = sys_year | 0x7d0; //0x07D2;//年
DTR1_WORD(1,1) = time_s.w[1];//0x0174;//秒高字节
DTR1_WORD(1,2) = time_s.w[0];//0x47e8;//秒低字节
DTR1_WORD(1,3) = msecond;//0x0000;//毫秒
TREQR1_TREQ1 = 1; // transmition request
// while (TCR1_TC1==0)
// {
// if(TREQR1_TREQ1==0)
// {PDR6_P64 = ~PDR6_P64;
// break;
// }
// if(can_yktime>=5){can_yktime=0;break;}//发送yk,最长计时
// }
// TCR1_TC1=0;
}
//-------------------------------------------
void can1_tx_yk(void)
{
IO_BYTE b;
b=yk_fm_para(yk_dx*4);//单元号
//
if((b&0x3f)<13) return;
//
can_mask&=0xdf;
yk_count+=1;//yk发送记数
can_yktime=0;
if(cyk_mask & 0x80)//有选控命令
{
if(cyk_mask & 0x10)//有返校
{
if(cyk_mask & 0x08)//执行
{
DLCR1(1)=2;
IDRX1(1)=b&0x3f;
IDRX1(1) =(IDRX1(1)<<18)|0x00008002;//命令码是05
if(yk_xz==0x33)//分
DTR1_WORD(1,0)=0X0100;
else
if(yk_xz==0xcc)//合
DTR1_WORD(1,0)=0X0200;
}
else
{
if(cyk_mask & 0x01)//撤控
{
DLCR1(1)=2;
IDRX1(1)=b&0x3f;
IDRX1(1) = (IDRX1(1)<<18)|0x00000003;//命令码是06
if(yk_xz==0x33)//分
DTR1_WORD(1,0)=0X0100;
else
if(yk_xz==0xcc)//合
DTR1_WORD(1,0)=0X0200;
}
else return;//返回
}
}
else//选控
{
DLCR1(1)=2;
IDRX1(1)=b&0x3f;
IDRX1(1) = (IDRX1(1)<<18)|0x00000002;//命令码是04
if(yk_xz==0x33)//分
DTR1_WORD(1,0)=0X0100;
else
if(yk_xz==0xcc)//合
DTR1_WORD(1,0)=0X0200;
}
TREQR1_TREQ1 = 1; // transmition request
// while (TCR1_TC1==0)
// {
// if(TREQR1_TREQ1==0)
// {PDR6_P64 = ~PDR6_P64;
// break;
// }
// if(can_yktime>=5){can_yktime=0;break;}//发送yk,最长计时
// };
// TCR1_TC1=0;
}
}
//------------------------------------------------------------
void can1_cl(void)
{//报文 先长度, 后标识符 先发送,后接收
IO_BYTE t1,t2;
//can1_txcl
if((sys_minute%2==0)&&(sys_second%37==0)){ can1_tx_time();return;}
if(can_mask&0x20) can1_tx_yk();
time_s.dw=SecondInMonth[1][sys_month-1]+
(sys_day-1) * 86400 + SecondInHour[sys_hour] + sys_minute * 60 + sys_second;
//can1_rxcl
if(can1_buf_rxaddr == can1_buf_rxpaddr)
{
if(CSR1_HALT==1)
{
__DI();
InitCan1_ml();
__EI();
}
return;
}
can1_len=can1_rx_buf(can1_buf_rxpaddr+0);//长度
fun_code=(can1_rx_buf(can1_buf_rxpaddr+1) & 0x7f)<<1;//
t1=can1_rx_buf(can1_buf_rxpaddr+2);
if(t1 & 0x80)
fun_code|=0x01;
else
fun_code&=0xfe;//完成命令码的取存
t2=can1_rx_buf(can1_buf_rxpaddr+3);
if(t2 & 0x02)
frame_flag=1;//后续侦标志
else
frame_flag=0;
ml_unit=(can1_rx_buf(can1_buf_rxpaddr+3)>>2) & 0x3f;
if(t1 & 0x01)
ml_unit|=0x40;
else
ml_unit&=0x3f;//完成单元号的取存
frame_no=(can1_rx_buf(can1_buf_rxpaddr+4)>>3) & 0x1f;
if(t2 & 0x01)
frame_no|=0x20;
else
frame_no&=0x1f;//完成侦号的取存
switch(fun_code)
{
case 0x22 : can1_soe();break;//soe
case 0x24 : can1_ykxk();break;//选控返校
case 0x25 : can1_ykzx();break;//执行返校
case 0x26 : can1_ykck();break;//撤控返校
case 0x3a : can1_bhyc();break;//变化yc
case 0x3c : can1_yx();break;//yx
case 0x3d : can1_yc();break;//yc
case 0x3e : ; break;//电能
case 0x20 : can1_tx_time();break;//发对时
}
can1_buf_rxpaddr+=13;
if(can1_buf_rxpaddr>=1300)
can1_buf_rxpaddr=0;
///------tx-----------
}
//////////////////
__interrupt void can1_rx (void)
{
IO_BYTE a;
a=ROVRR1_ROVR0;
ROVRR1_ROVR0=0;
if(a==0)
{
Data1=IDRX1(0);//29ID 标识符
Len1 = DLCR1(0)&0x0f;//帧长度
can1_rx_buf(can1_buf_rxaddr+0)= Len1 ;
can1_rx_buf(can1_buf_rxaddr+1)=Data1&0xff;
can1_rx_buf(can1_buf_rxaddr+2)=(Data1>>8)&0xff;
can1_rx_buf(can1_buf_rxaddr+3)=(Data1>>16)&0xff;
can1_rx_buf(can1_buf_rxaddr+4)=(Data1>>24)&0xff;
for (pos1=0; pos1<(Len1);pos1++)
{
can1_rx_buf(can1_buf_rxaddr+5+pos1) =DTR1_BYTE(0,pos1);
}
can1_buf_rxaddr+=13;
if(can1_buf_rxaddr>=1300)
{
can1_buf_rxaddr=0;
}
}
RCR1_RC0=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -