📄 can1.c
字号:
//------mck use can0 --------------------
#include "mb90540.h"
/////////////////////////////
//注意 各文件之间的定义 不要冲突
//---above is type define------
//--------------can1 (ml) bps-------
#define BTR_4M_4545K_02_12_3 0x4FA7 //CAN 波特率
/////////////////////////////////////
//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,*/
};
//-------------------------------------------
///
IO_BYTE frame_num=0,frame_count=0;
IO_BYTE dz_n_bak=0;
//
IO_WORD cantx_tout;
#define TIMEOUT 120
extern IO_BYTE dzh_len;
IO_BYTE dz_id;
void can1_tx_sdz(void);
void can1_tx_wdz(void);
void can1_tx_rdz(void);
void can1_rdz(void);
void can1_sdz(void);
void dz_cl(IO_BYTE len,IO_BYTE *s,IO_BYTE *d);
/////////////////////////////////////////
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
if(ml_unit==60)//遥信来自I/O板
{
for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
ioyx_1l(i)=can1_rx_buf(can1_buf_rxpaddr+5+i);//变量 ioyx_1l 可能未定义
}
else
{
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;
if(ml_unit==60)//遥测来自I/O板
{
a=frame_no*8;
for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
{
ioyc_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);//变量 ioyc_1l 可能未定义
// ns_yc_1l[a+i+1]=(*can1_rxpro_pointer++) & 0x0f;
}
}
else
{
for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
{
yc_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);
// ns_yc_1l[a+i+1]=(*can1_rxpro_pointer++) & 0x0f;
}
}
}
//--------------------------------------------
void can1_dd(void)//^o^ 此函数是用于主板的
{
IO_BYTE i;
IO_WORD a;//偏移量为字型
// b=(ml_unit-1)*36;//偏移量 18 yc
if(ml_unit==60)//电度来自I/O板
{
a=frame_no*8;
for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
{
iodd_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);//变量 iodd_1l 可能未定义
// 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_1l(a)=can1_rx_buf(can1_buf_rxpaddr+7+i);//yc的低字节
yc_1l(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(sc1801_ykmask & 0x10)
{
sc1801_ykmask|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
sc1801_ykmask|=0x01;//返校对
cyk_mask|=0x60;
}
else
sc1801_ykmask|=0x02;//返校错
}*/
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;
}
}
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_ykmark2 & 0x10)
{
cdt_ykmark2|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cdt_ykmark2|=0x01;//返校对
cyk_mask|=0x60;
}
else
{
cdt_ykmark2|=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(sc1801_ykmask & 0x10)
{
sc1801_ykmask|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
sc1801_ykmask|=0x04;//返校对
cyk_mask|=0x06;
}
else
{
sc1801_ykmask|=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;//返校错
}
}
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_ykmark2 & 0x10)
{
cdt_ykmark2|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cdt_ykmark2|=0x04;//返校对
cyk_mask|=0x06;
}
else
{
cdt_ykmark2|=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(sc1801_ykmask & 0x10)
{
sc1801_ykmask|=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;//撤控
}
}
if(cdt_ykmark0 & 0x10)
{
cdt_ykmark0|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cyk_mask|=0x01;//撤控
}
}
if(cdt_ykmark2 & 0x10)
{
cdt_ykmark2|=0x80;
c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
if(ml_unit==b)//比较单元号是否相同
{
cyk_mask|=0x01;//撤控
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -