CAN总线的实现-SJA1000实例_第1页
CAN总线的实现-SJA1000实例_第2页
CAN总线的实现-SJA1000实例_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、以下是我做的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();

2、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)

3、;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_

4、Out)return 1;elsereturn 0;/* 函数原型 : bit BCAN_SET_OBJECT(unsigned char BCAN_ACR0,BCAN_ACR 1,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共同

5、决定 的.*/bit BCAN_SET_OBJECT(unsigned char BCAN_ACR0,BCAN_ACR1,BCAN_AC R2,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

6、; *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 !

7、= BCAN_AMR3) return 1;return 0; /*;*函数原型: bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate) * ;*返回值 : *;*0 ;波特率设置成功*;*1 ;波特率设置失败*;* *J;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振必须为16MH z, *;* 其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于 * ;* 复位模式 *;*/bit BCAN_SET_BANDRATE(unsigned int CAN_ByteRate)/将波特率的的预设值装入sja1000的总线定

8、时器 SJA_BCANAdr =REG_BTR0;*SJA_BCANAdr =CAN_ByteRate>>8; / 取 CAN_ByteRate 的高 8 位 写入 写入参数/校验写入值 if(*SJA_BCANAdr !=(CAN_ByteRate>>8) 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

9、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;elsereturn 1; /* * 函数原型 : bit BCAN_CREATE_COMMUNATION(void) * 参数说明 : 无 * *返回值 :* 0 ; 表示 SJA10

10、00 接口正常* 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

11、控制器进入复位工作模式*/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;/* 函数原型: void ex0_int(void) interrupt 0 /using 1* 功 能: 中断接收函数* 入口参数 : 无*出口参数:RevceData数组* 说 明: 当 sja

12、1000 收到正确的报文时 ,会产生 int 中断*/void ex0_int(void) interrupt 0 /using 1unsigned 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);sen d_char_com(RevceData1);/以下代码是发送到串口 se

13、nd_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_BC

14、ANAdr = 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;/访问地址指向发送缓冲区 1memcpy(SJA_BCANAdr,SendDataBuf,13);BCAN_CMD_PRG(0x03);return 0;bit BCAN_CMD_PRG(unsigned char c

15、md)SJA_BCANAdr=REG_COMMAND;/访问地址指向命令寄存器*SJA_BCANAdr=cmd;/启动命令字switch(cmd)case TR_CMD:return 0;break;case SRR_CMD:return 0;break;case AT_CMD:SJA_BCANAdr = REG_STATUS; /访问地址指向状态寄存器 if(*SJA_BCANAdr & 0x20)=0)/ 判断是否正在发送 return 0;elsereturn 1;break;case RRB_CMD:SJA_BCANAdr = REG_STATUS; /访问地址指向状态寄存器

16、if(*SJA_BCANAdr & 0x01)=1) return 1;elsereturn 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();i

17、f (ss!=O)初始化失败send_string_com("init fail!"); elseEA=1; /初始化成功,开中断RECOK=O;send_dataO=Send_CAN_Info_IDO;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&Ox4

18、O)=Ox4O)Sja_1OOO_Init(); send_char_com(Oxee);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_d

19、ata11=Com_RecBuff6;send_data12=Com_RecBuff7;ss=BCAN_DATA_WRITE(send_data);if (ss=0) /发送正常send_char_com(0x11);elsesend_char_com(0xFF);send_char_com(ss);SJA_BCANAdr= REG_ECC; send_char_com(*SJA_BCANAdr);二、 can 总线通讯程序( c ) sja1000nnyt原创经典,如需更多帮助,请联系我:(短信联系,QQ详谈)QQ: 6 Email :本人同时提供 can 实验开发板给初学者1 CAN 控制

20、器为 SJA1000, 驱动器为 TJA1050, 电源隔离 ;2 提供详尽的源程序 , 可根据用户需求编写程序include<REG52.H>/单片机头文件/SJA 存储器定义头文件/SJA 子程序文件include<SJA_nnyt_BCANCONF.H>include<SJA_nnyt_BCANFUNC.C>函数声明void Init_T0(void);void Sja_1000_Init(void);/ 初始化单片机 T0/初始化 SJAbit flag_sec;/发送命令标志unsigned char data send_data10,rcv_da

21、ta10;/发送和接收数组unsigned charsec_data,second;/定时器记数变量 ,发送数据变量unsigned char data Tmod_data; unsigned char bdata flag_init;sbit rcv_flag=flagnitA0;sbit err_flag=flag_i门/2;sbit P2_0=P2A0;sbit P3_4=P3A4;sbit LED=P3A5;/定时器 T0 工作方式变量 /中断寄存器数据保存变量 /接收中断标志 /错误中断标志/指示灯void ex0_int(void) interrupt 0 using 1/外部中断

22、 0SJA_BCANAdr=REG_INTERRUPT;/指针指向中断寄存器flag_init=*SJA_BCANAdr;/保持中断寄存器值void T0_int(void) interrupt 1 using 2TR0=0;sec_data-;if(sec_data=0)sec_data=0x50;TH0=0x80;TL0=0x60;flag_sec=1;second+;TR0=1;/ 定时器 T0 中断服务子程序/关闭定时器 T0/秒计时变量减一/2.25 秒时间到了吗 ?/重新赋值/设置标志位/发送的数据加一/启动定时器 T0void Init_T0(void)Tmod_data=TMO

23、D;Tmod_data&=0xf0;Tmod_data|=0x01;TMOD=Tmod_data;TH0=0x80;TL0=0x60;TR0=1; sec_data=0x20; second=0x00;/初始化定时器 0/定时器 T0 工作方式设置/ 定时器 T0 初值设置 /开放定时器 T0/记数值设置/发送数据初始化清零void Sja_1000_Init(void)BCAN_ENTER_RETMODEL();BCAN_SET_BANDRATE(0x0b);BCAN_SET_OBJECT(0xaa,0xff);/进入复位/800K/ 设置地址 ID:557BCAN_SET_OUTCLK(0xa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论