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

📄 can1.c

📁 关于电力CDT规约的程序.超值啊!对于学习CDT的有帮助.
💻 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 + -