⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sja_pelifunc.lst

📁 Small RTOS 下SJA1000驱动程序的编写。主要介绍了在实时操作系统Small RTOS下
💻 LST
📖 第 1 页 / 共 3 页
字号:
 435   1              if(BandRateSize>14){
 436   2                      status = SJA_NOBTRSIZE;
 437   2              }
 438   1          else{
 439   2                      while(--ErrorCount){
 440   3                                      WriteSJAReg(REG_CAN_BTR0,SJA_BTR_CODETAB[BandRateSize*2]);
 441   3                                      WriteSJAReg(REG_CAN_BTR1,SJA_BTR_CODETAB[BandRateSize*2+1]);
 442   3                                      if(ReadSJAReg(REG_CAN_BTR0) != SJA_BTR_CODETAB[BandRateSize*2])continue;
 443   3                                      if(ReadSJAReg(REG_CAN_BTR1) != SJA_BTR_CODETAB[BandRateSize*2+1])continue;
 444   3                                      ErrorFlag=0;
 445   3                                      break;
 446   3                              
 447   3                      }//while结束
 448   2                      if(ErrorFlag){
 449   3                              status =SJA_SETBTR_ERR; 
 450   3                      }
 451   2              }
 452   1              return  status;
 453   1      }
 454          
 455          /*
 456          **********************************************************************************************************
             -**************
 457          **函数原型:  char       SJASystemPrgCMD(unsigned char cmd)
C51 COMPILER V7.02b   SJA_PELIFUNC                                                         03/06/2003 10:03:48 PAGE 9   

 458          **参数说明:  cmd        SJA1000 的PeliCAN 工作方式命令字
 459          **返回值:               
 460          **           0                            ; 表示命令执行成功
 461          **                       SJA_IMPCMD_ERR   ; 表示命令执行出错
 462          **                       SJA_NOTHISCMD    ; 没有此命令
 463          **
 464          **说明:     该函数用于执行sja1000的命令
 465          **********************************************************************************************************
             -**************
 466          */
 467          char    SJASystemPrgCMD(unsigned char cmd)
 468          {
 469   1              char    status=0;
 470   1      
 471   1              switch(cmd){
 472   2                      case    0x01:
 473   2                      case    0x03:
 474   2                                  WriteSJAReg(REG_CAN_CMR,cmd);
 475   2                                      break;
 476   2                      case    0x02:
 477   2                                      if((ReadSJAReg(REG_CAN_SR)&TBS_BIT) == 0){
 478   3                                              status =  SJA_IMPCMD_ERR;
 479   3                                      }
 480   2                                      break;
 481   2                      case    0x04:
 482   2                                      WriteSJAReg(REG_CAN_CMR,cmd);
 483   2                                      break;
 484   2                      case    0x08:
 485   2                                      WriteSJAReg(REG_CAN_CMR,cmd);
 486   2                                      break;
 487   2                      case    0x10:
 488   2                      case    0x12:
 489   2                                  WriteSJAReg(REG_CAN_CMR,cmd);
 490   2                                      break;
 491   2                      default:
 492   2                                      status = SJA_NOTHISCMD; 
 493   2                                      break;
 494   2              }
 495   1          return              status;
 496   1      
 497   1      }
 498          
 499          
 500          
 501          
 502          /*
 503          **********************************************************************************************************
             -**************
 504          **函数原型:  char       SJASendData(unsigned    char                    *databuf,
 505          **                                                                      unsigned        char    cmd
 506          **                                                                      )
 507          **参数说明:  databuf    存放要发送到总线的特定帧格式的数据的缓冲区首地址
 508          **                       cmd            sj1000发送命令
 509          **返回值:               
 510          **           0                            ; 表示将数据成功的发送到can总线
 511          **                       SJA_TXBUFLOCK    ; sja1000发送缓冲区锁定
 512          **           SJA_WTXBUF_ERR   ; 表示写发送缓冲区失败
 513          **                       SJA_IMPCMD_ERR   ; 表示命令执行出错
 514          **
 515          **说明:        本函数用于向can总线发送数据
 516          **********************************************************************************************************
             -**************
C51 COMPILER V7.02b   SJA_PELIFUNC                                                         03/06/2003 10:03:48 PAGE 10  

 517          */
 518          char    SJASendData(unsigned    char                    *databuf,
 519                                                  unsigned        char    cmd
 520                                                  )
 521          {       
 522   1              char    status=0;
 523   1              unsigned        char    len;
 524   1              unsigned        char    temp = (*databuf&0x0f);
 525   1              if(temp>8)temp=8;
 526   1              
 527   1              if( (ReadSJAReg(REG_CAN_SR)&TCS_BIT) ==0){//sja1000发送缓冲区锁定
 528   2                      status =        SJA_TXBUFLOCK;
 529   2              }
 530   1              else if( (ReadSJAReg(REG_CAN_SR)&RS_BIT) !=0){//正在接收
 531   2                      status =        SJA_WTXBUF_ERR;
 532   2              }
 533   1              
 534   1              else{
 535   2                      switch(*databuf&0xC0) { 
 536   3                              case    0x00://标准帧、数据帧
 537   3                                              len=STD_FRAMEID_LENTH+temp+1;
 538   3                                              WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
 539   3                                              status=SJASystemPrgCMD(cmd);
 540   3                                              break;
 541   3                              case    0x40://标准帧、远程帧
 542   3                                              len=STD_FRAMEID_LENTH+1;
 543   3                                              WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
 544   3                                              status=SJASystemPrgCMD(cmd);
 545   3                                              break;  
 546   3                              case    0x80://扩展帧、数据帧
 547   3                                              len=EXT_FRAMEID_LENTH+temp+1;
 548   3                                              WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
 549   3                                              status=SJASystemPrgCMD(cmd);
 550   3                                              break;
 551   3                              case    0xC0://扩展帧、远程帧
 552   3                                              len=EXT_FRAMEID_LENTH+1;
 553   3                                              WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
 554   3                                              status=SJASystemPrgCMD(cmd);
 555   3                                              break;                          
 556   3                              default:status = SJA_WTXBUF_ERR;
 557   3                                              break;
 558   3                      }       
 559   2              }
 560   1              
 561   1              return  status;
 562   1      }
 563          /*
 564          **********************************************************************************************************
             -**************
 565          **函数原型:  char       SJARcvData(unsigned     char                    *databuf)
 566          **参数说明:  databuf    存放要接收数据缓冲区首地址
 567          **                       
 568          **返回值:               
 569          **           0                            ; 表示将读取数据成功
 570          **                       SJA_RXBUFEMPTY   ; sja1000接收缓冲区为空
 571          **           SJA_RRXVUF_ERR   ; sja1000接收数据错
 572          **
 573          **说明:        本函数用于接收can总线数据
 574          **********************************************************************************************************
             -**************
 575          */
 576          char    SJARcvData(unsigned     char                    *databuf)
C51 COMPILER V7.02b   SJA_PELIFUNC                                                         03/06/2003 10:03:48 PAGE 11  

 577          {
 578   1              char    status=0;
 579   1              unsigned        char    len;
 580   1              unsigned        char    temp;
 581   1              *databuf= ReadSJAReg(REG_CAN_RXFMINFO);
 582   1              temp = (*databuf&0x0f);
 583   1              if(temp>8)temp=8;
 584   1      
 585   1              if( (ReadSJAReg(REG_CAN_SR)&RBS_BIT ) ==0){//sja1000接收缓冲区为空
 586   2                      status =        SJA_RXBUFEMPTY  ;
 587   2              }
 588   1              
 589   1              else{
 590   2                      switch(*databuf&0xC0) { 
 591   3                              case    0x00://标准帧、数据帧
 592   3                                              len=STD_FRAMEID_LENTH+temp;
 593   3                                              ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,len);
 594   3                                              status= SJASystemPrgCMD(RELEASE_RX_BUF);
 595   3                                              break;
 596   3                              case    0x40://标准帧、远程帧
 597   3                                              
 598   3                                              ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,STD_FRAMEID_LENTH);
 599   3                                              status= SJASystemPrgCMD(RELEASE_RX_BUF);
 600   3                                              break;  
 601   3                              case    0x80://扩展帧、数据帧
 602   3                                              len=EXT_FRAMEID_LENTH+temp;
 603   3                                              ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,len);
 604   3                                              status=SJASystemPrgCMD(RELEASE_RX_BUF);  
 605   3                                              break;
 606   3                              case    0xC0://扩展帧、远程帧
 607   3                                              
 608   3                                              ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,EXT_FRAMEID_LENTH);
 609   3                                              status= SJASystemPrgCMD(RELEASE_RX_BUF);
 610   3                                              break;                          
 611   3                              default:status = SJA_RRXVUF_ERR;
 612   3                                              break;
 613   3                      }
 614   2              }
 615   1              return  status; 
 616   1      }
 617          
 618          /*
 619          **********************************************************************************************************
             -**************
 620          **函数原型:     unsigned        char    ReadALCReg(void)
 621          **参数说明:     无
 622          **返回值:               错误仲裁寄存器(alc)的内容
 623          **             
 624          **说明:         该函数用于读取错误仲裁寄存器(alc)的内容
 625          **********************************************************************************************************
             -**************
 626          */
 627          unsigned        char    ReadALCReg(void)
 628          {
 629   1              return(ReadSJAReg(REG_CAN_ALC)); 
 630   1      }
 631          
 632          /*
 633          **********************************************************************************************************
             -**************
 634          **函数原型:     unsigned        char    ReadECCReg(void)
 635          **参数说明:     无
C51 COMPILER V7.02b   SJA_PELIFUNC                                                         03/06/2003 10:03:48 PAGE 12  

 636          **返回值:               错误捕捉寄存器(ecc)的内容
 637          **             
 638          **说明:         该函数用于读取错误捕捉寄存器(ecc)的内容
 639          **********************************************************************************************************
             -**************
 640          */
 641          unsigned        char    ReadECCReg(void)
 642          {
 643   1              return(ReadSJAReg(REG_CAN_ECC)); 
 644   1      }
 645          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1103    ----
   CONSTANT SIZE    =     30    ----
   XDATA SIZE       =   1015    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5      53
   IDATA SIZE       =      1    ----
   BIT SIZE         =   ----       6
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -