📄 stepbystep.lst
字号:
506 2 }
507 1 else
508 1 {
509 2 link=0;
510 2 }
511 1 return;
512 1 }
513
514 unsigned char wait_data()
515 {
516 1 i=0;
517 1 while(!RI)
518 1 {
519 2 TR0=1;
520 2 }
521 1 while(REN)
522 1 {
523 2 if(receive_count>0x80) //超时等待2S;
524 2 {
525 3 for(i=0;i<14;i++)
526 3 {
527 4 r_buf[i]=0;
528 4 }
529 3 i=0;
530 3 TR0=0;
531 3 receive_count=0;
532 3 return 0;
533 3 }
534 2 }
535 1 TR0=0;
536 1 receive_count=0;
537 1 return 1;
538 1 }
539
540 void INIT_SJA1000_CYC()
541 {
542 1 SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
543 1 *SJA1000_ADDRESS=SJA1000_RESET_MODEL; //进入复位模式
544 1
545 1 while(!(*SJA1000_ADDRESS&SJA1000_RESET_MODEL)); //等待进入复位模式
546 1
547 1 /* SJA1000_ADDRESS=SJA1000_CLOCKDIR; //指向时钟分频寄存器
548 1 *SJA1000_ADDRESS=SJA1000_CDR_COMMAND; //使用Peli CAN模式,CLOCK使用2分频输出
549 1
550 1 SJA1000_ADDRESS=SJA1000_ENINTERR; //指向中断使能寄存器
551 1 *SJA1000_ADDRESS=SJA1000_IER_COMMAND; //开放接收,数据溢出,错误报警中断
C51 COMPILER V6.12 STEPBYSTEP 09/16/2007 21:44:56 PAGE 10
552 1
553 1 SJA1000_ADDRESS=SJA1000_OUTCONTR; //指向输出控制寄存器
554 1 *SJA1000_ADDRESS=SJA1000_OUT_COMMAND; //正常输出模式
555 1
556 1 SJA1000_ADDRESS=SJA1000_BUSTIME0; //指向总线定时0寄存器
557 1 *SJA1000_ADDRESS=BTR0_NUM; //重写波特率
558 1 SJA1000_ADDRESS=SJA1000_BUSTIME1; //指向总线定时1寄存器
559 1 *SJA1000_ADDRESS=BTR1_NUM; //重写波特率
560 1
561 1 SJA1000_ADDRESS=SJA1000_RBSA; //指向RX缓冲区起始地址寄存器
562 1 *SJA1000_ADDRESS=SJA1000_FIFO_ADD; //接收缓冲区FIFO起始为内部RAM的0地址
563 1
564 1 SJA1000_ADDRESS=SJA1000_AMRRX0; //指向验收屏蔽寄存器,所有位均参加验收
565 1 *SJA1000_ADDRESS=AMR_CODE0;
566 1 SJA1000_ADDRESS=SJA1000_AMRRX1;
567 1 *SJA1000_ADDRESS=AMR_CODE1;
568 1 SJA1000_ADDRESS=SJA1000_AMRRX2;
569 1 *SJA1000_ADDRESS=AMR_CODE2;
570 1 SJA1000_ADDRESS=SJA1000_AMRRX3;
571 1 *SJA1000_ADDRESS=AMR_CODE3;
572 1
573 1 SJA1000_ADDRESS=SJA1000_ACRRX0; //指向验收代码寄存器,送ID码
574 1 *SJA1000_ADDRESS=ACR_ID0;
575 1 SJA1000_ADDRESS=SJA1000_ACRRX1;
576 1 *SJA1000_ADDRESS=ACR_ID1;
577 1 SJA1000_ADDRESS=SJA1000_ACRRX2;
578 1 *SJA1000_ADDRESS=ACR_ID2;
579 1 SJA1000_ADDRESS=SJA1000_ACRRX3;
580 1 *SJA1000_ADDRESS=ACR_ID3; */
581 1
582 1 SJA1000_ADDRESS=SJA1000_TX_ERR; //指向发送错误寄存器
583 1 *SJA1000_ADDRESS=SJA1000_CLEAR_TX_ERR; //清除错误
584 1
585 1 SJA1000_ADDRESS=SJA1000_RX_ERR; //指向发送错误寄存器
586 1 *SJA1000_ADDRESS=SJA1000_CLEAR_TX_ERR; //清除发送错误
587 1
588 1 SJA1000_ADDRESS=SJA1000_ALC; //指向仲裁丢失捕捉寄存器
589 1 temp=*SJA1000_ADDRESS; //通过读取清除
590 1
591 1 SJA1000_ADDRESS=SJA1000_ECC; //指向错误代码捕捉寄存器
592 1 temp=*SJA1000_ADDRESS; //通过读取清除
593 1
594 1 SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
595 1 *SJA1000_ADDRESS=SJA1000_WORK_MODEL; //设置双滤波接收,进入工作模式
596 1 while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL); //等待进入工作模式
597 1 }
598 /*
599 void checkbound()
600 {
601 if(r_buf[1]=='B' && r_buf[2]=='a' && r_buf[3]=='u' && r_buf[4]=='d')
602 {
603 baund=1;
604 }
605 else
606 {
607 baund=0;
608 }
609 P2=0x6c;
610 return;
611 } */
612
613 /*void SJA1000_RECEIVE_IN_INTERR()
C51 COMPILER V6.12 STEPBYSTEP 09/16/2007 21:44:56 PAGE 11
614 {
615 unsigned char data can_temp,j,k,Length;
616 bit FF,RTR;
617
618 receive_err=0;
619 ET1=0;
620
621 SJA1000_ADDRESS=SJA1000_STATE; //指向状态寄存器
622 can_temp=*SJA1000_ADDRESS; //读状态
623 P2=can_temp;
624
625 if(can_temp&SJA1000_BUS_ERR) //0xc3 //检查总线状态是否有错
626 {
627 if(can_temp&SJA1000_BUS_CLOSE) //0x80 //检查是否是总线关闭状态
628 {
629 SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,清除总线错误中断
630 can_temp=*SJA1000_ADDRESS;
631 P2=can_temp;
632 for(k=0;k<255;k++)
633 for(j=0;j<255;j++)
634 ;
635 ;
636 k=0;
637 j=0;
638 SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
639 *SJA1000_ADDRESS=SJA1000_WORK_MODEL; //设置双滤波接收,进入工作模式
640 while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL); //等待进入工作模式
641 }
642 else
643 {
644 SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,检查中断类型
645 can_temp=*SJA1000_ADDRESS;
646
647 if(can_temp&SJA1000_DATA_OVER_INTERR) //0x08 //检查是否是数据溢出中断
648 {
649 SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
650 *SJA1000_ADDRESS=SJA1000_CLEAR_DATA_OVER; //清除数据溢出
651 }
652 else
653 {
654 if(can_temp&SJA1000_RI_INTERR) //检查是否是接收中断
655 {
656 SJA1000_ADDRESS=SJA1000_RXBUF; //指向接收数据寄存器首址
657 CAN_RXD_BUF[0]=*SJA1000_ADDRESS; //读RX帧信息
658 FF=CAN_RXD_BUF[0]&0x80;
659 RTR=CAN_RXD_BUF[0]&0x40;
660 Length=CAN_RXD_BUF[0]&0x0F;
661 if(Length>0x08)
662 Length=0x08;
663 SJA1000_ADDRESS++;
664 CAN_RXD_BUF[1]=*SJA1000_ADDRESS;
665 SJA1000_ADDRESS++;
666 CAN_RXD_BUF[2]=*SJA1000_ADDRESS;
667 if(FF)
668 {
669 SJA1000_ADDRESS++;
670 CAN_RXD_BUF[3]=*SJA1000_ADDRESS;
671 SJA1000_ADDRESS++;
672 CAN_RXD_BUF[4]=*SJA1000_ADDRESS;
673 }
674 for(i=0;i<Length;i++)
675 {
C51 COMPILER V6.12 STEPBYSTEP 09/16/2007 21:44:56 PAGE 12
676 if(FF)
677 {
678 SJA1000_ADDRESS++;
679 CAN_RXD_BUF[i+5]=*SJA1000_ADDRESS;
680 }
681 else
682 {
683 SJA1000_ADDRESS++;
684 CAN_RXD_BUF[i+3]=*SJA1000_ADDRESS;
685 }
686 }
687 if(FF)
688 {
689 can_length=Length+5;
690 }
691 else
692 {
693 can_length=Length+3;
694 }
695 SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
696 *SJA1000_ADDRESS=SJA1000_RELEASE_FIFO; //释放接收缓冲器
697 receive_succeed=1;
698 if(RTR)
699 receive_succeed=1; //置接收成功标志
700 for(i=0;i<14;i++)
701 {
702 P2=CAN_RXD_BUF[i];
703 for(j=0;j<255;j++)
704 for(k=0;k<255;k++)
705 for(l=0;l<8;l++)
706 ;
707 }
708 }
709 else
710 {
711 receive_succeed=0;
712 SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
713 *SJA1000_ADDRESS=SJA1000_RELEASE_FIFO; //释放接收缓冲区
714 SJA1000_ADDRESS=SJA1000_ALC; //指向仲裁丢失寄存器
715 can_temp=*SJA1000_ADDRESS; //通过读取清除
716 SJA1000_ADDRESS=SJA1000_ECC; //指向错误捕捉寄存器
717 can_temp=*SJA1000_ADDRESS; //通过读取清除
718 }
719 }
720 }
721 }
722 SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,检查中断类型
723 can_temp=*SJA1000_ADDRESS;
724 can_temp=*SJA1000_ADDRESS;
725 ET1=1;
726 return;
727 } */
728 /*
729 void changebound()
730 {
731 TJA1050_CLOSE;
732
733 SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
734 *SJA1000_ADDRESS=SJA1000_RESET_MODEL; //进入复位模式
735 while(!(*SJA1000_ADDRESS&SJA1000_RESET_MODEL)); //等待进入复位模式
736
737 SJA1000_ADDRESS=SJA1000_BUSTIME0; //指向总线定时0寄存器
C51 COMPILER V6.12 STEPBYSTEP 09/16/2007 21:44:56 PAGE 13
738 *SJA1000_ADDRESS=BTR0_NUM; //选择100Kbps
739 SJA1000_ADDRESS=SJA1000_BUSTIME1; //指向总线定时1寄存器
740 *SJA1000_ADDRESS=BTR1_NUM; //选择100Kbps
741
742 SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
743 *SJA1000_ADDRESS=SJA1000_WORK_MODEL; //设置双滤波接收,进入工作模式
744 while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL); //等待进入工作模式
745
746 TJA1050_WORK;
747 } */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1465 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 70 ----
IDATA SIZE = ---- ----
BIT SIZE = 9 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -