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

下载本文档

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

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论