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

📄 stepbystep.c

📁 SJA1000_CAN协议,目前该通信协议主要应用于汽车方面,它具有较好的稳定性和纠错能力.
💻 C
📖 第 1 页 / 共 2 页
字号:
                      	can_temp=*SJA1000_ADDRESS;                //通过读取清除
                      	SJA1000_ADDRESS=SJA1000_ECC;	        //指向错误捕捉寄存器
                      	can_temp=*SJA1000_ADDRESS;                //通过读取清除 
					}
                  }  	
			}	  		
        }
		SJA1000_ADDRESS=SJA1000_INTERR;              //读中断寄存器,检查中断类型
        can_temp=*SJA1000_ADDRESS; 
		can_temp=*SJA1000_ADDRESS;
		ET1=1;
		LED2=1;
}

void extern1 () interrupt 1 using 0
{
	 ;																	    
}

void TTO () interrupt 2 using 0
{
	TL0=0;
	TH0=0;
	receive_count++;
	TR0=1;
	return;
} 

void URT_INTERR()	interrupt 4	using 0
{
	LED1=0;;
	if(RI)
	{
		EX0=0;
		RI=0;
		TR0=1;		
		r_buf[i]=SBUF;
		i++;
		if(i>=r_buf[0])
		{
			REN=0;
			i=0;
			EX0=1;
		}
	}
	if(TI)
	{
		EX0=0;
		TI=0;
//		P2=0x61;
	}
	LED1=1;
}

void T1_Int()	interrupt 3	using 0
{
	TR1=0;
	TH1=0xc0;
	TL1=0xff;
	SBUF=t_buf[l];
	l++;
	TR1=1;					    
}

void SetBaund()
{
	EA=0;
	TR2=0;
	PCON=0x50;
	T2CON=0x30;
	RCAP2H=0xFF;
	RCAP2L=0xE8;
	SCON=0x50;
	EA=1;
	ACC=SBUF;
	ACC=SBUF;
	TR2=1;
	return;			     
}

void MCU_SENT_TO_CAN()
{
	unsigned char i;
	CAN_TXD_BUF[0]=0x08;
	for(i=1;i<11;i++)
	{
		CAN_TXD_BUF[i]=r_buf[i+1];
	} 
    SJA1000_SEND();
}
									     
void URT_SENT()
{
	for(i=0;i<14;i++)
	{
		t_buf[i]=r_buf[i];
	}
	l=0;
	i=0;
	TH1=0xa0;
	TL1=0x00;
	ET1=1;
	REN=0;
	EX0=0;
	ET1=1;
	ES=1;
	TR1=1;
	while(l<t_buf[0])
	;
	for(l=0;l<16;l++)
	{
		t_buf[l]=0;
	}
	l=0;
	TR1=0;
	ET1=0;
	REN=1;
	EX0=1;
} 
/*
void URT_SENDIN()		//URT SENDING...
{
	P2=0x66;
	TI=0;
}*/	  

void checklink()
{
	if(r_buf[1]=='L')
	{
		link=1;
	}
	else
	{
		link=0;
	}
	return;
}

unsigned char wait_data()
{
	i=0;
	while(!RI)
		{
			TR0=1;
		}
	while(REN)
		{	
			if(receive_count>0x80)		   //超时等待2S;
				{
					for(i=0;i<14;i++)
						{
							r_buf[i]=0;
						}
					i=0;
					TR0=0;
					receive_count=0;
					return 0;
				}					  
		}					
		TR0=0;
		receive_count=0;
		return 1;
}

