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