#include "CANBUS.H"
//-------------------------------------define variable------------------------------------ unsigned char receive_counter = 0; unsigned char alc = 1; unsigned char ecc = 1;
/************************************************************************ *函数原型: bit CAN_CREATE_COMMUNATION(void) *参数说明: 无 *返回值: * * 0 ; 表示SJA1000接口正常 * 1 ; 表示SJA1000与处理器接口不正常 * *说明:该函数用于检测CAN控制器的接口是否正常 ************************************************************************/ bit CAN_CREATE_COMMUNATION(void) { unsigned char temp_data; bit Flag; REG_TEST = 0xAA; //写入测试值 temp_data = REG_TEST; if(temp_data == 0xaa) { Flag=0; //读测试正确 } else { Flag=1; } if(!Flag) { REG_TEST = 0x55; //写入测试值 temp_data = REG_TEST; if(temp_data == 0x55) { Flag=0; //读测试正确 REG_TEST = 0x00; } else { Flag=1; } } return (Flag); } /************************************************************************ *函数原型: bit CAN_ENTRY_RETMODEL(void) * *参数说明: 无 * *返回值: * * 0 ; 表示成功进入复位工作模式 * * 1 ; 表示不能进入复位工作模式 * * * *说明: CAN控制器进入复位工作模式 * ************************************************************************/ bit CAN_ENTRY_RETMODEL(void) { bit flag; unsigned char ErrorCount=20; unsigned char temp_data = REG_MODE; while(ErrorCount --) { REG_MODE = temp_data|RM_MODE; temp_data = REG_MODE; if( (temp_data & RM_MODE) != 0) { flag=0; break; } else { flag=1; } } return(flag); }
/************************************************************************ *函数原型: bit CAN_QUIT_RETMODEL(void) *参数说明: 无 *返回值: * 0 ; 表示成功退出复位工作模式 * 1 ; 表示不能退出复位工作模式 *说明: CAN控制器退出复位工作模式 ***********************************************************************/ bit CAN_QUIT_RETMODEL(void) { bit flag; unsigned char ErrorCount=20; unsigned char temp_data = REG_MODE; while(ErrorCount --) { REG_MODE = temp_data&0xfe; temp_data = REG_MODE; if((temp_data&0x01) == 0) { flag=0; break; } else { flag=1; } } return(flag); }
/********************************************************************************* **函数原型: 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 CAN_SET_BANDRATE(unsigned char CAN_ByteRate) { bit ErrorFlag =1; unsigned char temp_data; unsigned char ErrorCount = 0x20; //32次报错 if(CAN_ByteRate>14) { ErrorFlag =1; } else{ while(--ErrorCount) { REG_BTR0 = SJA_BTR_CODETAB[CAN_ByteRate*2]; REG_BTR1 = SJA_BTR_CODETAB[CAN_ByteRate*2+1]; temp_data = REG_BTR0; if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2]) { continue; } temp_data = REG_BTR1; if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2+1]) { continue; } ErrorFlag=0; break; }//while结束 } return ErrorFlag ; }
/************************************************************************* *函数原型: CAN_SET_OBJECT *参数说明: * CAN_ACR0-3:存放验收代码寄存器(ACR)的参数设置 * CAN_AMR0-3:存放接收屏蔽寄存器(AMR)的参数设置 *返回值: * 0 ;通信对象设置成功 * 1 ;通信对象设置失败 *说明:设置CAN节点的通讯对象,允许接收的报文ID号 * 允许接收的报文,是由AMR和ACR共同决定的. * 满足以下条件的ID号的报文才可以被接收 *[(ID.29-ID.0)≡(AC.29-AC.0)]||(AM.29-AM.0)≡11111111 * 该子程序只能用于复位模式 * *************************************************************************/ bit CAN_SET_OBJECT(unsigned char CAN_ACR0,unsigned char CAN_ACR1, unsigned char CAN_ACR2,unsigned char CAN_ACR3, unsigned char CAN_AMR0,unsigned char CAN_AMR1, unsigned char CAN_AMR2,unsigned char CAN_AMR3) { bit ErrorFlag =1; unsigned char temp_data; unsigned char ErrorCount = 0x20; //32次报错 while(ErrorCount--) { REG_ACR0 = CAN_ACR0; REG_ACR1 = CAN_ACR1; REG_ACR2 = CAN_ACR2; REG_ACR3 = CAN_ACR3; REG_AMR0 = CAN_AMR0; REG_AMR1 = CAN_AMR1; REG_AMR2 = CAN_AMR2; REG_AMR3 = CAN_AMR3;
temp_data = REG_ACR0; if(temp_data!= CAN_ACR0) //校验写入值 { continue; } temp_data = REG_ACR1; if(temp_data!= CAN_ACR1) //校验写入值 { continue; } temp_data = REG_ACR2; if(temp_data != CAN_ACR2) //校验写入值 { continue; } temp_data = REG_ACR3; if(temp_data != CAN_ACR3) //校验写入值 { continue; } temp_data = REG_AMR0; if(temp_data != CAN_AMR0) //校验写入值 { continue; } temp_data = REG_AMR1; if(temp_data != CAN_AMR1) //校验写入值 { continue; } temp_data = REG_AMR2; if(temp_data != CAN_AMR2) //校验写入值 { continue; } temp_data = REG_AMR3; if(temp_data != CAN_AMR3) //校验写入值 { continue; } ErrorFlag =0; break; } return ErrorFlag; } |