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

📄 sja_pelifunc.c

📁 Small RTOS 下SJA1000驱动程序的编写。主要介绍了在实时操作系统Small RTOS下
💻 C
📖 第 1 页 / 共 2 页
字号:
			if(ReadSJAReg(REG_CAN_ACR1) != acr1)continue;
			if(ReadSJAReg(REG_CAN_ACR2) != acr2)continue;
			if(ReadSJAReg(REG_CAN_ACR3) != acr3)continue;
			ErrorFlag=0;
			break;
		}
		if(ErrorFlag){
			status =SJA_SETACR_ERR; 
		}
		return	status;
	}
}

/*
************************************************************************************************************************
**函数原型:  char	SJASetAccMask(unsigned char	amr0,unsigned char amr1,
**							      unsigned char	amr2,unsigned char amr3  	
**							      )
**参数说明:  amr0	验收屏蔽寄存器0的设定值
**			 amr1	验收屏蔽寄存器1的设定值
**			 amr2	验收屏蔽寄存器2的设定值
**			 amr3	验收屏蔽寄存器3的设定值
**返回值:		
**           0					  ; 设置验收屏蔽寄存器成功
**			 SJA_SETAMR_ERR	  ; 设置验收屏蔽寄存器错
**			 SJA_NOTRSTMODE		  ; sja1000不在复位模式
**
**说明:     该函数用于设定报文滤波的验收屏蔽寄存器
************************************************************************************************************************
*/
char	SJASetAccMask(unsigned char	amr0,unsigned char amr1,
 				      unsigned char	amr2,unsigned char amr3  	
				      )
{
	char		status=0;
	bit			ErrorFlag=1;
	unsigned	char  	ErrorCount =0x20;				//32次,报错
	if(SJATestRstMode()){                                //处于工作模式
		status = SJA_NOTRSTMODE;			
	}
	else{
		while(--ErrorCount){
		 	WriteSJAReg(REG_CAN_AMR0,amr0);
		 	WriteSJAReg(REG_CAN_AMR1,amr1);
		 	WriteSJAReg(REG_CAN_AMR2,amr2);
		 	WriteSJAReg(REG_CAN_AMR3,amr3);
			if(ReadSJAReg(REG_CAN_AMR0) != amr0)continue;
			if(ReadSJAReg(REG_CAN_AMR1) != amr1)continue;
			if(ReadSJAReg(REG_CAN_AMR2) != amr2)continue;
			if(ReadSJAReg(REG_CAN_AMR3) != amr3)continue;
			ErrorFlag=0;
			break;
		}
		if(ErrorFlag){
			status =SJA_SETAMR_ERR; 
		}
		return	status;
	}
}
/*
************************************************************************************************************************
**函数原型:  char	SJASetBandRateStandard(unsigned char	BandRateSize)
**参数说明:  BandRateSize		  标准常用波特率(Kbps)          
**				0					5
**				1					10
**				2					20
**				3					40
**				4					50
**				5					80
**				6					100
**				7					125
**				8					200
**				9					250
**				10					400
**				11					500
**				12					666
**				13					800
**				14					1000		  
**返回值:		
**           0					  ; 设置总线定时器成功
**			 SJA_SETBTR_ERR		  ; 设置总线定时器错
**			 SJA_NOBTRSIZE		  ;波特率不能设为此值
**
**说明:     该函数用于设定在系统晶体为16MHZ时,常用的标准波特率的值。
**			参数BandRateSize只能为0~12,其它的值会返回SJA_NOBTRSIZE错误
**			本函数只能用于复位模式
************************************************************************************************************************
*/
unsigned  char	code	SJA_BTR_CODETAB[]={
	0xbf,0xff,						//;5KBPS的预设值
	0x67,0x2f,						//;10KBPS的预设值
    0x53,0x2F,		               //;20KBPS的预设值
    0x87,0xFF,                     //;40KBPS的预设值
    0x47,0x2F,                     //;50KBPS的预设值
    0x83,0xFF,                     //;80KBPS的预设值
    0x43,0x2f,                     //;100KBPS的预设值
   0x03,0x1c,                     //;125KBPS的预设值
	//0x3f,0xff,
    0x81,0xfa,                     //;200KBPS的预设值
    0x01,0x1c,                     //;250KBPS的预设值
    0x80,0xfa,                     //;400KBPS的预设值
    0x00,0x1c,                     //;500KBPS的预设值
    0x80,0xb6,                     //;666KBPS的预设值
    0x00,0x16,                     //;800KBPS的预设值
    0x00,0x14                      //;1000KBPS的预设值
  };
