📄 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_WORD Data0;
__far unsigned int can0_buf_rxaddr;
__far unsigned int can0_buf_rxpaddr;
IO_BYTE ns_unit ; //单元号
IO_BYTE can0_len ; //报文长度
IO_BYTE fun0_code; //功能码
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 = 0xffff;
AMR10 = 0;
// CSR0 = 0x0080;
//--------缓存0 use receive; buffer1 use tx-------
// set frame format for messagebuffer 0
BVALR0_BVAL0 = 0; // message buffer are invalid
BVALR0_BVAL1=0;
IDER0_IDE0 = 0; // 11bit 标识符
IDER0_IDE1=0;
IDR0(0) = 0x0000;
IDR0(1)=0X00;
AMSR0_AMS0 = 2; // full bit compare
AMSR0_AMS1 =1;
TIER0_TIE0 = 0;
BVALR0_BVAL0 = 1; // message buffer are valid
BVALR0_BVAL1=1;
RIER0_RIE0=1; //允许接收中断
ROVRR0=0x00;
// set data
TREQR0_TREQ0 = 0; // no transmition
TREQR0_TREQ1=0;
RFWTR0_RFWT0 = 0; // no wait for remote requeset
RFWTR0_RFWT1=0;
TRTRR0_TRTR0 = 0; // data frame transfer
TRTRR0_TRTR1=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(cdt_ykmark0&0x10) //有遥控
{
cdt_ykmark0|=0x80; //有返校
if((c!=0))//模块号是否相等
{
cdt_ykmark0|=0x01;
cyk_mask|=0x60;
}
else
{
cdt_ykmark0|=0x02;
yk_xz=0xff;
}
}
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(cdt_ykmark0&0x10)
{
cdt_ykmark0|=0x80;
if((c!=0))
{
cdt_ykmark0|=0x04;
cyk_mask|=0x06;
}
else
cdt_ykmark0|=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_cl(void)
{//报文 先长度, 后标识符 先发送,后接收
// IO_BYTE stat0;
///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);
ns_unit=can0_rx_buf(can0_buf_rxpaddr+1) & 0x7f;//变量未定义
fun0_code=(can0_rx_buf(can0_buf_rxpaddr+2)>>5) &0x07;
// stat0=(can0_rx_buf(can0_buf_rxpaddr+3)); //03-1-27
switch(fun0_code)
{
case 0x00 : can0_yxbw();break;
case 0x02 : can0_yk();break;
case 0x03 : can0_yx();break;
case 0x04 : can0_yc();break;
}
can0_buf_rxpaddr+=11;
if(can0_buf_rxpaddr>=1100)
can0_buf_rxpaddr=0;
// if(stat0 & 0x04) can0_tx_time(); //03-1-27
}
////CAN0接收中断
__interrupt void can0_rx (void)
{
IO_BYTE a;
a=ROVRR0_ROVR0;//判断超载否
ROVRR0_ROVR0=0;
if(a==0)
{
Data0=IDR0(0);//11ID 标识符
Len0 = DLCR0(0);//帧长度
can0_rx_buf(can0_buf_rxaddr) = Len0 ;
can0_rx_buf(can0_buf_rxaddr+1)=Data0&0xff;
can0_rx_buf(can0_buf_rxaddr+2)=(Data0>>8)&0xE0;
for (pos0=0; pos0<Len0;pos0++)
{
can0_rx_buf(can0_buf_rxaddr+3+pos0) =DTR0_BYTE(0,pos0);
}
////////////////////////////////////////
can0_buf_rxaddr+=11;
if(can0_buf_rxaddr>=1100)
{
can0_buf_rxaddr=0;
}
}//end of if(a==0)
RCR0_RC0=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -