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

📄 sja1000_peli.c

📁 MDK环境下CAN通信实验源码包fors3c2410,含有测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	SJA_ADDR = REG_AMR3;
	SJA_DATA = PCAN_AMR[3];		//写入参数
	SJA_ADDR = REG_AMR3;
	ucTempData = SJA_DATA;
	if(ucTempData != PCAN_AMR[3])	//校验写入值
	{
		return  0; 
	}

	return	1;
}

/************************************************************************
;*函数原型: int sja_set_outclock (unsigned char Out_Control, 	        *
                                  unsigned char  Clock_Out);            *
;*参数说明:										      					*
 *    Out_Control:存放输出控制寄存器 (OC)  的参数设置                   *
 *    Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置                     *
 *                                                                      *   
;*返回值:                                                               *
;*           1 ;设置成功                                                *
;*           0 ;设置失败                                                *
;*                                                                      * 
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式       *            
;************************************************************************/
int sja_set_outclock (unsigned char Out_Control,    
                     unsigned char  Clock_Out)
{
	unsigned char ucTempData;
	SJA_ADDR = REG_OCR;
	SJA_DATA = Out_Control;		//写入参数
	SJA_ADDR = REG_OCR;
	ucTempData = SJA_DATA;
	if(ucTempData != Out_Control)	//校验写入值	
	{
		return  0; 
	} 
	SJA_ADDR = REG_CDR;
	SJA_DATA = Clock_Out;		//写入参数
	SJA_ADDR = REG_CDR;
	ucTempData = SJA_DATA;		
	if(ucTempData != Clock_Out)	//校验写入值
	{
		return  0; 
	}
	return	1;
}                        
/************************************************************************
 *函数原型:  int sja_write_data(unsigned char *SendDataBuf)             *
 *参数说明:  特定帧格式的数据                                           *
 *返回值:                                                               *
 *           1    ; 表示将数据成功的送至发送缓冲区                      *
 *           0	  ; 表示上一次的数据正在发送,                          *
 *                ; 表示发送缓冲区被锁定,不能写入数据                  *
 *                ; 表示写入数据错误                                    * 
 *说明: 将待发送特定帧格式的数据,送入SJA1000发送缓存区中,然后启动     *
 *        SJA1000发送。                                                 *
 *   特定帧格式为:第1个字节存放帧信息,然后是2个(扩展帧是4个)字节的    *
 *   标识码,然后是8个字节的数据区                                      *
 *                                                                      *
 *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。     *
 *    不指示SJA1000将该数据正确发送到CAN总线上完毕与否                  *
 ************************************************************************/ 
int sja_write_data(unsigned char *SendDataBuf)
{
	int i;
	unsigned  char  ucTempCount,ucTempData;
	SJA_ADDR = REG_STATUS;
	ucTempData = SJA_DATA;
	if((ucTempData&0x08) == 0)//判断上次发送是否完成
	{
		return	0;
	}  
	if((ucTempData&0x04) == 0)//判断发送缓冲区是否锁定
	{
		return	0;
	} 
	//判断RTR,从而得出是数据帧还是远程帧 
	if((SendDataBuf[0]&0x40) == 0)//数据帧
	{ 
		if((SendDataBuf[0]&0x80) == 0)//标准帧 
			ucTempCount = (SendDataBuf[0]&0x0f)+3; 
		else//扩展帧
			ucTempCount = (SendDataBuf[0]&0x0f)+5; 
	}
	
	else//远程帧
	{
		if((SendDataBuf[0]&0x80) == 0)//标准帧
			ucTempCount = 3;                     
		else//扩展帧
			ucTempCount = 5;
	}
	//	memcpy(SJA_BCANAdr,SendDataBuf,ucTempCount);
	//	SJA_ADDR = REG_TxBuffer1;
	//	memcpy(TxBuffer1,SendDataBuf,ucTempCount);
	for(i = 0 ; i < ucTempCount ; i++)
	{
		SJA_ADDR = REG_TxBuffer0 + i;
		SJA_DATA = SendDataBuf[i];
	}
	return 1;
}

/************************************************************************
 *函数原型:  int sja_receive_data(unsigned char *RcvDataBuf);           *
 *参数说明:  RcvDataBuf,存放微处理器保存数据缓冲区                      *
 *返回值:    1;接收成功                                                 *
 *           0;接收失败                                                 * 
 *说明:CAN控制器接收数据,仅限于接收数据                                 *
 ************************************************************************/
int sja_receive_data(unsigned char *RcvDataBuf)
{
	int i;
	unsigned  char  ucTempCount,ucTempData; 
	SJA_ADDR = REG_STATUS;
	ucTempData = SJA_DATA;
	if((ucTempData&0x01) == 0)		//判断报文是否有效
	{
		return 0;
	}
	SJA_ADDR = REG_RxBuffer0; 
	ucTempData = SJA_DATA;
	if((ucTempData&0x40) == 0)//如果是数据帧
	{
		if((ucTempData&0x80) == 0)//标准帧
			ucTempCount = (ucTempData & 0x0f)+3;
		else//扩展帧
			ucTempCount = (ucTempData & 0x0f)+5; 
	}
	else
	{
		if((ucTempData&0x80) == 0)//标准帧
			ucTempCount = 3;
		else//扩展帧
			ucTempCount = 5;
	}
	for (i=0;i<ucTempCount;i++)
	{
		SJA_ADDR = REG_RxBuffer0+i;
		RcvDataBuf[i] = SJA_DATA;
	}	
	return  1;
}

/************************************************************************
 *函数原型:  int sja_command_prg(unsigned char cmd)                     *
 *参数说明:  cmd:sja1000运行的命令字                                    *
 *             01:发送请求                                              *
 *             02:中止发送                                             *
 *             04:释放接收缓冲区                                       *
 *             08:清除超载状态                                         *
 *             0x10:进入睡眠状态                                        *
 *                                                                      *
 *返回值:                                                               *
 *           1 ; 表示命令执行成功                                       *
 *           0 ; 表示命令执行失败                                       *
 *                                                                      * 
 *说明:      执行sja1000命令                                            * 
 ************************************************************************/ 
int sja_command_prg(unsigned char cmd)
{
	unsigned char ucTempData;
	SJA_ADDR = REG_COMMAND;
	SJA_DATA = cmd;		//启动命令字
	switch(cmd)
	{
		case  SRR_CMD:					//自接收请求命令
			return 1;
	//		break;
		case  TR_CMD:					//发送请求命令
			return 1;
	//		break;
		case  AT_CMD:					//中止发送命令 
			SJA_ADDR = REG_STATUS;
			ucTempData = SJA_DATA;
			if((ucTempData & 0x20)==0)	//判断是否正在发送
			{
				return 1;
			}
			else
			{
				return 0;
			}   
	//		break; 
		case  RRB_CMD:					//释放接收缓冲区 
			SJA_ADDR = REG_STATUS;
			ucTempData = SJA_DATA;
			if((ucTempData & 0x01)==1)
			{
				return 0;
			}
			else
			{
				return 1;
			}   
//			break; 
  
		case  COS_CMD:					//清除超载状态
			SJA_ADDR = REG_STATUS;
			ucTempData = SJA_DATA;
			if((ucTempData & 0x02)==0)
			{
				return 1;
			}
			else
			{
				return 0;
			}   
//			break; 
		default:
			return 0;
//			break; 
	}
}

⌨️ 快捷键说明

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