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

📄 can1.c

📁 关于与计算机超级终端通讯的小程序.(RS232)
💻 C
📖 第 1 页 / 共 2 页
字号:
//-------------------------------------

//------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 + (yk_fm_para(yk_dx*4+1)<<9);
			else
			if(yk_xz==0xcc)//合
			DTR1_WORD(1,0)=0X0200 + (yk_fm_para(yk_dx*4+1)<<9);
	        }
	        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 + (yk_fm_para(yk_dx*4+1)<<9);
			else
			if(yk_xz==0xcc)//合
			DTR1_WORD(1,0)=0X0200 + (yk_fm_para(yk_dx*4+1)<<9);
	        }
	        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 + (yk_fm_para(yk_dx*4+1)<<9);
			else
			if(yk_xz==0xcc)//合
			DTR1_WORD(1,0)=0X0200 + (yk_fm_para(yk_dx*4+1)<<9);

	     }

	     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;
  
  IO_WORD test_year; 
  //can1_txcl

	if((sys_minute%2==0)&&(sys_second%37==0)){ can1_tx_time();return;}
	if(can_mask&0x20) can1_tx_yk();
	//^o^
	if(cdt_dzh&0x01)
	{//dz_cl(dzh_len+1,&dzh_2l_1(6),&dzh_1l(0)); 
	can1_tx_sdz();//传定值
	}
	if(cdt_dzh&0x02) can1_tx_wdz();//写定值
	if(cdt_dzh&0x04) can1_tx_rdz();//读定值
	//
	test_year= sys_year | 0x7d0;
	//
        if((test_year%4==0 && test_year%100 !=0 ) || test_year%400 == 0)
        {
        time_s.dw=SecondInMonth[0][sys_month-1]+
        	  (sys_day-1) * 86400 + SecondInHour[sys_hour] + sys_minute * 60 + sys_second;
        }
        else
        {
         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 : can1_dd();break;//电能
		case 0x20 : can1_tx_time();break;//发对时
		case 0x27 : can1_sdz();
			    if(frame_flag==0)
			    {dz_cl(dzh_len,&dzh_1l(0),&dzh_2l_1(6));
			    cdt_dzh|=0x88;
			    }
			    break;//定值 ^o^
		case 0x28 : cdt_dzh|=0x90;break;
		case 0x29 : can1_rdz();
			    if(frame_flag==0)
			    {dz_cl(dzh_len,&dzh_1l(0),&dzh_2l_1(6));
			    cdt_dzh|=0xa0;
			    }
			    break;



	}
	can1_buf_rxpaddr+=13;
	if(can1_buf_rxpaddr>=1300)
	can1_buf_rxpaddr=0;


///------tx-----------

	}
////////////////// 定值
//-------------------------------------------
//
void	can1_tx_sdz(void)//主板应用 传定值发送
{
	IO_LWORD w1;
//	IO_BYTE frame_num,frame_count;
//	IO_BYTE dz_n_bak;
	
	if((cantx_tout>100)||(TCR1_TC1==1))
	{
		TCR1_TC1=0;
	
	
	
	if(frame_num==0)
	{
		
		dz_cl(dzh_len+1,&dzh_2l_1(6),&dzh_1l(0));
		
	     frame_num=(dzh_len+7)/8;//yc_num未定义 
	     frame_count=0;
	     dz_n_bak=dzh_len+1;
	
	
	
		w1=frame_count;
		IDRX1(1)=dz_id;//单元号
		if(dz_n_bak>8)
		{
		  dz_n_bak-=8;
	
		  DLCR1(1)=8;
		  //IDRX1(1)=dzh_1l(0);//单元号
		  //有后续
		  IDRX1(1)=(IDRX1(1)<<18) | 0X00028003 | (w1<<27);
  		  //单元号 或 命令码 或 帧号
		}
		else
		{//无后续
		  DLCR1(1)=dz_n_bak;
		  IDRX1(1)=(IDRX1(1)<<18) | 0X00008003 | (w1<<27);
  		  //单元号 或 命令码 或 帧号
		}
		  
		  
		  DTR1_WORD(1,0)=dzh_1lx(frame_count*4+0);
		  DTR1_WORD(1,1)=dzh_1lx(frame_count*4+1);
		  DTR1_WORD(1,2)=dzh_1lx(frame_count*4+2);
		  DTR1_WORD(1,3)=dzh_1lx(frame_count*4+3);
		   
		  TREQR1_TREQ1=1;
		  cantx_tout=0;
		  WDTC_WTE=0;
		  while (   TREQR1_TREQ1                /* ^o^ 新加入的 <<< wait until trx is completed  */
        		   && ! CSR1_HALT                 /* ^o^ or busoff                        */
         		  && (cantx_tout < TIMEOUT) );    /* ^o^  or timeout                       */

//   		 if (cantx_tout == TIMEOUT)               /* ^o^ if timeout...                    */
//    		  TCANR1_TCAN1 = 1 ; 
		  
		  __wait_nop();
		  __wait_nop();
		  
		  frame_num--;
		  frame_count++;
		   	
	}
	else
	{
		w1=frame_count;
		IDRX1(1)=dz_id;//单元号
		if(dz_n_bak>8)
		{
		  dz_n_bak-=8;
	
		  DLCR1(1)=8;
		  //IDRX1(1)=dzh_1l(0);//单元号
		  //有后续
		  IDRX1(1)=(IDRX1(1)<<18) | 0X00028003 | (w1<<27);
  		  //单元号 或 命令码 或 帧号
		}
		else
		{//无后续
		  DLCR1(1)=dz_n_bak;
		  IDRX1(1)=(IDRX1(1)<<18) | 0X00008003 | (w1<<27);
  		  //单元号 或 命令码 或 帧号
		}
		  
		  
		  DTR1_WORD(1,0)=dzh_1lx(frame_count*4+0);
		  DTR1_WORD(1,1)=dzh_1lx(frame_count*4+1);
		  DTR1_WORD(1,2)=dzh_1lx(frame_count*4+2);
		  DTR1_WORD(1,3)=dzh_1lx(frame_count*4+3);
		   
		  TREQR1_TREQ1=1;
		  cantx_tout=0;
		  WDTC_WTE=0;
		  while (   TREQR1_TREQ1                /* ^o^ 新加入的 <<< wait until trx is completed  */
        		   && ! CSR1_HALT                 /* ^o^ or busoff                        */
         		  && (cantx_tout < TIMEOUT) );    /* ^o^  or timeout                       */

//   		 if (cantx_tout == TIMEOUT)               /* ^o^ if timeout...                    */
//    		  TCANR1_TCAN1 = 1 ; 
		  
		  __wait_nop();
		  __wait_nop();
		  
		  frame_num--;
		  frame_count++;
		  
		  if(frame_num==0) cdt_dzh&=0xfe;
	}
	}
}	
//注意:ID地址,定值组号,定值长度,定值的两个区
//定值类型,CRC校验
//
//-------------------------------------------------------
void	dz_cl(IO_BYTE len,IO_BYTE *s,IO_BYTE *d )//定值的处理,低高字节的倒数
{/*     len 是定值的长度; *s 是定值源区; *d 是定值目标区 */
	IO_BYTE i;
	IO_BYTE v=1,w;
	
	w=2*(2*v-1);
	
	for(i=0;i<len;i++)
	{
		*(d+w-1-i)=*(s+i);
		
		if((i+1)%2==0)
		{
			v=v+1;
			w=2*(2*v-1);
		}
	}
	
	
}	
// dz_cl(dz_len,&dz_1l(0),&dz_2l(0));  例子	
void	can1_tx_wdz(void)//写定值
{
	//IO_BYTE b1;
	
	cdt_dzh&=0xfd;
	
	IDRX1(1)=dz_id & 0x3f;// 单元号
		
	DLCR1(1)      = 2;		// data length
	IDRX1(1)      = (IDRX1(1)<<18) | 0x00000004;//命令码是0x04
	
	DTR1_WORD(1,0) = 0x0000; //
	

	TREQR1_TREQ1 = 1;
	
}
//--------------------------------------------------------
void	can1_tx_rdz(void)//读定值
{
	cdt_dzh&=0xfb;
	
	IDRX1(1)=dz_id & 0x3f;// 单元号
		
	DLCR1(1)      = 2;		// data length
	IDRX1(1)      = (IDRX1(1)<<18) | 0x00008004;//命令码是0x04
	
	DTR1_WORD(1,0) = 0x0000; //
	

	TREQR1_TREQ1 = 1;
}
//-----------------------------------------------------------
void	can1_rdz(void)//读定值 回送
{
	IO_BYTE i;
	IO_WORD a;//偏移量为字型

	a=frame_no*8;
	if(frame_no==0) dzh_len=0;
	  dzh_len+=can1_len;
	  
	for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
	{
		dzh_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);
	
	}

}
//------------------------------------------
//-----------------------------------------------------------
void	can1_sdz(void)//读定值 回送
{
	IO_BYTE i;
	IO_WORD a;//偏移量为字型

	a=frame_no*8;
	if(frame_no==0) dzh_len=0;
	  dzh_len+=can1_len;
	  
	for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
	{
		dzh_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);
	
	}

}
//---------------------------------------------
__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 + -