




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
页眉内容一、以下是我做的CAN节点的测试程序,实现两个节点传送数据,程序主要分三部分SJA1000的初始化,接收数据,发送数据./****************************************************函数原型:bitSja_1000_Init(void)功能:初始化SJA10000入口参数:无返回值:0:初始化成功1:复位失败测试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):* BCAN_AMR(0-3):*返回值:
存放验收代码寄存器(存放接收屏蔽寄存器(
*ACR)的参数设置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(unsigned charCAN_ByteRate);*返回值: *;* 0;波特率设置成功 *;* 1;波特率设置失败 *;* *;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振必须为16MHz, *;* 其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于;* 复位模式 *;******************************************************************/bitBCAN_SET_BANDRATE(unsigned intCAN_ByteRate){
*
*//将波特率的的预设值装入 sja1000的总线定时器SJA_BCANAdr=REG_BTR0;*SJA_BCANAdr =CAN_ByteRate>>8;
//取CAN_ByteRate的高
8位写入写入参数//校验写入值if(*SJA_BCANAdr !=(CAN_ByteRate>>8)) 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;}/*********************************************************************函数原型: bit BCAN_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控制器进入复位工作模式
********************************************************************/bit
BCAN_ENTER_RETMODEL(void)
//置位复位请求页眉内容{unsigned char TempData;SJA_BCANAdr =REG_CONTROL;TempData=*SJA_BCANAdr;*SJA_BCANAdr=0x01; //置位复位请求if((*SJA_BCANAdr&0x01) ==1)return 0;elsereturn 1;}/****************************************************函数原型: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(unsigned char*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;}bit BCAN_CMD_PRG(unsignedcharcmd){SJA_BCANAdr=REG_COMMAND; //访问地址指向命令寄存器*SJA_BCANAdr=cmd; //启动命令字switch(cmd){caseTR_CMD:return 0;break;caseSRR_CMD:return0;break;caseAT_CMD:SJA_BCANAdr=REG_STATUS;//访问地址指向状态寄存器if((*SJA_BCANAdr&0x20)==0)//判断是否正在发送return0;elsereturn1;break;caseRRB_CMD:SJA_BCANAdr=REG_STATUS;//访问地址指向状态寄存器if((*SJA_BCANAdr&0x01)==1)return1;elsereturn0;break;caseCOS_CMD:SJA_BCANAdr =REG_STATUS;if((*SJA_BCANAdr&0x02)==0)//判断清除超载是否成功return0;页眉内容elsereturn1;break;default:return1;break;}}主程序部分:voidmain(void){unsignedchartemptt,ss;CS=0;Init_Cpu();EA=0;//initialize Sja1000ss=Sja_1000_Init();if(ss!=0)//初始化失败send_string_com("initfail!");elseEA=1;//初始化成功,开中断RECOK=0;send_data[0]=Send_CAN_Info_ID[0];send_data[1]=Send_CAN_Info_ID[1];send_data[2]=Send_CAN_Info_ID[2];send_data[3]=Send_CAN_Info_ID[3];send_data[4]=Send_CAN_Info_ID[4];while(1){SJA_BCANAdr =REG_STATUS;temptt=*SJA_BCANAdr;if((temptt&0x40)==0x40){Sja_1000_Init();send_char_com(0xee);}if(RECOK==1){页眉内容RECOK=0;SJA_BCANAdr=REG_STATUS;temptt=*SJA_BCANAdr;if((temptt&0x04)==0x04) //可以向发送缓冲器写数据{send_data[5]=Com_RecBuff[0];send_data[6]=Com_RecBuff[1];send_data[7]=Com_RecBuff[2];send_data[8]=Com_RecBuff[3];send_data[9]=Com_RecBuff[4];send_data[10]=Com_RecBuff[5];send_data[11]=Com_RecBuff[6];send_data[12]=Com_RecBuff[7];ss=BCAN_DATA_WRITE(send_data);if(ss==0) //发送正常send_char_com(0x11);else{send_char_com(0xFF);send_char_com(ss);SJA_BCANAdr= REG_ECC;send_char_com(*SJA_BCANAdr);}}}}}二、can总线通讯程序(c) sja1000nnyt原创经典,如需更多帮助,请联系我QQ:6 Email :
:(
短信联系
,QQ详谈)本人同时提供can实验开发板给初学者CAN控制器为SJA1000,驱动器为TJA1050,电源隔离;提供详尽的源程序,可根据用户需求编写程序#include<REG52.H>#include<SJA_nnyt_BCANCONF.H>#include<SJA_nnyt_BCANFUNC.C>
//单片机头文件//SJA存储器定义头文件//SJA子程序文件/*************************
函数声明*******************************/voidInit_T0(void);
//初始化单片机
T0voidSja_1000_Init(void);
//初始化
SJA//*******************************************************************bit
flag_sec;
//发送命令标志unsignedchardata
send_data[10],rcv_data[10];//发送和接收数组unsignedchar
sec_data,second;
//定时器记数变量
,发送数据变量页眉内容unsignedchardata Tmod_data; //定时器T0工作方式变量unsignedcharbdataflag_init; //中断寄存器数据保存变量sbitrcv_flag=flag_init^0; //接收中断标志sbiterr_flag=flag_init^2; //错误中断标志sbitP2_0=P2^0;sbitP3_4=P3^4;sbitLED=P3^5; //指示灯//***********************************************************voidex0_int(void)interrupt0using1
//外部中断
0{SJA_BCANAdr=REG_INTERRUPT;
//指针指向中断寄存器flag_init=*SJA_BCANAdr;
//保持中断寄存器值}//***********************************************************voidT0_int(void)
interrupt1using2
//定时器
T0
中断服务子程序{TR0=0;sec_data--;if(sec_data==0)
//关闭定时器T0//秒计时变量减一//2.25秒时间到了吗
?{sec_data=0x50;
//重新赋值TH0=0x80;TL0=0x60;flag_sec=1;second++;
//设置标志位//发送的数据加一}TR0=1;
//启动定时器
T0}//************************************************************voidInit_T0(void) //初始化定时器0{Tmod_data=TMOD;Tmod_data&=0xf0;Tmod_data|=0x01;TMOD=Tmod_data;
//定时器
T0工作方式设置TH0=0x80;TL0=0x60;TR0=1;
//定时器T0初值设置//开放定时器T0sec_data=0x20;
//记数值设置second=0x00;
//发送数据初始化清零}//***********************************************************voidSja_1000_Init(void){页眉内容BCAN_ENTER_RETMODEL();
//进入复位BCAN_SET_BANDRATE(0x0b);
//800KBCAN_SET_OBJECT(0xaa,0xff);BCAN_SET_OUTCLK(0xaa,0x48);BCAN_QUIT_RETMODEL();SJA_BCANAdr=REG_CONTROL;*SJA_BCANAdr|=0x1E;
//设置地址ID:557//设置输出方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园白露教案反思学习小故事
- 建筑施工特种作业-建筑焊工真题库-3
- 2025届湖北省八市高三下学期3月联考语文试题(解析版)
- 2024-2025学年浙江省嘉兴市高一上学期期末考试语文试题(解析版)
- 新疆日新恒力橡塑有限公司年处理6万吨废旧轮胎热解项目报告书报告书简写本
- 江苏勃晟包装有限公司年产2300吨日用塑料制品(焊丝盘、包装盒、洒水壶、花盆)及300吨流延膜项目环评资料环境影响
- 话剧热泉心得体会
- 环境工程实验课件下载
- 环境工程专题课件
- 脑出血患者营养治疗讲课件
- 【山东】国际足球运动小镇概念规划方案
- 海氏(hay)职位分析法-介绍、实践与评价合集课件
- 煤矿安全规程露天部分参考题库(含答案)
- 有趣的英汉互译-课件
- (参考)菲达公司国内电除尘器业绩表
- 步进式加热炉耐材砌筑施工方案
- GB-T12232-2005- 通用阀门 法兰连接铁制闸阀
- 大学生职业生涯规划与就业指导教案第5讲:兴趣探索
- 2022年中国电信店长技能四级认证教材
- 门店电表记录表
- 常见散料堆积密度汇总-共10
评论
0/150
提交评论