#include "CANBUS.H"<br /><br />//-------------------------------------define variable------------------------------------<br />unsigned char receive_counter = 0;<br />unsigned char alc = 1;<br />unsigned char ecc = 1;<br /><br />/************************************************************************<br />*函数原型: bit CAN_CREATE_COMMUNATION(void)<br />*参数说明: 无<br />*返回值: *<br />* 0 ; 表示SJA1000接口正常<br />* 1 ; 表示SJA1000与处理器接口不正常<br />*<br />*说明:该函数用于检测CAN控制器的接口是否正常<br />************************************************************************/<br />bit CAN_CREATE_COMMUNATION(void)<br />{<br /> unsigned char temp_data;<br /> bit Flag;<br /> REG_TEST = 0xAA; //写入测试值<br /> temp_data = REG_TEST;<br /> if(temp_data == 0xaa)<br /> {<br /> Flag=0; //读测试正确<br /> }<br /> else<br /> {<br /> Flag=1;<br /> }<br /> if(!Flag)<br /> {<br /> REG_TEST = 0x55; //写入测试值<br /> temp_data = REG_TEST;<br /> if(temp_data == 0x55)<br /> {<br /> Flag=0; //读测试正确<br /> REG_TEST = 0x00;<br /> }<br /> else<br /> {<br /> Flag=1;<br /> }<br /> }<br /> return (Flag);<br />}<br />/************************************************************************<br />*函数原型: bit CAN_ENTRY_RETMODEL(void) *<br />*参数说明: 无 *<br />*返回值: *<br />* 0 ; 表示成功进入复位工作模式 *<br />* 1 ; 表示不能进入复位工作模式 *<br />* * <br />*说明: CAN控制器进入复位工作模式 *<br />************************************************************************/ <br />bit CAN_ENTRY_RETMODEL(void)<br />{<br /> bit flag;<br /> unsigned char ErrorCount=20;<br /> unsigned char temp_data = REG_MODE;<br /> while(ErrorCount --)<br /> {<br /> REG_MODE = temp_data|RM_MODE;<br /> temp_data = REG_MODE; <br /> if( (temp_data & RM_MODE) != 0)<br /> {<br /> flag=0; <br /> break;<br /> }<br /> else<br /> {<br /> flag=1; <br /> }<br /> }<br /> return(flag);<br />}<br /><br />/************************************************************************<br />*函数原型: bit CAN_QUIT_RETMODEL(void) <br />*参数说明: 无 <br />*返回值: <br />* 0 ; 表示成功退出复位工作模式 <br />* 1 ; 表示不能退出复位工作模式 <br />*说明: CAN控制器退出复位工作模式 <br />***********************************************************************/ <br />bit CAN_QUIT_RETMODEL(void)<br />{<br /> bit flag;<br /> unsigned char ErrorCount=20;<br /> unsigned char temp_data = REG_MODE;<br /> while(ErrorCount --)<br /> {<br /> REG_MODE = temp_data&0xfe;<br /> temp_data = REG_MODE; <br /> if((temp_data&0x01) == 0)<br /> {<br /> flag=0; <br /> break;<br /> }<br /> else<br /> {<br /> flag=1; <br /> }<br /> }<br /> return(flag);<br />}<br /><br />/*********************************************************************************<br />**函数原型: char SJASetBandRateStandard(unsigned char BandRateSize)<br />**参数说明: BandRateSize 标准常用波特率(Kbps) <br />** 0 5<br />** 1 10<br />** 2 20<br />** 3 40<br />** 4 50<br />** 5 80<br />** 6 100<br />** 7 125<br />** 8 200<br />** 9 250<br />** 10 400<br />** 11 500<br />** 12 666<br />** 13 800<br />** 14 1000 <br />**返回值: <br />** 0 ; 设置总线定时器成功<br />** SJA_SETBTR_ERR ; 设置总线定时器错<br />** SJA_NOBTRSIZE ;波特率不能设为此值<br />**<br />**说明: 该函数用于设定在系统晶体为16MHZ时,常用的标准波特率的值。<br />** 参数BandRateSize只能为0~14,其它的值会返回SJA_NOBTRSIZE错误<br />** 本函数只能用于复位模式<br />***************************************************************************************/<br />unsigned char code SJA_BTR_CODETAB[]={<br /> 0xbf,0xff, //;5KBPS的预设值<br /> 0x67,0x2f, //;10KBPS的预设值<br /> 0x53,0x2F, //;20KBPS的预设值<br /> 0x87,0xFF, //;40KBPS的预设值<br /> 0x47,0x2F, //;50KBPS的预设值<br /> 0x83,0xFF, //;80KBPS的预设值<br /> 0x43,0x2f, //;100KBPS的预设值<br /> 0x03,0x1c, //;125KBPS的预设值<br /> 0x81,0xfa, //;200KBPS的预设值<br /> 0x01,0x1c, //;250KBPS的预设值<br /> 0x80,0xfa, //;400KBPS的预设值<br /> 0x00,0x1c, //;500KBPS的预设值<br /> 0x80,0xb6, //;666KBPS的预设值<br /> 0x00,0x16, //;800KBPS的预设值<br /> 0x00,0x14 //;1000KBPS的预设值<br />};<br />bit CAN_SET_BANDRATE(unsigned char CAN_ByteRate)<br />{<br /> bit ErrorFlag =1;<br /> unsigned char temp_data; <br /> unsigned char ErrorCount = 0x20; //32次报错<br /> if(CAN_ByteRate>14)<br /> {<br /> ErrorFlag =1;<br /> }<br /> else{<br /> while(--ErrorCount)<br /> {<br /> REG_BTR0 = SJA_BTR_CODETAB[CAN_ByteRate*2];<br /> REG_BTR1 = SJA_BTR_CODETAB[CAN_ByteRate*2+1];<br /> temp_data = REG_BTR0;<br /> if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2])<br /> {<br /> continue;<br /> }<br /> temp_data = REG_BTR1;<br /> if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2+1])<br /> {<br /> continue;<br /> }<br /> ErrorFlag=0;<br /> break;<br /> }//while结束<br /> <br /> }<br /> return ErrorFlag ;<br />}<br /><br />/*************************************************************************<br />*函数原型: CAN_SET_OBJECT <br />*参数说明: <br />* CAN_ACR0-3:存放验收代码寄存器(ACR)的参数设置<br />* CAN_AMR0-3:存放接收屏蔽寄存器(AMR)的参数设置<br />*返回值: <br />* 0 ;通信对象设置成功 <br />* 1 ;通信对象设置失败 <br />*说明:设置CAN节点的通讯对象,允许接收的报文ID号<br />* 允许接收的报文,是由AMR和ACR共同决定的.<br />* 满足以下条件的ID号的报文才可以被接收 <br />*[(ID.29-ID.0)≡(AC.29-AC.0)]||(AM.29-AM.0)≡11111111 <br />* 该子程序只能用于复位模式 * <br />*************************************************************************/<br />bit CAN_SET_OBJECT(unsigned char CAN_ACR0,unsigned char CAN_ACR1,<br /> unsigned char CAN_ACR2,unsigned char CAN_ACR3,<br /> unsigned char CAN_AMR0,unsigned char CAN_AMR1,<br /> unsigned char CAN_AMR2,unsigned char CAN_AMR3)<br />{<br /> bit ErrorFlag =1;<br /> unsigned char temp_data; <br /> unsigned char ErrorCount = 0x20; //32次报错<br /> while(ErrorCount--)<br /> {<br /> REG_ACR0 = CAN_ACR0;<br /> REG_ACR1 = CAN_ACR1;<br /> REG_ACR2 = CAN_ACR2;<br /> REG_ACR3 = CAN_ACR3;<br /> REG_AMR0 = CAN_AMR0;<br /> REG_AMR1 = CAN_AMR1;<br /> REG_AMR2 = CAN_AMR2;<br /> REG_AMR3 = CAN_AMR3;<br /><br /> temp_data = REG_ACR0; <br /> if(temp_data!= CAN_ACR0) //校验写入值<br /> {<br /> continue;<br /> }<br /> temp_data = REG_ACR1;<br /> if(temp_data!= CAN_ACR1) //校验写入值<br /> {<br /> continue;<br /> }<br /> temp_data = REG_ACR2;<br /> if(temp_data != CAN_ACR2) //校验写入值<br /> {<br /> continue;<br /> }<br /> temp_data = REG_ACR3;<br /> if(temp_data != CAN_ACR3) //校验写入值<br /> {<br /> continue;<br /> }<br /> temp_data = REG_AMR0;<br /> if(temp_data != CAN_AMR0) //校验写入值<br /> {<br /> continue;<br /> }<br /> temp_data = REG_AMR1;<br /> if(temp_data != CAN_AMR1) //校验写入值<br /> {<br /> continue;<br /> }<br /> temp_data = REG_AMR2;<br /> if(temp_data != CAN_AMR2) //校验写入值<br /> {<br /> continue;<br /> }<br /> temp_data = REG_AMR3;<br /> if(temp_data != CAN_AMR3) //校验写入值<br /> {<br /> continue;<br /> }<br /> ErrorFlag =0;<br /> break;<br /> }<br /> return ErrorFlag;<br />}<br />
|