📄 can0.c
字号:
//------mck use can0 --------------------
#include "mb90540.h"
/////////////////////////////
//---above is type define------
//----can0 (mck) bps-------
#define BTR_4M_50K_02_12_3 0x2f09 //0x2f49 20k 0x4fa7 0x2F43
IO_BYTE yk_fm[32][2]; //标2-0是单元号;标2-1是单元内点号
unsigned char Counter = 0;
////////////////can0 变量//////////
IO_BYTE Len0, pos0; //中断用
IO_LWORD Data0;
__far unsigned int can0_buf_rxaddr;
__far unsigned int can0_buf_rxpaddr;
IO_BYTE ml0_unit ; //单元号
IO_BYTE can0_len ; //报文长度
IO_BYTE fun0_code; //功能码
IO_BYTE frame0_no=0;
IO_BYTE frame0_flag=0;
IO_WORD soe_p;
void can0_tx_time(void);
/////////////////////////////////////////
void initcan0(void)
{
//can0_init
// CAN
CSR0 = 0x81; // bit 7: enable transmit output pin
// bit 0: stop bus operation
while (! CSR0_HALT);
BVALR0 = 0; // all message buffer are invalid
BTR0 = BTR_4M_50K_02_12_3; //0X2F4F;
// activate can bus operation
// acceptance mask definition
AMR00 = 0xFFFFFFfF;
AMR10 = 0;
CSR0 = 0x0080;
LEIR0=0X00;
ROVRR0=0X0000;
//--------缓存0 use receive; buffer1 use tx-------
// set frame format for messagebuffer 0
BVALR0_BVAL0 = 0; // message buffer are invalid
BVALR0_BVAL1=0;
BVALR0_BVAL2=0;
IDER0_IDE0 = 1; // 11bit 标识符
IDER0_IDE1=1;
IDER0_IDE2=1;
IDRX0(0) = 0x00000080;
IDRX0(1)=0X00000080;
IDRX0(2)=0X00000080;
AMSR0_AMS0 = 1; // full bit compare
AMSR0_AMS1 =1;
AMSR0_AMS2 =1;
TIER0_TIE0 = 0;
BVALR0_BVAL0 = 1; // message buffer are valid
BVALR0_BVAL1=1;
BVALR0_BVAL2=1;
RIER0_RIE0=1; //允许接收中断
RIER0_RIE1=1;
RIER0_RIE2=1;
// ROVRR0=0x00;
// set data
TREQR0_TREQ0 = 0; // no transmition
TREQR0_TREQ1=0;
TREQR0_TREQ2=0;
RFWTR0_RFWT0 = 0; // no wait for remote requeset
RFWTR0_RFWT1=0;
RFWTR0_RFWT2=0;
TRTRR0_TRTR0 = 0; // data frame transfer
TRTRR0_TRTR1=0;
TRTRR0_TRTR2=0;
// CSR0 = 0x0080;
// RRTRR0_RRTR0=0;
// RRTRR0_RRTR1=0;
}
void InitCan0_mck(void)
{
initcan0();
can0_buf_rxaddr=0;
can0_buf_rxpaddr=0;
soe_p=0;
can_mask=0;
}
/*void can0_yxbw(void)
{
IO_BYTE b,c,i;
b=(ns_unit-1)*8+ can0_rx_buf(can0_buf_rxpaddr+3);//偏移量
c=can0_rx_buf(can0_buf_rxpaddr+5);//状态
if(c==yx_1l(b)) return;
yx_1l(b)=c;//更新yx区
ns_soe_1l(soe_p++)=can0_rx_buf(can0_buf_rxpaddr+1);//存单元号
ns_soe_1l(soe_p++)=can0_rx_buf(can0_buf_rxpaddr+3);//存组号
for(i=0;i<6;i++)
ns_soe_1l(soe_p++)=can0_rx_buf(can0_buf_rxpaddr+5+i);//存soe
if(soe_p>=128)soe_p=0;
}*/
//---------------------------------------------------
/*void can0_yx(void)
{
IO_BYTE b,c,i;
b=(ns_unit-1)*8;//偏移量 1个单元64个 yx
for(i=0;i<(can0_len-2);i++)//判断长度
yx_1l(b+i)=can0_rx_buf(can0_buf_rxpaddr+5+i);
c=can0_rx_buf(can0_buf_rxpaddr+3)&0x04;
if (i==0x04)
{
can0_tx_time();
}
}*/
//-------------------------------------------------
/*void can0_yc(void)
{
IO_BYTE c,i;
IO_WORD a,b;
b=(ns_unit-1)*36;//偏移量 18 yc
c=(can0_rx_buf(can0_buf_rxpaddr+4)& 0x1f)*6;//组号
a=b+c;//总偏移量
for(i=0;i<(can0_len-2);i++)//判断长度
{
yc_1ll(a+i)=can0_rx_buf(can0_buf_rxpaddr+5+i);
}
;
}*/
//------------------------------------------------------------------
/*void can0_yk(void)
{
IO_BYTE b,c,d;
//
c=can0_rx_buf(can0_buf_rxpaddr+5);
d=can0_rx_buf(can0_buf_rxpaddr+6);
//
cyk_mask|=0x10;
can_mask&=0xdf;
b=can0_rx_buf(can0_buf_rxpaddr+4);
switch(b)
{
case 0x55 : if(sc1801_ykmask&0x10) //有遥控
{
sc1801_ykmask|=0x80; //有返校
if((c!=0))//模块号是否相等
{
sc1801_ykmask|=0x01;
cyk_mask|=0x60;
}
else
sc1801_ykmask|=0x02;
}
if(cdt_ykmark&0x10) //有遥控
{
cdt_ykmark|=0x80; //有返校
if((c!=0))//模块号是否相等
{
cdt_ykmark|=0x01;
cyk_mask|=0x60;
}
else
{
cdt_ykmark|=0x02;
yk_xz=0xff;
}
}
break;
case 0xaa : if(sc1801_ykmask&0x10)
{
sc1801_ykmask|=0x80;
if((c!=0))
{
sc1801_ykmask|=0x04;
cyk_mask|=0x06;
}
else
sc1801_ykmask|=0x08;
}
if(cdt_ykmark&0x10)
{
cdt_ykmark|=0x80;
if((c!=0))
{
cdt_ykmark|=0x04;
cyk_mask|=0x06;
}
else
cdt_ykmark|=0x08;
}
cyk_soe=0;
break;
}
;
}*/
//------------------------------------
//------can0 tx 发送--下发给模块 ------------------------------------------------------------
/*void can0_tx_time(void) //对时
{
DLCR0(1)=2;
IDR0(1)= 0x0080;//单元号在此无意义
DTR0_WORD(1,0) =0;
TREQR0_TREQ1 = 1; // transmition request
}*/
//-------------------------------------------
/*void can0_tx_yk(void)
{
IO_BYTE b;
//
b=yk_fm_para(yk_dx*4)&0x3f;
//
//
if(b>=13) return;
//
if(cyk_mask & 0x80)//有选控命令 规约给CAN
{
if(cyk_mask & 0x10)//有返校
{
if(cyk_mask & 0x08)//执行
{
can_mask&=0xdf;
yk_count+=1;//yk发送记数
can_yktime=0;
DLCR0(1)=4;
IDR0(1) = 0x4080 | b;//b是单元号
//标yk_dx*4是单元号;标yk_dx*4+1是单元内点号
DTR0_WORD(1,0)=0XAA00; //低字节是单元状态;高字节是数据描述
DTR0_WORD(1,1)=yk_xz|0x0100; //低字节是yk的分合;高字节是单元内的电号
///////
TREQR0_TREQ1 = 1; // transmition request
}
else
{
if(cyk_mask & 0x01)//撤控
{
can_mask&=0xdf;
yk_count+=1;//yk发送记数
can_yktime=0;
DLCR0(1)=4;
IDR0(1) = 0x4080 | b;
DTR0_WORD(1,0)=0X6600; //低字节是单元状态;高字节是数据描述
DTR0_WORD(1,1)=yk_xz|0x0100; //低字节是yk的分合;高字节是单元内的电号
TREQR0_TREQ1 = 1; // transmition request
}
else return;
}
}
else//选控
{
can_mask&=0xdf;
yk_count+=1;//yk发送记数
can_yktime=0;
DLCR0(1)=4;
IDR0(1) = 0x4080 | b;
DTR0_WORD(1,0)=0X5500; //低字节是单元状态;高字节是数据描述
DTR0_WORD(1,1)=yk_xz|0x0100; //低字节是yk的分合;高字节是单元内的电号
////////
TREQR0_TREQ1 = 1; // transmition request
}
}
}*/
void can0_yx(void)
{
IO_BYTE b,i;
b=(ml0_unit-1)*8;//偏移量 1个单元64个 yx
if(ml0_unit==60)//遥信来自I/O板
{
for(i=0;i<can0_len;i++)//判断长度 是否改为:i+=2???
ioyx_1l(i)=can0_rx_buf(can0_buf_rxpaddr+5+i);//变量 ioyx_1l 可能未定义
}
//else
//{
//for(i=0;i<can0_len;i++)//判断长度
// yx_1l(b+i)=can0_rx_buf(can0_buf_rxpaddr+5+i);
//}
}
//-------------------------------------------------
void can0_yc(void)
{
IO_BYTE i;
IO_WORD a,b;//偏移量为字型
b=(ml0_unit-1)*36;//偏移量 18 yc
a=b+frame0_no*8;
if(ml0_unit==60)//遥测来自I/O板
{
a=frame0_no*8;
for(i=0;i<can0_len;i++)//判断长度 是否改为:i+=2???
{
ioyc_1l(a+i)=can0_rx_buf(can0_buf_rxpaddr+5+i);//变量 ioyc_1l 可能未定义
// ns_yc_1l[a+i+1]=(*can1_rxpro_pointer++) & 0x0f;
}
}
//else
//{
//for(i=0;i<can0_len;i++)//判断长度 是否改为:i+=2???
//{
// yc_1l(a+i)=can0_rx_buf(can0_buf_rxpaddr+5+i);
//}
//}
}
//--------------------------------------------
void can0_dd(void)//^o^ 此函数是用于主板的
{
IO_BYTE i;
IO_WORD a;//偏移量为字型
// b=(ml_unit-1)*36;//偏移量 18 yc
if(ml0_unit==60)//电度来自I/O板
{
a=frame0_no*8;
for(i=0;i<can0_len;i++)//判断长度 是否改为:i+=2???
{
iodd_1l(a+i)=can0_rx_buf(can0_buf_rxpaddr+5+i);//变量 iodd_1l 可能未定义
// ns_yc_1l[a+i+1]=(*can1_rxpro_pointer++) & 0x0f;
}
}
}
//-------------------------------------
void can0_cl(void)
{//报文 先长度, 后标识符 先发送,后接收
IO_BYTE t1,t2;
///can0_txcl
// if((sys_minute%2==0)&&(sys_second%37==0)) {can0_tx_time();return;}
// if(can_mask&0x20) can0_tx_yk();
//can0_rxcl
if(can0_buf_rxaddr == can0_buf_rxpaddr)
{
if(CSR0_HALT==1)
{
initcan0();
//CSR0_HALT=0;
//can0_tx_time();
}
return;
}
can0_len=can0_rx_buf(can0_buf_rxpaddr+0);
fun0_code=(can0_rx_buf(can0_buf_rxpaddr+1) & 0x7f)<<1;//变量未定义
t1=can0_rx_buf(can0_buf_rxpaddr+2);
if(t1 & 0x80)
fun0_code|=0x01;
else
fun0_code&=0xfe;//完成命令码的取存
t2=can0_rx_buf(can0_buf_rxpaddr+3);
if(t2 & 0x02)
frame0_flag=1;//后续侦标志
else
frame0_flag=0;
ml0_unit=(can0_rx_buf(can0_buf_rxpaddr+3)>>2) & 0x3f;
if(t1 & 0x01)
ml0_unit|=0x40;
else
ml0_unit&=0x3f;//完成单元号的取存
frame0_no=(can0_rx_buf(can0_buf_rxpaddr+4)>>3) & 0x1f;
if(t2 & 0x01)
frame0_no|=0x20;
else
frame0_no&=0x1f;//完成侦号的取存
// stat0=(can0_rx_buf(can0_buf_rxpaddr+3)); //03-1-27
switch(fun0_code)
{
case 0x3c : can0_yx();break;//yx
case 0x3d : can0_yc();break;//yc
case 0x3e : can0_dd();break;//电能
}
can0_buf_rxpaddr+=13;
if(can0_buf_rxpaddr>=1300)
can0_buf_rxpaddr=0;
// if(stat0 & 0x04) can0_tx_time(); //03-1-27
}
////CAN0接收中断
__interrupt void can0_rx (void)
{
IO_BYTE a;
if(RCR0_RC0==1)
{
a=ROVRR0_ROVR0;//判断超载否
ROVRR0_ROVR0=0;
if(a==0)
{
Data0=IDRX0(0);//11ID 标识符
Len0 = DLCR0(0)&0X0F;//帧长度
can0_rx_buf(can0_buf_rxaddr+0) = Len0 ;
can0_rx_buf(can0_buf_rxaddr+1)=Data0&0xff;
can0_rx_buf(can0_buf_rxaddr+2)=(Data0>>8)&0xff;
can0_rx_buf(can0_buf_rxaddr+3)=(Data0>>16)&0xff;
can0_rx_buf(can0_buf_rxaddr+4)=(Data0>>24)&0xff;
for (pos0=0; pos0<Len0;pos0++)
{
can0_rx_buf(can0_buf_rxaddr+5+pos0) =DTR0_BYTE(0,pos0);
}
////////////////////////////////////////
can0_buf_rxaddr+=13;
if(can0_buf_rxaddr>=1300)
{
can0_buf_rxaddr=0;
}
}//end of if(a==0)
RCR0_RC0=0;
}
else
if(RCR0_RC1==1)
{
a=ROVRR0_ROVR1;//判断超载否
ROVRR0_ROVR1=0;
if(a==0)
{
Data0=IDRX0(1);//11ID 标识符
Len0 = DLCR0(1)&0X0F;//帧长度
can0_rx_buf(can0_buf_rxaddr+0) = Len0 ;
can0_rx_buf(can0_buf_rxaddr+1)=Data0&0xff;
can0_rx_buf(can0_buf_rxaddr+2)=(Data0>>8)&0xff;
can0_rx_buf(can0_buf_rxaddr+3)=(Data0>>16)&0xff;
can0_rx_buf(can0_buf_rxaddr+4)=(Data0>>24)&0xff;
for (pos0=0; pos0<Len0;pos0++)
{
can0_rx_buf(can0_buf_rxaddr+5+pos0) =DTR0_BYTE(1,pos0);
}
////////////////////////////////////////
can0_buf_rxaddr+=13;
if(can0_buf_rxaddr>=1300)
{
can0_buf_rxaddr=0;
}
}//end of if(a==0)
RCR0_RC1=0;
}
else
if(RCR0_RC2==1)
{
a=ROVRR0_ROVR2;//判断超载否
ROVRR0_ROVR2=0;
if(a==0)
{
Data0=IDRX0(2);//11ID 标识符
Len0 = DLCR0(2)&0X0F;//帧长度
can0_rx_buf(can0_buf_rxaddr+0) = Len0 ;
can0_rx_buf(can0_buf_rxaddr+1)=Data0&0xff;
can0_rx_buf(can0_buf_rxaddr+2)=(Data0>>8)&0xff;
can0_rx_buf(can0_buf_rxaddr+3)=(Data0>>16)&0xff;
can0_rx_buf(can0_buf_rxaddr+4)=(Data0>>24)&0xff;
for (pos0=0; pos0<Len0;pos0++)
{
can0_rx_buf(can0_buf_rxaddr+5+pos0) =DTR0_BYTE(2,pos0);
}
////////////////////////////////////////
can0_buf_rxaddr+=13;
if(can0_buf_rxaddr>=1300)
{
can0_buf_rxaddr=0;
}
}//end of if(a==0)
RCR0_RC2=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -