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

📄 sja1000_peli.c

📁 MDK环境下CAN通信实验源码包fors3c2410,含有测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************
* File:	sja1000_peli.c
* Author:	embest
* Desc:	hardware definition of CAN controller SJA1000 (BasicCAN Mode) 
* History:	
*			H.T.Zhang, Programming start, September 27, 2005
*********************************************************************************************/
#include    "sja1000_peli.h"
#include    <string.h>
#include	"def.h"      
/************************************************************************
 *函数原型:      int sja_enter_resetmode(void)                          *
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           1 ; 表示成功进入复位工作模式                               *
 *           0 ; 表示不能进入复位工作模式                               *
 *                                                                      * 
 *说明:      CAN控制器进入复位工作模式                                  *
 ************************************************************************/ 
int sja_enter_resetmode(void)
{
 	 int i;
    unsigned   char   ucTempData;
//	for(;;)
	{				  
 //    for (i=0;i<2000;i++);
	 SJA_ADDR = REG_MODE;
	}
    ucTempData =SJA_DATA;//保存原始值
    SJA_ADDR = REG_MODE;
	SJA_DATA =(ucTempData|0x01);//置位复位请求
	SJA_ADDR = REG_MODE;
	ucTempData = SJA_DATA;
	if((ucTempData&0x01) == 1)
    {
       return   1;
    }
    else
    {
       return   0;
    }  
}
/************************************************************************
 *函数原型:      int sja_quit_resetmode(void)                           *
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           1 ; 表示成功退出复位工作模式                               *
 *           0 ; 表示不能退出复位工作模式                               *
 *                                                                      * 
 *说明:      CAN控制器退出复位工作模式                                  *
 ************************************************************************/ 
int sja_quit_resetmode(void)
{
    unsigned   char   ucTempData;
    SJA_ADDR = REG_MODE;
	ucTempData = SJA_DATA;						//保存原始值
	SJA_ADDR = REG_MODE;
	SJA_DATA=(ucTempData&0xfe);				//清除复位请求
	SJA_ADDR = REG_MODE;
	ucTempData = SJA_DATA;
	if((ucTempData&0x01) == 0)
    {
       return	1;                               //退出成功
    }
    else
    {
       return	0;                             
    }
}
/************************************************************************
;*函数原型:   int sja_set_baudrate(unsigned char CAN_ByteRate)          *
;*参数说明:  R7            波特率(Kbit/s) BTR0     BTR1               *
;*           0	            20              053H,    02FH               *
;*           1	            40              087H,    0FFH               *  
;*           2	            50              047H,    02FH               *
;*           3	            80              083H,    0FFH               *
;*           4	            100             043H,    02fH               *
;*           5	            125             03H,     01cH               *
;*           6              200             081H,    0faH               *
;*           7	            250             01H,     01cH               *
;*           8	            400             080H,    0faH               *
;*           9	            500             00H,     01cH               *
;*           10	            666             080H,    0b6H               *
;*           11	            800             00H,     016H               *
;*           12	            1000            00H,     014H               *
;*返回值:                                                               *
;*           1 ;波特率设置成功                                          *
;*           0;波特率设置失败                                          *
;*                                                                      * 
;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振为必须为16MHZ,       *
;*     其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于        *
;*     复位模式                                                         *  
;************************************************************************/
char	SJA_BTR_CODETAB[]={
    0x53,0x2F,						//;20KBPS的预设值
    0x87,0xFF,						//;40KBPS的预设值
    0x47,0x2F,						//;50KBPS的预设值
    0x83,0xFF,						//;80KBPS的预设值
    0x43,0x2f,						//;100KBPS的预设值
    0x03,0x1c,						//;125KBPS的预设值
    0x81,0xfa,						//;200KBPS的预设值
    0x01,0x1c,						//;250KBPS的预设值
    0x80,0xfa,						//;400KBPS的预设值
    0x00,0x1c,						//;500KBPS的预设值
    0x80,0xb6,						//;666KBPS的预设值
    0x00,0x16,						//;800KBPS的预设值
    0x00,0x14						//;1000KBPS的预设值
   
};

int sja_set_baudrate(unsigned char CAN_ByteRate)
{
	unsigned char ucTempData;
	unsigned  char  BTR0_num,BTR1_num;
	BTR0_num = SJA_BTR_CODETAB[CAN_ByteRate*2];
	BTR1_num = SJA_BTR_CODETAB[CAN_ByteRate*2+1];
	//将波特率的预设值装入sja1000的总线定时器
	SJA_ADDR = REG_BTR0;
	SJA_DATA = BTR0_num;		//写入参数
	SJA_ADDR = REG_BTR0;
	ucTempData = SJA_DATA;
	if(ucTempData != BTR0_num)	//校验写入值	
	{
		return  0; 
	}
	SJA_ADDR = REG_BTR1;
	SJA_DATA = BTR1_num;		//写入参数
	SJA_ADDR = REG_BTR1;
	ucTempData = SJA_DATA;
	if(ucTempData != BTR1_num)	//校验写入值
	{
		return	0; 
	}
	return	1;
}  
/************************************************************************
;*函数原型:    sja_set_object                                           *
*参数说明:                                                              *
 *    BCAN_ACR:存放验收代码寄存器(ACR)的参数设置                      *
 *    BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置                      *
;*返回值:                                                               *
;*           1 ;通信对象设置成功                                        *
;*           0 ;通信对象设置失败                                        *
;*                                                                      * 
;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。     *
;*     允许接收的报文,是由AMR和ACR共同决定的.                           *  
;*    满足以下条件的ID号的报文才可以被接收                              *
;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111              *
;*    该子程序只能用于复位模式                                          *             
;************************************************************************/
int sja_set_object(unsigned char  * PCAN_ACR,unsigned char * PCAN_AMR)
{
	unsigned char ucTempData;
	SJA_ADDR = REG_ACR0;
	SJA_DATA = PCAN_ACR[0];		//写入参数
	SJA_ADDR = REG_ACR0;
	ucTempData = SJA_DATA;
	if(ucTempData != PCAN_ACR[0])	//校验写入值
	{
		return  0; 
	}
	
	SJA_ADDR = REG_ACR1;
	SJA_DATA = PCAN_ACR[1];		//写入参数
	SJA_ADDR = REG_ACR1;
	ucTempData = SJA_DATA;
	if(ucTempData != PCAN_ACR[1])	//校验写入值
	{
		return  0; 
	}
	
	SJA_ADDR = REG_ACR2;
	SJA_DATA = PCAN_ACR[2];		//写入参数
	SJA_ADDR = REG_ACR2;
	ucTempData = SJA_DATA;
	if(ucTempData != PCAN_ACR[2])	//校验写入值
	{
		return  0; 
	}

	SJA_ADDR = REG_ACR3;
	SJA_DATA = PCAN_ACR[3];		//写入参数
	SJA_ADDR = REG_ACR3;
	ucTempData = SJA_DATA;
	if(ucTempData != PCAN_ACR[3])	//校验写入值
	{
		return  0; 
	}
	
	SJA_ADDR = REG_AMR0;
	SJA_DATA = PCAN_AMR[0];		//写入参数
	SJA_ADDR = REG_AMR0;
	ucTempData = SJA_DATA;
	if(ucTempData != PCAN_AMR[0])	//校验写入值
	{
		return  0; 
	}
	
	SJA_ADDR = REG_AMR1;
	SJA_DATA = PCAN_AMR[1];		//写入参数
	SJA_ADDR = REG_AMR1;
	ucTempData = SJA_DATA;
	if(ucTempData != PCAN_AMR[1])	//校验写入值
	{
		return  0; 
	}
	
	SJA_ADDR = REG_AMR2;
	SJA_DATA = PCAN_AMR[2];		//写入参数
	SJA_ADDR = REG_AMR2;
	ucTempData = SJA_DATA;
	if(ucTempData != PCAN_AMR[2])	//校验写入值
	{
		return  0; 
	}
	

⌨️ 快捷键说明

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