char	SJASetBandRateStandard(unsigned char	BandRateSize)
{
	char 	status=0;
	bit		ErrorFlag =1;		
	unsigned	char 	ErrorCount = 0x20;				//32次报错
	if(BandRateSize>14){
		status = SJA_NOBTRSIZE;
	}
    else{
		while(--ErrorCount){
				WriteSJAReg(REG_CAN_BTR0,SJA_BTR_CODETAB[BandRateSize*2]);
				WriteSJAReg(REG_CAN_BTR1,SJA_BTR_CODETAB[BandRateSize*2+1]);
				if(ReadSJAReg(REG_CAN_BTR0) != SJA_BTR_CODETAB[BandRateSize*2])continue;
				if(ReadSJAReg(REG_CAN_BTR1) != SJA_BTR_CODETAB[BandRateSize*2+1])continue;
				ErrorFlag=0;
				break;
			
		}//while结束
		if(ErrorFlag){
			status =SJA_SETBTR_ERR; 
		}
	}
	return	status;
}

/*
************************************************************************************************************************
**函数原型:  char	SJASystemPrgCMD(unsigned char cmd)
**参数说明:  cmd	SJA1000 的PeliCAN 工作方式命令字
**返回值:		
**           0				  ; 表示命令执行成功
**			 SJA_IMPCMD_ERR	  ; 表示命令执行出错
**			 SJA_NOTHISCMD    ; 没有此命令
**
**说明:     该函数用于执行sja1000的命令
************************************************************************************************************************
*/
char	SJASystemPrgCMD(unsigned char cmd)
{
	char 	status=0;

	switch(cmd){
		case	0x01:
		case	0x03:
			    WriteSJAReg(REG_CAN_CMR,cmd);
				break;
		case	0x02:
				if((ReadSJAReg(REG_CAN_SR)&TBS_BIT) == 0){
					status =  SJA_IMPCMD_ERR;
				}
				break;
		case	0x04:
				WriteSJAReg(REG_CAN_CMR,cmd);
				break;
		case	0x08:
				WriteSJAReg(REG_CAN_CMR,cmd);
				break;
		case	0x10:
		case	0x12:
			    WriteSJAReg(REG_CAN_CMR,cmd);
				break;
		default:
				status = SJA_NOTHISCMD; 
				break;
	}
    return		status;

}




