版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、以下是我做的CAN节点的测试程序, 实现两个节点传送数据,程序主要分三部分 SJA1000 的初始化,接收数据,发送数据. /*函数原型: bit Sja_1000_Init(void)*功 能: 初始化SJA10000*入口参数: 无 *返 回 值: 0: 初始化成功 1: 复位失败
2、160; 2: 测试sja1000失败 3: 设置失败 4: 设置验收滤波器失败 5: 设置波特率失败 */unsigned char Sja_1000_Init(void) bit s; EA=0; s=BCAN_ENTER_RETMODEL();
3、 if (s=1) return 1; s=BCAN_CREATE_COMMUNATION(); if (s=1) return 2; s=BCAN_SET_OUTCLK(0xc0);/Pelican if (s=1) return 3; s=BCAN_SET_OBJECT(0xFF,0x4E,0x16,0x00,0xff,0x00,0x00,0x00); if (s=1) return 4; s=BCAN_SET_BANDRA
4、TE(CAN_BPS_1M); if (s=1) return 5; SJA_BCANAdr=REG_OCR ; *SJA_BCANAdr=0x1a; SJA_BCANAdr=REG_IER;
5、0;*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) *参数说明:
6、;
7、; * Clock_Out:存放时钟分频寄存器(CDR)的参数设置 *返回值:
8、60; * &
9、#160; 0 ;设置成功
10、; * 1 ;设置失败 &
11、#160; *说明:设置SJA1000的时钟分频 。该子程序只能用于复位模式 */bit BCAN_SET_OUTCLK(unsigned char Clock_Out) 2 /
12、15SJA_BCANAdr=REG_CDR; *SJA_BCANAdr=Clock_Out; if(*SJA_BCANAdr != Clock_Out) return 1; else return 0; /*函数原型: bit BCA
13、N_SET_OBJECT(unsigned char BCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3, BCAN_AMR0, BCAN_AMR1, BCAN_AMR2, BCAN_AMR3 ) *参数说明:
14、60; * BCAN_ACR(0-3):存放验收代码寄存器(ACR)的参数设置
15、60; * BCAN_AMR(0-3):存放接收屏蔽寄存器(AMR)的参数设置 *返回值:
16、60;
17、60; * 0 ;设置成功
18、; * 1 ;设置失败 &
19、#160; *说明:设置CAN节点的通讯对象,允许接收的报文,是由AMR和ACR共同决定的. */bit BCAN_SET_OBJECT(unsigned char BCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3,BCAN_AMR0,BCAN_AMR1,B
20、CAN_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_
21、ACR2; SJA_BCANAdr=REG_TxBuffer4; *SJA_BCANAdr=BCAN_ACR3; /校验写入值 if(*SJA_BCANAdr != BCAN_ACR3) return 1; SJA_BCANAdr=REG_TxBuffer5; *SJA_BCANAdr=BCAN_AMR0; /写入参数
22、60; 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
23、 1; return 0; /*;*函数原型: bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate) *;*返回值:
24、160; *;* 0 ;波特率设置成功
25、; *;* 1 ;波特率设置失败
26、160; *;*
27、0;
28、0; * ;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振必须为16MHz, *;* 其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于 *;* 复位模式
29、60;
30、60; * ;*/ bit BCAN_SET_BANDRATE(unsigned int CAN_ByteRate) /将波特率的的预设值装入sja1000的总线定时器 SJA_BCANAdr =REG_BTR0; *SJA_BCANAdr =CAN_ByteRate>>8;
31、 / 取CAN_ByteRate的高8位写入 写入参数 /校验写入值 if(*SJA_BCANAdr !=(CAN_ByteRate>>8) return 1; SJA_BCANAdr=REG_BTR1; *SJA_BCANAdr=CAN_ByteRate;
32、60; /校验写入值 if(*SJA_BCANAdr !=CAN_ByteRate) return 1; return 0; /* *函数原型: bit BCAN_SET_CONTROL(unsigend char CMD) *&
33、#160;*参数说明: 设置控制寄存器 * */b
34、it 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
35、 return 1;/* *函数原型: bit BCAN_CREATE_COMMUNATION(void) * *参数说明: 无
36、60; * *返回值:
37、160;
38、160; * * 0 ; 表示SJA1000接口正常
39、; * * 1 ; 表示SJA1000与处理器接口不正常
40、60; * *说明:该函数用于检测CAN控制器的接口是否正常 * */ bit BCAN_CREATE_COMMUNATION(void) SJA_BCANAdr=REG_TEST;&
41、#160; *SJA_BCANAdr=0xaa; /写入测试值 if(*SJA_BCANAdr = 0xaa) return 0; /读测试正确 else &
42、#160; return 1; /* *函数原型: bit BCAN_ENTER_RETMODEL(void) * *参数说明: 无
43、60;
44、60; * *返回值:
45、160; * * 0 ; 表示成功进入复位工作模式
46、 * * 1 ; 表示不能进入复位工作模式
47、0; * * &
48、#160; * *说明: CAN控制器进入复位工作模式
49、60; * */ bit BCAN_ENTER_RETMODEL(void) /置位复位请求 unsigned char TempData; SJ
50、A_BCANAdr = REG_CONTROL; TempData= *SJA_BCANAdr; *SJA_BCANAdr=0x01; /置位复位请求 if(*SJA_BCANAd
51、r&0x01) = 1) return 0; else return 1; /*函数原型: void ex0_int(void) interrupt 0 /using 1*功 能: 中断接收函数*入口参数: 无 *出口参数: RevceData
52、数组 *说 明: 当sja1000 收到正确的报文时,会产生int中断 */void ex0_int(void) interrupt 0 /using 1 unsigned char tt; SJA_BCANAdr=REG_INTERRUPT; if(*SJA_BCANAdr)&0x01) /产生了接收中断
53、 SJA_BCANAdr=REG_RxBuffer1; tt=*SJA_BCANAdr; if (tt&0x40)!=0x40) /数据帧 = 为远程帧 memcpy(REG_RxBuffer6,RevceData,8);
54、 send_char_com(RevceData1);/以下代码是发送到串口 send_char_com(RevceData2); send_char_com(RevceData3); send_char_com(RevceData4); send_char_com(RevceData5); send_char_com(
55、RevceData6); send_char_com(RevceData7); send_char_com(RevceData8); BCAN_CMD_PRG(4);/释放SJA1000接收缓冲区 unsigned char BCAN_DATA_WRITE(unsigned char *SendDataBuf) unsigned char t
56、emp; 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;
57、/判断是否正在接收 SJA_BCANAdr = REG_TxBuffer1; /访问地址指向发送缓冲区1 memcpy(SJA_BCANAdr,SendDataBuf,13); BCAN_CMD_PRG(0x03); return 0;bit BCAN_CMD_PRG(u
58、nsigned char cmd) SJA_BCANAdr=REG_COMMAND; /访问地址指向命令寄存器 *SJA_BCANAdr=cmd; /启动命令字
59、0; switch(cmd) case TR_CMD: return 0;
60、0; break; case SRR_CMD: return 0; break; case AT_CMD:
61、60; SJA_BCANAdr = REG_STATUS; /访问地址指向状态寄存器 if(*SJA_BCANAdr & 0x20)=0)/判断是否正在发送 &
62、#160; return 0; else return 1;
63、; break; case RRB_CMD: SJA_BCANAdr = REG_STATUS
64、; /访问地址指向状态寄存器 if(*SJA_BCANAdr & 0x01)=1) return 1; else
65、; return 0; break;
66、0; case COS_CMD: SJA_BCANAdr = REG_STATUS;
67、; if(*SJA_BCANAdr & 0x02)=0)/判断清除超载是否成功 return 0; else return
68、 1; break; default: return 1;
69、; break; 主程序部分:void main(void) unsigned char temptt,ss; CS=0; Init_Cpu(); EA=0; /initialize Sja1000 ss=Sja_1000_Init(); if (ss!=0)/初始化失败 &
70、#160; 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;
71、 send_data4=Send_CAN_Info_ID4; while(1) SJA_BCANAdr = REG_STATUS; temptt=*SJA_BCANAdr; if (te
72、mptt&0x40)=0x40) Sja_1000_Init(); send_char_com(0xee); if (RECOK=1) RECOK=0; SJA_BCANAdr = REG_STATUS;
73、160; temptt=*SJA_BCANAdr; if(temptt&0x04)=0x04) /可以向发送缓冲器写数据 send_data5=Com_RecBuff0; send_data6=Com_RecBuff1; send_da
74、ta7=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);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 昆山预计复工通知书
- 2026-2031年中国肉禽鱼类制品行业市场发展趋势与前景展望战略研究报告
- 社区卫生与环境保护方案
- 国际经济合作与贸易实务操作
- 企业市场分析与战略规划教程
- 2025年秋季武汉市光谷第八小学招聘校聘教师考试笔试备考题库及答案解析
- 医疗设备与技术的发展及应用
- 商务谈判艺术策略与技巧解析
- 城市管理与现代科技的应用探讨
- 2026安徽蚌埠市卫生健康委委属事业单位“校园招聘”126人笔试考试备考试题及答案解析
- DBJ04-T306-2025 建筑基坑工程技术标准
- 2025年俄语等级考试试卷及答案
- 货运代理安全管理制度
- GB/T 4446-2025造船与海上结构物系泊绞车
- 王缉慈编著《现代工业地理学》
- 病历车管理制度
- 国家广播电视总局直属事业单位招聘笔试真题2024
- 2024年系统架构师考试全面分析试题及答案
- 起重吊装安全作业专项方案
- 《思想道德与法治》(23版):绪论 担当复兴大任 成就时代新人
- 离婚协议书正规打印电子版(2025年版)
评论
0/150
提交评论