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

📄 sja_pelifunc.lst

📁 Small RTOS 下SJA1000驱动程序的编写。主要介绍了在实时操作系统Small RTOS下
💻 LST
📖 第 1 页 / 共 3 页
字号:
 436   2              }
 437   1          else{
 438   2                      while(--ErrorCount){
 439   3                                      WriteSJAReg(REG_CAN_BTR0,SJA_BTR_CODETAB[BandRateSize*2]);
 440   3                                      WriteSJAReg(REG_CAN_BTR1,SJA_BTR_CODETAB[BandRateSize*2+1]);
 441   3                                      if(ReadSJAReg(REG_CAN_BTR0) != SJA_BTR_CODETAB[BandRateSize*2])continue;
 442   3                                      if(ReadSJAReg(REG_CAN_BTR1) != SJA_BTR_CODETAB[BandRateSize*2+1])continue;
 443   3                                      ErrorFlag=0;
 444   3                                      break;
 445   3                              
 446   3                      }//while结束
 447   2                      if(ErrorFlag){
 448   3                              status =SJA_SETBTR_ERR; 
 449   3                      }
 450   2              }
 451   1              return  status;
 452   1      }
 453          
 454          /*
 455          **********************************************************************************************************
             -**************
 456          **函数原型:  char       SJASystemPrgCMD(unsigned char cmd)
 457          **参数说明:  cmd        SJA1000 的PeliCAN 工作方式命令字
 458          **返回值:               
C51 COMPILER V6.23a  SJA_PELIFUNC                                                          10/14/2002 09:29:09 PAGE 9   

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

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

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1107    ----
   CONSTANT SIZE    =     30    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2      53
   IDATA SIZE       =   ----    ----
   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 + -