/*
************************************************************************************************************************
**函数原型:  char	SJASendData(unsigned	char			*databuf,
**									unsigned	char	cmd
**									)
**参数说明:  databuf	存放要发送到总线的特定帧格式的数据的缓冲区首地址
**			 cmd		sj1000发送命令
**返回值:		
**           0				  ; 表示将数据成功的发送到can总线
**			 SJA_TXBUFLOCK	  ; sja1000发送缓冲区锁定
**           SJA_WTXBUF_ERR   ; 表示写发送缓冲区失败
**			 SJA_IMPCMD_ERR	  ; 表示命令执行出错
**
**说明:	本函数用于向can总线发送数据
************************************************************************************************************************
*/
char	SJASendData(unsigned	char			*databuf,
					unsigned	char	cmd
					)
{	
	char 	status=0;
	unsigned	char	len;
	unsigned	char	temp = (*databuf&0x0f);
	if(temp>8)temp=8;
	
	if( (ReadSJAReg(REG_CAN_SR)&TCS_BIT) ==0){//sja1000发送缓冲区锁定
		status =	SJA_TXBUFLOCK;
	}
	else if( (ReadSJAReg(REG_CAN_SR)&RS_BIT) !=0){//正在接收
		status =	SJA_WTXBUF_ERR;
	}
	
	else{
		switch(*databuf&0xC0) {	
			case	0x00://标准帧、数据帧
					len=STD_FRAMEID_LENTH+temp+1;
					WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
					status=SJASystemPrgCMD(cmd);
					break;
			case	0x40://标准帧、远程帧
					len=STD_FRAMEID_LENTH+1;
					WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
					status=SJASystemPrgCMD(cmd);
					break;	
			case	0x80://扩展帧、数据帧
					len=EXT_FRAMEID_LENTH+temp+1;
					WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
					status=SJASystemPrgCMD(cmd);
					break;
			case	0xC0://扩展帧、远程帧
					len=EXT_FRAMEID_LENTH+1;
					WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
					status=SJASystemPrgCMD(cmd);
					break;				
			default:status = SJA_WTXBUF_ERR;
					break;
		}	
	}
	
	return	status;
}
/*
************************************************************************************************************************
**函数原型:  char	SJARcvData(unsigned	char			*databuf)
**参数说明:  databuf	存放要接收数据缓冲区首地址
**			 
**返回值:		
**           0				  ; 表示将读取数据成功
**			 SJA_RXBUFEMPTY	  ; sja1000接收缓冲区为空
**           SJA_RRXVUF_ERR   ; sja1000接收数据错
**
**说明:	本函数用于接收can总线数据
************************************************************************************************************************
*/
char	SJARcvData(unsigned	char			*databuf)
{
	char 	status=0;
	unsigned	char	len;
	unsigned	char	temp;
 	*databuf= ReadSJAReg(REG_CAN_RXFMINFO);
	temp = (*databuf&0x0f);
	if(temp>8)temp=8;

	if( (ReadSJAReg(REG_CAN_SR)&RBS_BIT ) ==0){//sja1000接收缓冲区为空
		status =	SJA_RXBUFEMPTY	;
	}
	
	else{
		switch(*databuf&0xC0) {	
			case	0x00://标准帧、数据帧
					len=STD_FRAMEID_LENTH+temp;
					ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,len);
					status=	SJASystemPrgCMD(RELEASE_RX_BUF);
					break;
			case	0x40://标准帧、远程帧
					
					ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,STD_FRAMEID_LENTH);
					status=	SJASystemPrgCMD(RELEASE_RX_BUF);
					break;	
			case	0x80://扩展帧、数据帧
					len=EXT_FRAMEID_LENTH+temp;
					ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,len);
					status=SJASystemPrgCMD(RELEASE_RX_BUF);	 
					break;
			case	0xC0://扩展帧、远程帧
					
					ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,EXT_FRAMEID_LENTH);
					status=	SJASystemPrgCMD(RELEASE_RX_BUF);
					break;				
			default:status = SJA_RRXVUF_ERR;
					break;
		}
	}
	return	status;	
}

/*
************************************************************************************************************************
**函数原型:     unsigned	char	ReadALCReg(void)
**参数说明:     无
**返回值:		错误仲裁寄存器(alc)的内容
**             
**说明:         该函数用于读取错误仲裁寄存器(alc)的内容
************************************************************************************************************************
*/
unsigned	char	ReadALCReg(void)
{
	return(ReadSJAReg(REG_CAN_ALC)); 
}

/*
************************************************************************************************************************
**函数原型:     unsigned	char	ReadECCReg(void)
**参数说明:     无
**返回值:		错误捕捉寄存器(ecc)的内容
**             
**说明:         该函数用于读取错误捕捉寄存器(ecc)的内容
************************************************************************************************************************
*/
unsigned	char	ReadECCReg(void)
{
	return(ReadSJAReg(REG_CAN_ECC)); 
}

⌨️ 快捷键说明

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