




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、以下是我做的CAN节点的测试程序, 实现两个节点传送数据,程序主要分三部分 SJA1000 的初始化,接收数据,发送数据. /*函数原型: bit Sja_1000_Init(void)*功 能: 初始化SJA10000*入口参数: 无 *返 回 值: 0: 初始化成功 1: 复位失败 2: 测试sja1000失败 3: 设置失败 4: 设置验收滤波器失败 5: 设置波特率失败 */unsigned char Sja_1000_Init(void) bit s;EA=0; s=BCAN_ENTER_RETMODEL();if (s=1) return 1; s=BCAN_CREATE_COMMUNATION(); if (s=1) return 2;s=BCAN_SET_OUTCLK(0xc0);/Pelicanif (s=1) return 3;s=BCAN_SET_OBJECT(0xFF,0x4E,0x16,0x00,0xff,0x00,0x00,0x00);if (s=1) return 4;s=BCAN_SET_BANDRATE(CAN_BPS_1M); if (s=1) return 5; SJA_BCANAdr=REG_OCR ; *SJA_BCANAdr=0x1a; SJA_BCANAdr=REG_IER;*SJA_BCANAdr=0x03;s=BCAN_SET_CONTROL(0x08);if (s=1) return 6;EA=1;return 0; /*函数原型: bit BCAN_SET_OUTCLK( unsigned char Clock_Out) *参数说明: * Clock_Out:存放时钟分频寄存器(CDR)的参数设置 *返回值: * 0 ;设置成功 * 1 ;设置失败 *说明:设置SJA1000的时钟分频 。该子程序只能用于复位模式 */bit BCAN_SET_OUTCLK(unsigned char Clock_Out) SJA_BCANAdr=REG_CDR; *SJA_BCANAdr=Clock_Out; if(*SJA_BCANAdr != Clock_Out) return 1; else return 0; /*函数原型: bit BCAN_SET_OBJECT(unsigned char BCAN_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共同决定的. */bit BCAN_SET_OBJECT(unsigned char BCAN_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) return 1; 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) return 1; return 0; /*;*函数原型: bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate) *;*返回值: *;* 0 ;波特率设置成功 *;* 1 ;波特率设置失败 *;* * ;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振必须为16MHz, *;* 其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于 *;* 复位模式 * ;*/ bit BCAN_SET_BANDRATE(unsigned int CAN_ByteRate) /将波特率的的预设值装入sja1000的总线定时器 SJA_BCANAdr =REG_BTR0; *SJA_BCANAdr =CAN_ByteRate8; / 取CAN_ByteRate的高8位写入 写入参数 /校验写入值if(*SJA_BCANAdr !=(CAN_ByteRate8) return 1; SJA_BCANAdr=REG_BTR1; *SJA_BCANAdr=CAN_ByteRate; /校验写入值 if(*SJA_BCANAdr !=CAN_ByteRate) return 1; return 0; /*函数原型: bit BCAN_SET_CONTROL(unsigend char CMD) *参数说明: 设置控制寄存器 */bit BCAN_SET_CONTROL(unsigned char CMD) unsigned char TempData; SJA_BCANAdr=REG_CONTROL; /SJA_BaseAdr+0x00 控制寄存器 TempData= *SJA_BCANAdr; *SJA_BCANAdr=CMD; if (*SJA_BCANAdr = CMD) return 0;else return 1;/*函数原型: 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=0x01; /置位复位请求 if(*SJA_BCANAdr&0x01) = 1) return 0; else return 1; /*函数原型: void ex0_int(void) interrupt 0 /using 1*功 能: 中断接收函数*入口参数: 无 *出口参数: RevceData数组 *说 明: 当sja1000 收到正确的报文时,会产生int中断 */void ex0_int(void) interrupt 0 /using 1 unsigned char tt; 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(RevceData1);/以下代码是发送到串口 send_char_com(RevceData2); send_char_com(RevceData3); send_char_com(RevceData4); send_char_com(RevceData5); send_char_com(RevceData6); send_char_com(RevceData7); send_char_com(RevceData8); BCAN_CMD_PRG(4);/释放SJA1000接收缓冲区 unsigned char BCAN_DATA_WRITE(unsigned char *SendDataBuf) unsigned char temp; SJA_BCANAdr = REG_STATUS; temp=*SJA_BCANAdr;if (temp&0x08)=0) return 1; /上次发送未完成if (temp&0x04)=0) return 2; /发送缓冲区是否锁定 if (temp&0x10)=0x10) return 3; /判断是否正在接收 SJA_BCANAdr = REG_TxBuffer1; /访问地址指向发送缓冲区1 memcpy(SJA_BCANAdr,SendDataBuf,13); BCAN_CMD_PRG(0x03); return 0;bit BCAN_CMD_PRG(unsigned char cmd) SJA_BCANAdr=REG_COMMAND; /访问地址指向命令寄存器 *SJA_BCANAdr=cmd; /启动命令字 switch(cmd) case TR_CMD: return 0; break;case SRR_CMD: return0; break; case AT_CMD: SJA_BCANAdr = REG_STATUS; /访问地址指向状态寄存器 if(*SJA_BCANAdr & 0x20)=0)/判断是否正在发送 return 0; else return 1; break; case RRB_CMD: SJA_BCANAdr = REG_STATUS; /访问地址指向状态寄存器 if(*SJA_BCANAdr & 0x01)=1) return 1; else return 0; break; case COS_CMD: SJA_BCANAdr = REG_STATUS; if(*SJA_BCANAdr & 0x02)=0)/判断清除超载是否成功 return 0; else return 1; break; default: return 1; break; 主程序部分:void main(void) unsigned char temptt,ss; CS=0; Init_Cpu(); EA=0; /initialize Sja1000 ss=Sja_1000_Init();if (ss!=0)/初始化失败 send_string_com(init fail!); else EA=1; /初始化成功,开中断 RECOK=0; send_data0=Send_CAN_Info_ID0; send_data1=Send_CAN_Info_ID1; send_data2=Send_CAN_Info_ID2; send_data3=Send_CAN_Info_ID3; send_data4=Send_CAN_Info_ID4; 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_data5=Com_RecBuff0; send_data6=Com_RecBuff1;send_data7=Com_RecBuff2;send_data8=Com_RecBuff3;send_data9=Com_RecBuff4;send_data10=Com_RecBuff5; send_data11=Com_RecBuff6;send_data12=Com_RecBuff7; 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)sja1000l nnyt原创经典,如需更多帮助,请联系我短信联系,QQ详谈)QQ: 531706356 Email:l 本人同时提供can实验开发板给初学者1 CAN控制器为SJA1000,驱动器为TJA1050,电源隔离;2 提供详尽的源程序,可根据用户需求编写程序include /单片机头文件include /SJA存储器定义头文件include /SJA子程序文件/*函数声明*/void Init_T0(void); /初始化单片机T0void Sja_1000_Init(void); /初始化SJA/*bit flag_sec; /发送命令标志unsigned char data send_data10,rcv_data10;/发送和接收数组unsigned char sec_data,second; /定时器记数变量,发送数据变量unsigned char data Tmod_data; /定时器T0工作方式变量unsigned char bdata flag_init; /中断寄存器数据保存变量sbit rcv_flag=flag_init0; /接收中断标志sbit err_flag=flag_init2; /错误中断标志sbit P2_0=P20;sbit P3_4=P34;sbit LED=P35; /指示灯/*void ex0_int(void) interrupt 0 using 1 /外部中断0SJA_BCANAdr=REG_INTERRUPT; /指针指向中断寄存器flag_init=*SJA_BCANAdr; /保持中断寄存器值/*void T0_int(void) interrupt 1 using 2 /定时器T0中断服务子程序TR0=0; /关闭定时器T0sec_data-; /秒计时变量减一if(sec_data=0) /2.25秒时间到了吗?sec_data=0x50; /重新赋值TH0=0x80;TL0=0x60;flag_sec=1; /设置标志位second+; /发送的数据加一TR0=1; /启动定时器T0/*void Init_T0(void) /初始化定时器0Tmod_data=TMOD;Tmod_data&=0xf0;Tmod_data|=0x01;TMOD=Tmod_data; /定时器T0工作方式设置TH0=0x80;TL0=0x60; /定时器T0初值设置TR0=1; /开放定时器T0sec_data=0x20; /记数值设置second=0x00; /发送数据初始化清零/*void Sja_1000_Init(void)BCAN_ENTER_RETMODEL(); /进入复位BCAN_SET_BANDRATE(0x0b); /800KBCAN_SET_OBJECT(0xaa,0xff); /设置地址ID:557BCAN_SET_OUTCLK(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装载机操作技能理论考试题库
- 溶解乙炔生产工国庆节后复工安全考核试卷含答案
- 人教版高中化学课程目录清单
- 2019年上海版六年级数学期末试题
- 山石工中秋节后复工安全考核试卷含答案
- 铁合金炉外法冶炼工中秋节后复工安全考核试卷含答案
- 化工洗涤工国庆节后复工安全考核试卷含答案
- 物流运输成本控制方法及案例分享
- 麻料作物栽培工节假日前安全考核试卷含答案
- 金属网制作工节假日前安全考核试卷含答案
- 产科护理教学比赛课件
- 占道施工安全培训内容课件
- 2025年芜湖市鸠江区村级后备干部集中招录工作101名考试参考题库及答案解析
- 2025年美容整形师专业知识考核试题及答案
- 2025年茶粉行业研究报告及未来行业发展趋势预测
- 培训民警拍照宣传课件
- 2025一建《建设工程项目管理》冲刺361题
- 人教版二年级数学上册第二单元 1~6的表内乘法必刷卷 (含答案)
- 聚合物混凝土定义、分类和性质Polymerconcrete
- 安全用电、用电安全培训ppt课件
- Q∕GDW 11612.2-2018 低压电力线高速载波通信互联互通技术规范 第2部分:技术要求
评论
0/150
提交评论