📄 sja_pelifunc.lst
字号:
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 + -