⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can0.c

📁 关于与计算机超级终端通讯的小程序.(RS232)
💻 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 + -