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

📄 sja_bcanfunc.c

📁 C51 CAN开发测试软件和驱动程序
💻 C
字号:
/*
********************************************************************************************************************
**描述:    独立的CAN 控制器SJA1000基本硬件头文件定义(BasicCAN 工作方式)
**文件名:   SJA_BcanFunc.H
**应用语言: KEIL C51
**版本 :    V1.0
**广州周立功单片机发展有限公司 保留所有的版权
********************************************************************************************************************
*/

 /*$page*/


#include    "SJA_BCANCONF.H"
#include    <string.h>




/************************************************************************
 *以下为基本的函数说明(BasicCAN)                                       *
 ************************************************************************/

/************************************************************************
 *函数原型:  bit   BCAN_CREATE_COMMUNATION(void)                        * 
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           0 ; 表示SJA1000接口正常                                    *
 *           1 ; 表示SJA1000与处理器接口不正常                          *
 *                                                                      * 
 *说明:该函数用于检测CAN控制器的接口是否正常                            *
 ************************************************************************/
 bit   BCAN_CREATE_COMMUNATION(void)
 {  
    SJA_BCANAdr=REG_TEST;                     //访问测试寄存器            
    
    *SJA_BCANAdr   =0xaa;                     //写入测试值
    if(*SJA_BCANAdr == 0xaa)
    {
        return    0;                          //读测试正确
    }
    else
    {    
       return    1;
    } 
 }       

/************************************************************************
 *函数原型:      bit   BCAN_ENTER_RETMODEL(void)                        *
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           0 ; 表示成功进入复位工作模式                               *
 *           1 ; 表示不能进入复位工作模式                               *
 *                                                                      * 
 *说明:      CAN控制器进入复位工作模式                                  *
 ************************************************************************/ 
 bit   BCAN_ENTER_RETMODEL(void)
 {
    unsigned   char   TempData;
    SJA_BCANAdr  = REG_CONTROL;                   //访问地址指向控制寄存器 
    TempData=  *SJA_BCANAdr;                      //保存原始值
    *SJA_BCANAdr=(TempData|0x01);                 //置位复位请求
    if((*SJA_BCANAdr&0x01) == 1)
    {
       return   0;
    }
    else
    {
       return   1;
    }
    
 }

/************************************************************************
 *函数原型:      bit   BCAN_QUIT_RETMODEL(void)                         *
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           0 ; 表示成功退出复位工作模式                               *
 *           1 ; 表示不能退出复位工作模式                               *
 *                                                                      * 
 *说明:      CAN控制器退出复位工作模式                                  *
 ************************************************************************/ 
 bit   BCAN_QUIT_RETMODEL(void)
 {
    unsigned   char   TempData;
    SJA_BCANAdr = REG_CONTROL;                   //访问地址指向控制寄存器 
    TempData    = *SJA_BCANAdr;                  //保存原始值
    *SJA_BCANAdr=(TempData&0xfe);       		 //清除复位请求
    if((*SJA_BCANAdr&0x01) == 0)
    {
       return   0;                               //
    }
    else
    {
       return   1;                              //退出成功
    }

 }
/*
************************************************************************************************************************
**函数原型:  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~14,其它的值会返回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的预设值
    0x81,0xfa,                     //;200KBPS的预设值
    0x01,0x1c,                     //;250KBPS的预设值
    0x80,0xfa,                     //;400KBPS的预设值
    0x00,0x1c,                     //;500KBPS的预设值
    0x80,0xb6,                     //;666KBPS的预设值
    0x00,0x16,                     //;800KBPS的预设值
    0x00,0x14                      //;1000KBPS的预设值
  };
bit	BCAN_SET_BANDRATE(unsigned char CAN_ByteRate)
{
	
	bit		ErrorFlag =1;		
	unsigned	char 	ErrorCount = 0x20;				//32次报错
	if(CAN_ByteRate>14){
		ErrorFlag =1;
	}
    else{
		while(--ErrorCount){
				WriteSjaReg(REG_BTR0,SJA_BTR_CODETAB[CAN_ByteRate*2]);
				WriteSjaReg(REG_BTR1,SJA_BTR_CODETAB[CAN_ByteRate*2+1]);
				if(ReadSjaReg(REG_BTR0) != SJA_BTR_CODETAB[CAN_ByteRate*2])continue;
				if(ReadSjaReg(REG_BTR1) != SJA_BTR_CODETAB[CAN_ByteRate*2+1])continue;
				ErrorFlag=0;
				break;
			
		}//while结束
		
	}
	return	ErrorFlag ;
}


/************************************************************************
;*函数原型:    BCAN_SET_OBJECT                                          *
*参数说明:                                                              *
 *    BCAN_ACR:存放验收代码寄存器(ACR)的参数设置                      *
 *    BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置                      *
;*返回值:                                                               *
;*           0 ;通信对象设置成功                                        *
;*           1 ;通信对象设置失败                                        *
;*                                                                      * 
;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。     *
;*     允许接收的报文,是由AMR和ACR共同决定的.                           *  
;*    满足以下条件的ID号的报文才可以被接收                              *
;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111              *
;*    该子程序只能用于复位模式                                          *                                                                                                                     *             
;************************************************************************/
bit    BCAN_SET_OBJECT(unsigned char  BCAN_ACR,unsigned char  BCAN_AMR)
{
   SJA_BCANAdr=REG_ACR;          		//访问地址指向验收代码寄存器(ACR)
  *SJA_BCANAdr=BCAN_ACR;        		//写入参数
  if(*SJA_BCANAdr != BCAN_ACR)  		//校验写入值
  {
    return  1; 
  }
  SJA_BCANAdr=REG_AMR;          		//访问地址指向验收屏蔽寄存器(AMR)
  *SJA_BCANAdr=BCAN_AMR;        		//写入参数
  if(*SJA_BCANAdr != BCAN_AMR)  		//校验写入值
  {
    return  1; 
  }

  return    0;
}