void INIT_SJA1000_CYC()
{
	  SJA1000_ADDRESS=SJA1000_MODEL;	              //指向模式寄存器
      *SJA1000_ADDRESS=SJA1000_RESET_MODEL;           //进入复位模式
       
      while(!(*SJA1000_ADDRESS&SJA1000_RESET_MODEL)); //等待进入复位模式
      
/*      SJA1000_ADDRESS=SJA1000_CLOCKDIR;	              //指向时钟分频寄存器 
      *SJA1000_ADDRESS=SJA1000_CDR_COMMAND;           //使用Peli CAN模式,CLOCK使用2分频输出
      
    SJA1000_ADDRESS=SJA1000_ENINTERR;	              //指向中断使能寄存器 
      *SJA1000_ADDRESS=SJA1000_IER_COMMAND;           //开放接收,数据溢出,错误报警中断
     
      SJA1000_ADDRESS=SJA1000_OUTCONTR;               //指向输出控制寄存器
      *SJA1000_ADDRESS=SJA1000_OUT_COMMAND;           //正常输出模式			   
      
      SJA1000_ADDRESS=SJA1000_BUSTIME0;              //指向总线定时0寄存器
      *SJA1000_ADDRESS=BTR0_NUM;                  //重写波特率
      SJA1000_ADDRESS=SJA1000_BUSTIME1;              //指向总线定时1寄存器 
      *SJA1000_ADDRESS=BTR1_NUM;                  //重写波特率
      
    SJA1000_ADDRESS=SJA1000_RBSA;                  //指向RX缓冲区起始地址寄存器
      *SJA1000_ADDRESS=SJA1000_FIFO_ADD;             //接收缓冲区FIFO起始为内部RAM的0地址
      
      SJA1000_ADDRESS=SJA1000_AMRRX0;                //指向验收屏蔽寄存器,所有位均参加验收
      *SJA1000_ADDRESS=AMR_CODE0;
      SJA1000_ADDRESS=SJA1000_AMRRX1;
      *SJA1000_ADDRESS=AMR_CODE1;
      SJA1000_ADDRESS=SJA1000_AMRRX2;
      *SJA1000_ADDRESS=AMR_CODE2;
      SJA1000_ADDRESS=SJA1000_AMRRX3;
      *SJA1000_ADDRESS=AMR_CODE3;  
      
      SJA1000_ADDRESS=SJA1000_ACRRX0;                //指向验收代码寄存器,送ID码
      *SJA1000_ADDRESS=ACR_ID0;
      SJA1000_ADDRESS=SJA1000_ACRRX1;
      *SJA1000_ADDRESS=ACR_ID1; 
      SJA1000_ADDRESS=SJA1000_ACRRX2;
      *SJA1000_ADDRESS=ACR_ID2; 
      SJA1000_ADDRESS=SJA1000_ACRRX3;
      *SJA1000_ADDRESS=ACR_ID3; 				*/					   		
     
      SJA1000_ADDRESS=SJA1000_TX_ERR;                //指向发送错误寄存器   
      *SJA1000_ADDRESS=SJA1000_CLEAR_TX_ERR;         //清除错误

      SJA1000_ADDRESS=SJA1000_RX_ERR;                //指向发送错误寄存器   
      *SJA1000_ADDRESS=SJA1000_CLEAR_TX_ERR;         //清除发送错误
      
      SJA1000_ADDRESS=SJA1000_ALC;                   //指向仲裁丢失捕捉寄存器
      temp=*SJA1000_ADDRESS;                         //通过读取清除
      
      SJA1000_ADDRESS=SJA1000_ECC;                   //指向错误代码捕捉寄存器
      temp=*SJA1000_ADDRESS;                         //通过读取清除
      
      SJA1000_ADDRESS=SJA1000_MODEL;	             //指向模式寄存器
      *SJA1000_ADDRESS=SJA1000_WORK_MODEL;           //设置双滤波接收,进入工作模式
      while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL);   //等待进入工作模式  	
}																		  
/*
void checkbound()
{
	if(r_buf[1]=='B' && r_buf[2]=='a' && r_buf[3]=='u' && r_buf[4]=='d')
	{
		baund=1;
	}
	else
	{
		baund=0;
	}
	P2=0x6c;
	return;
}  */

