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

📄 stepbystep.lst

📁 SJA1000_CAN协议,目前该通信协议主要应用于汽车方面,它具有较好的稳定性和纠错能力.
💻 LST
📖 第 1 页 / 共 3 页
字号:
 506   2      	}
 507   1      	else
 508   1      	{
 509   2      		link=0;
 510   2      	}
 511   1      	return;
 512   1      }
 513          
 514          unsigned char wait_data()
 515          {
 516   1      	i=0;
 517   1      	while(!RI)
 518   1      		{
 519   2      			TR0=1;
 520   2      		}
 521   1      	while(REN)
 522   1      		{	
 523   2      			if(receive_count>0x80)		   //超时等待2S;
 524   2      				{
 525   3      					for(i=0;i<14;i++)
 526   3      						{
 527   4      							r_buf[i]=0;
 528   4      						}
 529   3      					i=0;
 530   3      					TR0=0;
 531   3      					receive_count=0;
 532   3      					return 0;
 533   3      				}					  
 534   2      		}					
 535   1      		TR0=0;
 536   1      		receive_count=0;
 537   1      		return 1;
 538   1      }
 539          
 540          void INIT_SJA1000_CYC()
 541          {
 542   1      	  SJA1000_ADDRESS=SJA1000_MODEL;	              //指向模式寄存器
 543   1            *SJA1000_ADDRESS=SJA1000_RESET_MODEL;           //进入复位模式
 544   1             
 545   1            while(!(*SJA1000_ADDRESS&SJA1000_RESET_MODEL)); //等待进入复位模式
 546   1            
 547   1      /*      SJA1000_ADDRESS=SJA1000_CLOCKDIR;	              //指向时钟分频寄存器 
 548   1            *SJA1000_ADDRESS=SJA1000_CDR_COMMAND;           //使用Peli CAN模式,CLOCK使用2分频输出
 549   1            
 550   1          SJA1000_ADDRESS=SJA1000_ENINTERR;	              //指向中断使能寄存器 
 551   1            *SJA1000_ADDRESS=SJA1000_IER_COMMAND;           //开放接收,数据溢出,错误报警中断
C51 COMPILER V6.12  STEPBYSTEP                                                             09/16/2007 21:44:56 PAGE 10  

 552   1           
 553   1            SJA1000_ADDRESS=SJA1000_OUTCONTR;               //指向输出控制寄存器
 554   1            *SJA1000_ADDRESS=SJA1000_OUT_COMMAND;           //正常输出模式			   
 555   1            
 556   1            SJA1000_ADDRESS=SJA1000_BUSTIME0;              //指向总线定时0寄存器
 557   1            *SJA1000_ADDRESS=BTR0_NUM;                  //重写波特率
 558   1            SJA1000_ADDRESS=SJA1000_BUSTIME1;              //指向总线定时1寄存器 
 559   1            *SJA1000_ADDRESS=BTR1_NUM;                  //重写波特率
 560   1            
 561   1          SJA1000_ADDRESS=SJA1000_RBSA;                  //指向RX缓冲区起始地址寄存器
 562   1            *SJA1000_ADDRESS=SJA1000_FIFO_ADD;             //接收缓冲区FIFO起始为内部RAM的0地址
 563   1            
 564   1            SJA1000_ADDRESS=SJA1000_AMRRX0;                //指向验收屏蔽寄存器,所有位均参加验收
 565   1            *SJA1000_ADDRESS=AMR_CODE0;
 566   1            SJA1000_ADDRESS=SJA1000_AMRRX1;
 567   1            *SJA1000_ADDRESS=AMR_CODE1;
 568   1            SJA1000_ADDRESS=SJA1000_AMRRX2;
 569   1            *SJA1000_ADDRESS=AMR_CODE2;
 570   1            SJA1000_ADDRESS=SJA1000_AMRRX3;
 571   1            *SJA1000_ADDRESS=AMR_CODE3;  
 572   1            
 573   1            SJA1000_ADDRESS=SJA1000_ACRRX0;                //指向验收代码寄存器,送ID码
 574   1            *SJA1000_ADDRESS=ACR_ID0;
 575   1            SJA1000_ADDRESS=SJA1000_ACRRX1;
 576   1            *SJA1000_ADDRESS=ACR_ID1; 
 577   1            SJA1000_ADDRESS=SJA1000_ACRRX2;
 578   1            *SJA1000_ADDRESS=ACR_ID2; 
 579   1            SJA1000_ADDRESS=SJA1000_ACRRX3;
 580   1            *SJA1000_ADDRESS=ACR_ID3; 				*/					   		
 581   1           
 582   1            SJA1000_ADDRESS=SJA1000_TX_ERR;                //指向发送错误寄存器   
 583   1            *SJA1000_ADDRESS=SJA1000_CLEAR_TX_ERR;         //清除错误
 584   1      
 585   1            SJA1000_ADDRESS=SJA1000_RX_ERR;                //指向发送错误寄存器   
 586   1            *SJA1000_ADDRESS=SJA1000_CLEAR_TX_ERR;         //清除发送错误
 587   1            
 588   1            SJA1000_ADDRESS=SJA1000_ALC;                   //指向仲裁丢失捕捉寄存器
 589   1            temp=*SJA1000_ADDRESS;                         //通过读取清除
 590   1            
 591   1            SJA1000_ADDRESS=SJA1000_ECC;                   //指向错误代码捕捉寄存器
 592   1            temp=*SJA1000_ADDRESS;                         //通过读取清除
 593   1            
 594   1            SJA1000_ADDRESS=SJA1000_MODEL;	             //指向模式寄存器
 595   1            *SJA1000_ADDRESS=SJA1000_WORK_MODEL;           //设置双滤波接收,进入工作模式
 596   1            while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL);   //等待进入工作模式  	
 597   1      }																		  
 598          /*
 599          void checkbound()
 600          {
 601          	if(r_buf[1]=='B' && r_buf[2]=='a' && r_buf[3]=='u' && r_buf[4]=='d')
 602          	{
 603          		baund=1;
 604          	}
 605          	else
 606          	{
 607          		baund=0;
 608          	}
 609          	P2=0x6c;
 610          	return;
 611          }  */
 612          
 613          /*void SJA1000_RECEIVE_IN_INTERR()
C51 COMPILER V6.12  STEPBYSTEP                                                             09/16/2007 21:44:56 PAGE 11  

 614          {
 615          	  unsigned char data can_temp,j,k,Length;
 616          	  bit FF,RTR;
 617               	 
 618                receive_err=0;
 619          	  ET1=0;	
 620          
 621          	  	SJA1000_ADDRESS=SJA1000_STATE;                       //指向状态寄存器
 622                	can_temp=*SJA1000_ADDRESS;	                   //读状态
 623          		P2=can_temp;
 624          
 625          	  if(can_temp&SJA1000_BUS_ERR)  //0xc3                        //检查总线状态是否有错
 626                  {
 627                   if(can_temp&SJA1000_BUS_CLOSE)  //0x80                  //检查是否是总线关闭状态
 628                     {          	
 629                      SJA1000_ADDRESS=SJA1000_INTERR;                //读中断寄存器,清除总线错误中断
 630                      can_temp=*SJA1000_ADDRESS;
 631          			P2=can_temp;
 632          			for(k=0;k<255;k++)
 633          				for(j=0;j<255;j++)
 634          					;
 635          					;
 636          			k=0;
 637          			j=0;       
 638                      SJA1000_ADDRESS=SJA1000_MODEL;                 //指向模式寄存器
 639                      *SJA1000_ADDRESS=SJA1000_WORK_MODEL;           //设置双滤波接收,进入工作模式
 640                      while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL);    //等待进入工作模式
 641                     }
 642                   else
 643                       {
 644                        SJA1000_ADDRESS=SJA1000_INTERR;              //读中断寄存器,检查中断类型
 645                        can_temp=*SJA1000_ADDRESS; 
 646          
 647                        if(can_temp&SJA1000_DATA_OVER_INTERR) //0x08       //检查是否是数据溢出中断      
 648                          {
 649                           SJA1000_ADDRESS=SJA1000_COMMAND;          //指向命令寄存器
 650                           *SJA1000_ADDRESS=SJA1000_CLEAR_DATA_OVER; //清除数据溢出               
 651                          }
 652                        else
 653                            { 
 654          					if(can_temp&SJA1000_RI_INTERR)          //检查是否是接收中断      
 655                               {
 656                                	SJA1000_ADDRESS=SJA1000_RXBUF;       //指向接收数据寄存器首址
 657                                	CAN_RXD_BUF[0]=*SJA1000_ADDRESS;           //读RX帧信息 
 658          					  	FF=CAN_RXD_BUF[0]&0x80;
 659          					  	RTR=CAN_RXD_BUF[0]&0x40;
 660          					  	Length=CAN_RXD_BUF[0]&0x0F;
 661          					  	if(Length>0x08)
 662          					  		Length=0x08;
 663          					  	SJA1000_ADDRESS++;
 664          					  	CAN_RXD_BUF[1]=*SJA1000_ADDRESS;
 665          					  	SJA1000_ADDRESS++;
 666          					  	CAN_RXD_BUF[2]=*SJA1000_ADDRESS;
 667          					  	if(FF)
 668          					  	{
 669          							SJA1000_ADDRESS++;
 670          							CAN_RXD_BUF[3]=*SJA1000_ADDRESS;
 671          							SJA1000_ADDRESS++;
 672          							CAN_RXD_BUF[4]=*SJA1000_ADDRESS;
 673          						}                
 674          					  	for(i=0;i<Length;i++)
 675          					  	{
C51 COMPILER V6.12  STEPBYSTEP                                                             09/16/2007 21:44:56 PAGE 12  

 676          					  		if(FF)
 677          							{
 678          								SJA1000_ADDRESS++;
 679          								CAN_RXD_BUF[i+5]=*SJA1000_ADDRESS;
 680          							}
 681          							else
 682          							{
 683          								SJA1000_ADDRESS++;
 684          								CAN_RXD_BUF[i+3]=*SJA1000_ADDRESS;
 685          							}
 686          					  	}
 687          						if(FF)
 688          						{
 689          							can_length=Length+5;
 690          						}
 691          						else
 692          						{
 693          							can_length=Length+3;
 694          						}               
 695                                	SJA1000_ADDRESS=SJA1000_COMMAND;          //指向命令寄存器 
 696                                	*SJA1000_ADDRESS=SJA1000_RELEASE_FIFO;    //释放接收缓冲器
 697          							receive_succeed=1;   
 698                               	if(RTR)					  
 699                                  	receive_succeed=1;                      //置接收成功标志
 700          						for(i=0;i<14;i++)
 701          								{
 702          									 P2=CAN_RXD_BUF[i];
 703          									 for(j=0;j<255;j++)
 704          									 	for(k=0;k<255;k++)
 705          											for(l=0;l<8;l++)
 706          												;
 707          								}
 708                               }
 709          					 else
 710          					 {
 711          					  	receive_succeed=0;
 712          					  	SJA1000_ADDRESS=SJA1000_COMMAND;          //指向命令寄存器
 713                                	*SJA1000_ADDRESS=SJA1000_RELEASE_FIFO;    //释放接收缓冲区
 714                                	SJA1000_ADDRESS=SJA1000_ALC;	        //指向仲裁丢失寄存器
 715                                	can_temp=*SJA1000_ADDRESS;                //通过读取清除
 716                                	SJA1000_ADDRESS=SJA1000_ECC;	        //指向错误捕捉寄存器
 717                                	can_temp=*SJA1000_ADDRESS;                //通过读取清除 
 718          					}
 719                            }  	
 720          			}	  		
 721                  }
 722          		SJA1000_ADDRESS=SJA1000_INTERR;              //读中断寄存器,检查中断类型
 723                  can_temp=*SJA1000_ADDRESS; 
 724          		can_temp=*SJA1000_ADDRESS;
 725          		ET1=1;
 726          		return;	   
 727          }	*/
 728          /*
 729          void changebound()
 730          {
 731          	TJA1050_CLOSE;
 732          
 733          	SJA1000_ADDRESS=SJA1000_MODEL;	              //指向模式寄存器
 734              *SJA1000_ADDRESS=SJA1000_RESET_MODEL;           //进入复位模式
 735              while(!(*SJA1000_ADDRESS&SJA1000_RESET_MODEL)); //等待进入复位模式
 736          
 737          	SJA1000_ADDRESS=SJA1000_BUSTIME0;              //指向总线定时0寄存器
C51 COMPILER V6.12  STEPBYSTEP                                                             09/16/2007 21:44:56 PAGE 13  

 738              *SJA1000_ADDRESS=BTR0_NUM;                  //选择100Kbps
 739              SJA1000_ADDRESS=SJA1000_BUSTIME1;              //指向总线定时1寄存器 
 740              *SJA1000_ADDRESS=BTR1_NUM;                  //选择100Kbps
 741          
 742              SJA1000_ADDRESS=SJA1000_MODEL;	             //指向模式寄存器
 743              *SJA1000_ADDRESS=SJA1000_WORK_MODEL;           //设置双滤波接收,进入工作模式
 744              while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL);   //等待进入工作模式    
 745          	
 746          	TJA1050_WORK;
 747          }	  */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1465    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     70    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      9       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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