您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > CAN总线的实现-SJA1000实例
一、以下是我做的CAN节点的测试程序,实现两个节点传送数据,程序主要分三部分SJA1000的初始化,接收数据,发送数据./******************************************************函数原型:bitSja_1000_Init(void)**功能:初始化SJA10000**入口参数:无**返回值:0:初始化成功1:复位失败2:测试sja1000失败3:设置失败4:设置验收滤波器失败5:设置波特率失败*****************************************************/unsignedcharSja_1000_Init(void){bits;EA=0;s=BCAN_ENTER_RETMODEL();if(s==1)return1;s=BCAN_CREATE_COMMUNATION();if(s==1)return2;s=BCAN_SET_OUTCLK(0xc0);//Pelicanif(s==1)return3;s=BCAN_SET_OBJECT(0xFF,0x4E,0x16,0x00,0xff,0x00,0x00,0x00);if(s==1)return4;s=BCAN_SET_BANDRATE(CAN_BPS_1M);if(s==1)return5;SJA_BCANAdr=REG_OCR;*SJA_BCANAdr=0x1a;SJA_BCANAdr=REG_IER;*SJA_BCANAdr=0x03;s=BCAN_SET_CONTROL(0x08);if(s==1)return6;EA=1;return0;}}/*********************************************************************函数原型:bitBCAN_SET_OUTCLK(unsignedcharClock_Out)**参数说明:**Clock_Out:存放时钟分频寄存器(CDR)的参数设置**返回值:**0;设置成功**1;设置失败**说明:设置SJA1000的时钟分频。该子程序只能用于复位模式*******************************************************************/bitBCAN_SET_OUTCLK(unsignedcharClock_Out){SJA_BCANAdr=REG_CDR;*SJA_BCANAdr=Clock_Out;if(*SJA_BCANAdr!=Clock_Out)return1;elsereturn0;}/*********************************************************************函数原型:bitBCAN_SET_OBJECT(unsignedcharBCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3,BCAN_AMR0,BCAN_AMR1,BCAN_AMR2,BCAN_AMR3)*参数说明:**BCAN_ACR(0-3):存放验收代码寄存器(ACR)的参数设置**BCAN_AMR(0-3):存放接收屏蔽寄存器(AMR)的参数设置**返回值:**0;设置成功**1;设置失败**说明:设置CAN节点的通讯对象,允许接收的报文,是由AMR和ACR共同决定的.*********************************************************************/bitBCAN_SET_OBJECT(unsignedcharBCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3,BCAN_AMR0,BCAN_AMR1,BCAN_AMR2,BCAN_AMR3){SJA_BCANAdr=REG_TxBuffer1;*SJA_BCANAdr=BCAN_ACR0;//写入参数SJA_BCANAdr=REG_TxBuffer2;*SJA_BCANAdr=BCAN_ACR1;SJA_BCANAdr=REG_TxBuffer3;*SJA_BCANAdr=BCAN_ACR2;SJA_BCANAdr=REG_TxBuffer4;*SJA_BCANAdr=BCAN_ACR3;//校验写入值if(*SJA_BCANAdr!=BCAN_ACR3)return1;SJA_BCANAdr=REG_TxBuffer5;*SJA_BCANAdr=BCAN_AMR0;//写入参数SJA_BCANAdr=REG_TxBuffer6;*SJA_BCANAdr=BCAN_AMR1;SJA_BCANAdr=REG_TxBuffer7;*SJA_BCANAdr=BCAN_AMR2;SJA_BCANAdr=REG_TxBuffer8;*SJA_BCANAdr=BCAN_AMR3;//校验写入值if(*SJA_BCANAdr!=BCAN_AMR3)return1;return0;}/********************************************************************;*函数原型:bitBCAN_SET_BANDRATE(unsignedcharCAN_ByteRate)*;*返回值:*;*0;波特率设置成功*;*1;波特率设置失败*;**;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振必须为16MHz,*;*其它晶体的频率的值的波特率,需自己计算。该子程序只能用于*;*复位模式*;******************************************************************/bitBCAN_SET_BANDRATE(unsignedintCAN_ByteRate){//将波特率的的预设值装入sja1000的总线定时器SJA_BCANAdr=REG_BTR0;*SJA_BCANAdr=CAN_ByteRate8;//取CAN_ByteRate的高8位写入写入参数//校验写入值if(*SJA_BCANAdr!=(CAN_ByteRate8))return1;SJA_BCANAdr=REG_BTR1;*SJA_BCANAdr=CAN_ByteRate;//校验写入值if(*SJA_BCANAdr!=CAN_ByteRate)return1;return0;}/*********************************************************************函数原型:bitBCAN_SET_CONTROL(unsigendcharCMD)**参数说明:设置控制寄存器********************************************************************/bitBCAN_SET_CONTROL(unsignedcharCMD){unsignedcharTempData;SJA_BCANAdr=REG_CONTROL;//SJA_BaseAdr+0x00控制寄存器TempData=*SJA_BCANAdr;*SJA_BCANAdr=CMD;if(*SJA_BCANAdr==CMD)return0;elsereturn1;}/*********************************************************************函数原型:bitBCAN_CREATE_COMMUNATION(void)**参数说明:无**返回值:**0;表示SJA1000接口正常**1;表示SJA1000与处理器接口不正常**说明:该函数用于检测CAN控制器的接口是否正常********************************************************************/bitBCAN_CREATE_COMMUNATION(void){SJA_BCANAdr=REG_TEST;*SJA_BCANAdr=0xaa;//写入测试值if(*SJA_BCANAdr==0xaa)return0;//读测试正确elsereturn1;}/*******************************************************************函数原型:bitBCAN_ENTER_RETMODEL(void)**参数说明:无**返回值:**0;表示成功进入复位工作模式**1;表示不能进入复位工作模式****说明:CAN控制器进入复位工作模式********************************************************************/bitBCAN_ENTER_RETMODEL(void)//置位复位请求{unsignedcharTempData;SJA_BCANAdr=REG_CONTROL;TempData=*SJA_BCANAdr;*SJA_BCANAdr=0x01;//置位复位请求if((*SJA_BCANAdr&0x01)==1)return0;elsereturn1;}/******************************************************函数原型:voidex0_int(void)interrupt0//using1**功能:中断接收函数**入口参数:无**出口参数:RevceData[]数组**说明:当sja1000收到正确的报文时,会产生int中断*****************************************************/voidex0_int(void)interrupt0//using1{unsignedchartt;SJA_BCANAdr=REG_INTERRUPT;if((*SJA_BCANAdr)&0x01)//产生了接收中断{SJA_BCANAdr=REG_RxBuffer1;tt=*SJA_BCANAdr;if((tt&0x40)!=0x40)//数据帧=为远程帧{memcpy(REG_RxBuffer6,RevceData,8);send_char_com(RevceData[1]);//以下代码是发送到串口send_char_com(RevceData[2]);send_char_com(RevceData[3]);send_char_com(RevceData[4]);send_char_com(RevceData[5]);send_char_com(RevceData[6]);send_char_com(RevceData[7]);send_char_com(RevceData[8]);}BCAN_CMD_PRG(4);//释放SJA1000接收缓冲区}}unsignedcharBCAN_DATA_WRITE(unsignedchar*SendDataBuf){unsignedchartemp;SJA_BCANAdr=REG_STATUS;temp=*SJA_BCANAdr;if((temp&0x08)==0)return1;//上次发送未完成if((temp&0x04)==0)return2;//发送缓冲区是否锁定if((temp&0x10)==0x10)return3;//判断是否正在接收SJA_BCANAdr=REG_TxBuffer1;//访问地址指向发送缓冲区1memcpy(SJA_BCANAdr,SendDataBuf,13);BCAN_CMD_PRG(0x03);return0;}bitBCAN_CMD_PRG(unsignedcharcmd){SJA_BCANAdr=REG_COMMAND;//访问地址指
本文标题:CAN总线的实现-SJA1000实例
链接地址:https://www.777doc.com/doc-4246264 .html