/*void SJA1000_RECEIVE_IN_INTERR()
{
	  unsigned char data can_temp,j,k,Length;
	  bit FF,RTR;
     	 
      receive_err=0;
	  ET1=0;	

	  	SJA1000_ADDRESS=SJA1000_STATE;                       //指向状态寄存器
      	can_temp=*SJA1000_ADDRESS;	                   //读状态
		P2=can_temp;

	  if(can_temp&SJA1000_BUS_ERR)  //0xc3                        //检查总线状态是否有错
        {
         if(can_temp&SJA1000_BUS_CLOSE)  //0x80                  //检查是否是总线关闭状态
           {          	
            SJA1000_ADDRESS=SJA1000_INTERR;                //读中断寄存器,清除总线错误中断
            can_temp=*SJA1000_ADDRESS;
			P2=can_temp;
			for(k=0;k<255;k++)
				for(j=0;j<255;j++)
					;
					;
			k=0;
			j=0;       
            SJA1000_ADDRESS=SJA1000_MODEL;                 //指向模式寄存器
            *SJA1000_ADDRESS=SJA1000_WORK_MODEL;           //设置双滤波接收,进入工作模式
            while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL);    //等待进入工作模式
           }
         else
             {
              SJA1000_ADDRESS=SJA1000_INTERR;              //读中断寄存器,检查中断类型
              can_temp=*SJA1000_ADDRESS; 

              if(can_temp&SJA1000_DATA_OVER_INTERR) //0x08       //检查是否是数据溢出中断      
                {
                 SJA1000_ADDRESS=SJA1000_COMMAND;          //指向命令寄存器
                 *SJA1000_ADDRESS=SJA1000_CLEAR_DATA_OVER; //清除数据溢出               
                }
              else
                  { 
					if(can_temp&SJA1000_RI_INTERR)          //检查是否是接收中断      
                     {
                      	SJA1000_ADDRESS=SJA1000_RXBUF;       //指向接收数据寄存器首址
                      	CAN_RXD_BUF[0]=*SJA1000_ADDRESS;           //读RX帧信息 
					  	FF=CAN_RXD_BUF[0]&0x80;
					  	RTR=CAN_RXD_BUF[0]&0x40;
					  	Length=CAN_RXD_BUF[0]&0x0F;
					  	if(Length>0x08)
					  		Length=0x08;
					  	SJA1000_ADDRESS++;
					  	CAN_RXD_BUF[1]=*SJA1000_ADDRESS;
					  	SJA1000_ADDRESS++;
					  	CAN_RXD_BUF[2]=*SJA1000_ADDRESS;
					  	if(FF)
					  	{
							SJA1000_ADDRESS++;
							CAN_RXD_BUF[3]=*SJA1000_ADDRESS;
							SJA1000_ADDRESS++;
							CAN_RXD_BUF[4]=*SJA1000_ADDRESS;
						}                
					  	for(i=0;i<Length;i++)
					  	{
					  		if(FF)
							{
								SJA1000_ADDRESS++;
								CAN_RXD_BUF[i+5]=*SJA1000_ADDRESS;
							}
							else
							{
								SJA1000_ADDRESS++;
								CAN_RXD_BUF[i+3]=*SJA1000_ADDRESS;
							}
					  	}
						if(FF)
						{
							can_length=Length+5;
						}
						else
						{
							can_length=Length+3;
						}               
                      	SJA1000_ADDRESS=SJA1000_COMMAND;          //指向命令寄存器 
                      	*SJA1000_ADDRESS=SJA1000_RELEASE_FIFO;    //释放接收缓冲器
							receive_succeed=1;   
                     	if(RTR)					  
                        	receive_succeed=1;                      //置接收成功标志
						for(i=0;i<14;i++)
								{
									 P2=CAN_RXD_BUF[i];
									 for(j=0;j<255;j++)
									 	for(k=0;k<255;k++)
											for(l=0;l<8;l++)
												;
								}
                     }
					 else
					 {
					  	receive_succeed=0;
					  	SJA1000_ADDRESS=SJA1000_COMMAND;          //指向命令寄存器
                      	*SJA1000_ADDRESS=SJA1000_RELEASE_FIFO;    //释放接收缓冲区
                      	SJA1000_ADDRESS=SJA1000_ALC;	        //指向仲裁丢失寄存器
                      	can_temp=*SJA1000_ADDRESS;                //通过读取清除
                      	SJA1000_ADDRESS=SJA1000_ECC;	        //指向错误捕捉寄存器
                      	can_temp=*SJA1000_ADDRESS;                //通过读取清除 
					}
                  }  	
			}	  		
        }
		SJA1000_ADDRESS=SJA1000_INTERR;              //读中断寄存器,检查中断类型
        can_temp=*SJA1000_ADDRESS; 
		can_temp=*SJA1000_ADDRESS;
		ET1=1;
		return;	   
}	*/
/*
void changebound()
{
	TJA1050_CLOSE;

	SJA1000_ADDRESS=SJA1000_MODEL;	              //指向模式寄存器
    *SJA1000_ADDRESS=SJA1000_RESET_MODEL;           //进入复位模式
    while(!(*SJA1000_ADDRESS&SJA1000_RESET_MODEL)); //等待进入复位模式

	SJA1000_ADDRESS=SJA1000_BUSTIME0;              //指向总线定时0寄存器
    *SJA1000_ADDRESS=BTR0_NUM;                  //选择100Kbps
    SJA1000_ADDRESS=SJA1000_BUSTIME1;              //指向总线定时1寄存器 
    *SJA1000_ADDRESS=BTR1_NUM;                  //选择100Kbps

    SJA1000_ADDRESS=SJA1000_MODEL;	             //指向模式寄存器
    *SJA1000_ADDRESS=SJA1000_WORK_MODEL;           //设置双滤波接收,进入工作模式
    while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL);   //等待进入工作模式    
	
	TJA1050_WORK;
}	  */

⌨️ 快捷键说明

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