/************************************************************************
;*函数原型: bit  BCAN_SET_OUTCLK (unsigned char Out_Control, 	        *
                                  unsigned char  Clock_Out);            *
;*参数说明:										      					*
 *    Out_Control:存放输出控制寄存器 (OC)  的参数设置                   *
 *    Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置                     *
 *                                                                      *   
;*返回值:                                                               *
;*           0 ;设置成功                                                *
;*           1 ;设置失败                                                *
;*                                                                      * 
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式       *                                                                                                                     *             
;************************************************************************/
bit  BCAN_SET_OUTCLK (unsigned char Out_Control,    
                     unsigned char  Clock_Out)
{
  SJA_BCANAdr=REG_OCR ;          		//访问地址指向输出控制寄存器
  *SJA_BCANAdr=Out_Control;      		//写入参数
  if(*SJA_BCANAdr != Out_Control)		//校验写入值
  {
    return  1; 
  } 
  SJA_BCANAdr=REG_CDR;          		//访问地址指向输出控制寄存器
  *SJA_BCANAdr=Clock_Out;        		//写入参数
  return    0;
}


/************************************************************************
 *函数原型: bit   BCAN_HW_INIT(unsigned char  BCAN_ACR,                 *
 *                             unsigned char  BCAN_AMR,                 *
 *                             unsigned char  Bus_Timing0,              *
 *                             unsigned char  Bus_Timing1,              *
 *                             unsigned char  Out_Control,              *
 *                             unsigned char  Clock_Out                 *
 *                            )                                         *
 *参数说明:                                                             *
 *    BCAN_ACR:存放验收代码寄存器(ACR)的参数设置                      *
 *    BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置                      *
 *    Bus_Timing0:存放总线定时0寄存器(BTR0)的参数设置                   *
 *    Bus_Timing1:存放总线定时1寄存器(BTR1)的参数设置                   *
 *    Out_Control:存放输出控制寄存器 (OC)  的参数设置                   *
 *    Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置                     *
 *                                                                      *                        
 *返回值:                                                               *
 *           0 ; 表示初始化成功                                         *
 *           1 ; 表示初始化失败                                         *
 *                                                                      * 
 *说明:CAN控制器的初始化只能在复位模式下才能完成。初始化操作之前请先进入*
 *     到复位操作模式,并将要初始化的各参数的值按数据手册中的计算方法,正 *
 *     确的按实际需要计算好参数后,将参数写入对应的寄存器 。            *
 *注: 为了CAN控制器的正确运行,请务必仔细的阅读SJA1000的数据手册       *
 *                                                                      *
 *示例:设应用系统中晶体频率16MHZ,节点只接收ID(标志符)高八位为        *
 *      '10101010'的消息,系统波特率为50Kbit/s,关闭CLKOUT输出。         *
 *      则根据数据手册中的计算方法的各参数如下:                        *
 *      ACR==0AAH,AMR==00H,BTR0==0C9H,BTR1==0C9H,OC==0FFH,CDR=48H       *
 * 则调用本函数为:                                                     *
 *     BCAN_HW_INIT(0xaa,0x00,0xc9,0xc9,0xff,0x48)                      *                     
 ************************************************************************
 bit             BCAN_HW_INIT(unsigned char  BCAN_ACR,       
                              unsigned char  BCAN_AMR,      
                              unsigned char  Bus_Timing0,   
                              unsigned char  Bus_Timing1,   
                              unsigned char  Out_Control,    
                              unsigned char  Clock_Out      
                              ) 
{
  SJA_BCANAdr=REG_ACR;          //访问地址指向验收代码寄存器(ACR)
  *SJA_BCANAdr=BCAN_ACR;        //写入参数
  if(*SJA_BCANAdr != BCAN_ACR)  //校验写入值
  {
    return  1; 
  }
  SJA_BCANAdr=REG_AMR;          //访问地址指向验收屏蔽寄存器(AMR)
  *SJA_BCANAdr=BCAN_AMR;        //写入参数
  if(*SJA_BCANAdr != BCAN_AMR)  //校验写入值
  {
    return  1; 
  }
  SJA_BCANAdr=REG_BTR0;          //访问地址指向总线定时寄存器0
  *SJA_BCANAdr=Bus_Timing0;      //写入参数
  if(*SJA_BCANAdr != Bus_Timing0)//校验写入值
  {
    return  1; 
  }
  SJA_BCANAdr=REG_BTR1;          //访问地址指向总线定时寄存器0
  *SJA_BCANAdr=Bus_Timing1;      //写入参数
  if(*SJA_BCANAdr != Bus_Timing1)//校验写入值
  {
    return  1; 
  }
  SJA_BCANAdr=REG_OCR ;          //访问地址指向输出控制寄存器
  *SJA_BCANAdr=Out_Control;      //写入参数
  if(*SJA_BCANAdr != Out_Control)//校验写入值
  {
    return  1; 
  } 
  SJA_BCANAdr=REG_CDR;          //访问地址指向输出控制寄存器
  *SJA_BCANAdr=Clock_Out;        //写入参数
  return    0;
}                         

/************************************************************************
 *函数原型:  bit   BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
 *参数说明:  特定帧各式的数据

⌨️ 快捷键说明

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