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

📄 stepbystep.lst

📁 SJA1000_CAN协议,目前该通信协议主要应用于汽车方面,它具有较好的稳定性和纠错能力.
💻 LST
📖 第 1 页 / 共 3 页
字号:
 249   1      		do
 250   1      		{ 
 251   2      		 temp=*SJA1000_ADDRESS;               //读出当前状态
 252   2      		}while(!(temp&SJA1000_SENT_OVER));	  //如正在发送,则等待
 253   1      			     	   
 254   1            do
 255   1              {
 256   2               SJA1000_ADDRESS=SJA1000_STATE;
 257   2      		 temp=*SJA1000_ADDRESS;               //读出当前状态	
 258   2              }		   
 259   1            while(!(temp&SJA1000_SENT_LOCK));       //如发送缓冲区被锁定,则等待释放        
 260   1      
 261   1      	     SJA1000_ADDRESS=SJA1000_TXBUF;
 262   1           for(j=0;j<11;j++)                            //发送到CAN缓冲区
 263   1              {
 264   2               *(SJA1000_ADDRESS+j)=CAN_TXD_BUF[j];   
 265   2              }
 266   1           SJA1000_ADDRESS=SJA1000_COMMAND;             //指向命令寄存器
 267   1           *SJA1000_ADDRESS=SJA1000_SENT_COMMAND;       //发送请求命令
 268   1      	 LED2=1;
 269   1      }
 270          
 271          void sja1000_receiving () interrupt 0 using 0
 272          {
 273   1      	receive_err=1;
 274   1      //	SJA1000_RECEIVE_IN_INTERR();
 275   1      	return;
 276   1      }
 277          
 278          void SJA1000_RECEIVE()
 279          {
 280   1      	  unsigned char data can_temp,j,k,Length;
 281   1      	  bit FF,RTR;
 282   1           	 
 283   1            receive_err=0;
 284   1      	  LED2=0;;	
 285   1      
 286   1      	  	SJA1000_ADDRESS=SJA1000_STATE;                       //指向状态寄存器
 287   1            	can_temp=*SJA1000_ADDRESS;	           //读状态
 288   1      
 289   1      	  if(can_temp&SJA1000_BUS_ERR)  //0xc3                        //检查总线状态是否有错
 290   1              {
 291   2               if(can_temp&SJA1000_BUS_CLOSE)  //0x80                  //检查是否是总线关闭状态
 292   2                 {          	
 293   3                  SJA1000_ADDRESS=SJA1000_INTERR;                //读中断寄存器,清除总线错误中断
 294   3                  can_temp=*SJA1000_ADDRESS;
 295   3      			for(k=0;k<255;k++)
 296   3      				for(j=0;j<255;j++)
 297   3      					;
 298   3      					;
 299   3      			k=0;
 300   3      			j=0;       
 301   3                  SJA1000_ADDRESS=SJA1000_MODEL;                 //指向模式寄存器
 302   3                  *SJA1000_ADDRESS=SJA1000_WORK_MODEL;           //设置双滤波接收,进入工作模式
 303   3                  while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL);    //等待进入工作模式
C51 COMPILER V6.12  STEPBYSTEP                                                             09/16/2007 21:44:56 PAGE 6   

 304   3                 }
 305   2               else
 306   2                   {
 307   3                    SJA1000_ADDRESS=SJA1000_INTERR;              //读中断寄存器,检查中断类型
 308   3                    can_temp=*SJA1000_ADDRESS;
 309   3      			  
 310   3      
 311   3                    if(can_temp&SJA1000_DATA_OVER_INTERR) //0x08       //检查是否是数据溢出中断      
 312   3                      {
 313   4                       SJA1000_ADDRESS=SJA1000_COMMAND;          //指向命令寄存器
 314   4                       *SJA1000_ADDRESS=SJA1000_CLEAR_DATA_OVER; //清除数据溢出               
 315   4                      }
 316   3                    else
 317   3                        { 
 318   4      					if(can_temp&SJA1000_RI_INTERR)          //检查是否是接收中断      
 319   4                           {
 320   5                            	SJA1000_ADDRESS=SJA1000_RXBUF;       //指向接收数据寄存器首址
 321   5                            	CAN_RXD_BUF[0]=*SJA1000_ADDRESS;           //读RX帧信息 
 322   5      
 323   5      						FF=CAN_RXD_BUF[0]&0x80;					  //格式
 324   5      					  	RTR=CAN_RXD_BUF[0]&0x40;				  //远程?
 325   5      					  	Length=CAN_RXD_BUF[0]&0x0F;				  //长度
 326   5      					  	if(Length>0x08)
 327   5      					  		Length=0x08;
 328   5      					  	SJA1000_ADDRESS++;
 329   5      					  	CAN_RXD_BUF[1]=*SJA1000_ADDRESS;
 330   5      
 331   5      					  	SJA1000_ADDRESS++;
 332   5      					  	CAN_RXD_BUF[2]=*SJA1000_ADDRESS;
 333   5      
 334   5      					  	if(FF)
 335   5      					  	{
 336   6      							SJA1000_ADDRESS++;
 337   6      							CAN_RXD_BUF[3]=*SJA1000_ADDRESS;
 338   6      							SJA1000_ADDRESS++;
 339   6      							CAN_RXD_BUF[4]=*SJA1000_ADDRESS;
 340   6      						}                
 341   5      					  	for(i=0;i<Length;i++)
 342   5      					  	{
 343   6      					  		if(FF)
 344   6      							{
 345   7      								SJA1000_ADDRESS++;
 346   7      								CAN_RXD_BUF[i+5]=*SJA1000_ADDRESS;
 347   7      							}
 348   6      							else
 349   6      							{
 350   7      								SJA1000_ADDRESS++;
 351   7      								CAN_RXD_BUF[i+3]=*SJA1000_ADDRESS;
 352   7      							}
 353   6      					  	}
 354   5      						if(FF)
 355   5      						{
 356   6      							can_length=Length+5;
 357   6      						}
 358   5      						else
 359   5      						{
 360   6      							can_length=Length+3;
 361   6      						} 
 362   5      						     
 363   5                            	SJA1000_ADDRESS=SJA1000_COMMAND;          //指向命令寄存器 
 364   5                            	*SJA1000_ADDRESS=SJA1000_RELEASE_FIFO;    //释放接收缓冲器
 365   5      							receive_succeed=1;   
C51 COMPILER V6.12  STEPBYSTEP                                                             09/16/2007 21:44:56 PAGE 7   

 366   5                           	if(RTR)					  
 367   5                              	receive_succeed=1;                      //置接收成功标志
 368   5                           }
 369   4      					 else
 370   4      					 {
 371   5      					  	receive_succeed=0;
 372   5      					  	SJA1000_ADDRESS=SJA1000_COMMAND;          //指向命令寄存器
 373   5                            	*SJA1000_ADDRESS=SJA1000_RELEASE_FIFO;    //释放接收缓冲区
 374   5                            	SJA1000_ADDRESS=SJA1000_ALC;	        //指向仲裁丢失寄存器
 375   5                            	can_temp=*SJA1000_ADDRESS;                //通过读取清除
 376   5                            	SJA1000_ADDRESS=SJA1000_ECC;	        //指向错误捕捉寄存器
 377   5                            	can_temp=*SJA1000_ADDRESS;                //通过读取清除 
 378   5      					}
 379   4                        }  	
 380   3      			}	  		
 381   2              }
 382   1      		SJA1000_ADDRESS=SJA1000_INTERR;              //读中断寄存器,检查中断类型
 383   1              can_temp=*SJA1000_ADDRESS; 
 384   1      		can_temp=*SJA1000_ADDRESS;
 385   1      		ET1=1;
 386   1      		LED2=1;
 387   1      }
 388          
 389          void extern1 () interrupt 1 using 0
 390          {
 391   1      	 ;																	    
 392   1      }
 393          
 394          void TTO () interrupt 2 using 0
 395          {
 396   1      	TL0=0;
 397   1      	TH0=0;
 398   1      	receive_count++;
 399   1      	TR0=1;
 400   1      	return;
 401   1      } 
 402          
 403          void URT_INTERR()	interrupt 4	using 0
 404          {
 405   1      	LED1=0;;
 406   1      	if(RI)
 407   1      	{
 408   2      		EX0=0;
 409   2      		RI=0;
 410   2      		TR0=1;		
 411   2      		r_buf[i]=SBUF;
 412   2      		i++;
 413   2      		if(i>=r_buf[0])
 414   2      		{
 415   3      			REN=0;
 416   3      			i=0;
 417   3      			EX0=1;
 418   3      		}
 419   2      	}
 420   1      	if(TI)
 421   1      	{
 422   2      		EX0=0;
 423   2      		TI=0;
 424   2      //		P2=0x61;
 425   2      	}
 426   1      	LED1=1;
 427   1      }
C51 COMPILER V6.12  STEPBYSTEP                                                             09/16/2007 21:44:56 PAGE 8   

 428          
 429          void T1_Int()	interrupt 3	using 0
 430          {
 431   1      	TR1=0;
 432   1      	TH1=0xc0;
 433   1      	TL1=0xff;
 434   1      	SBUF=t_buf[l];
 435   1      	l++;
 436   1      	TR1=1;					    
 437   1      }
 438          
 439          void SetBaund()
 440          {
 441   1      	EA=0;
 442   1      	TR2=0;
 443   1      	PCON=0x50;
 444   1      	T2CON=0x30;
 445   1      	RCAP2H=0xFF;
 446   1      	RCAP2L=0xE8;
 447   1      	SCON=0x50;
 448   1      	EA=1;
 449   1      	ACC=SBUF;
 450   1      	ACC=SBUF;
 451   1      	TR2=1;
 452   1      	return;			     
 453   1      }
 454          
 455          void MCU_SENT_TO_CAN()
 456          {
 457   1      	unsigned char i;
 458   1      	CAN_TXD_BUF[0]=0x08;
 459   1      	for(i=1;i<11;i++)
 460   1      	{
 461   2      		CAN_TXD_BUF[i]=r_buf[i+1];
 462   2      	} 
 463   1          SJA1000_SEND();
 464   1      }
 465          									     
 466          void URT_SENT()
 467          {
 468   1      	for(i=0;i<14;i++)
 469   1      	{
 470   2      		t_buf[i]=r_buf[i];
 471   2      	}
 472   1      	l=0;
 473   1      	i=0;
 474   1      	TH1=0xa0;
 475   1      	TL1=0x00;
 476   1      	ET1=1;
 477   1      	REN=0;
 478   1      	EX0=0;
 479   1      	ET1=1;
 480   1      	ES=1;
 481   1      	TR1=1;
 482   1      	while(l<t_buf[0])
 483   1      	;
 484   1      	for(l=0;l<16;l++)
 485   1      	{
 486   2      		t_buf[l]=0;
 487   2      	}
 488   1      	l=0;
 489   1      	TR1=0;
C51 COMPILER V6.12  STEPBYSTEP                                                             09/16/2007 21:44:56 PAGE 9   

 490   1      	ET1=0;
 491   1      	REN=1;
 492   1      	EX0=1;
 493   1      } 
 494          /*
 495          void URT_SENDIN()		//URT SENDING...
 496          {
 497          	P2=0x66;
 498          	TI=0;
 499          }*/	  
 500          
 501          void checklink()
 502          {
 503   1      	if(r_buf[1]=='L')
 504   1      	{
 505   2      		link=1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -