📄 hdlc.lst
字号:
651 2 m_sL1Que.ucTxPlaceIndex++;
652 2 m_sL1Que.ucTxPlaceIndex = m_sL1Que.ucTxPlaceIndex%L1TXBUFNUM;
653 2 m_sL1Que.ucTxPendNum++;
654 2
655 2 m_sL2Que.ucTxDealIndex++;
656 2 m_sL2Que.ucTxDealIndex = m_sL2Que.ucTxDealIndex%L2TXBUFNUM;
657 2 m_sL2Que.ucTxPendNum--;
658 2 }
659 1
660 1
661 1 return;
662 1 }
663
664
665 /********************************************************************************/
666 /* 函数名称:void CheckRxL1Layer(void) */
667 /* 简要描述:监测物理层L1接收函数 */
668 /* */
669 /* 时 间:2002年02月21日 */
670 /********************************************************************************/
671 void CheckRxL1Layer(void)
672 {
673 1 uchar data i;
674 1
675 1 /* 看门狗 */
676 1 WATCHDOG = ~WATCHDOG;
677 1
678 1 /* 接收部分L1-->L2 */
679 1 if(m_sL1Que.ucRxPendNum>0) /* 尚有接收帧需处理 */
680 1 {
681 2 /* 包长度小于3时或链路层L2缓冲区满时将丢弃当前包 */
682 2 if(L1RxBuf[m_sL1Que.ucRxDealIndex].ucLength >= 3)
683 2 {
684 3 if(m_sL2Que.ucRxPendNum <= L2RXBUFNUM)
685 3 {
686 4 /* 数据包从L1缓冲区移至L2缓冲区 */
687 4 L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucLength = L1RxBuf[m_sL1Que.ucRxDealIndex].ucLength;
688 4 L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucRsv1[0] = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[0];
-
689 4 L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucRsv1[1] = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[1];
-
690 4 L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucCRID = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[2];
-
691 4 L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucRsv2 = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[3];
-
692 4
693 4 for(i=4;i<L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucLength;i++)
694 4 {
695 5 L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucData[i-4] = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[
-i];
696 5 }
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 13
697 4
698 4 /* 剩余部分填充0 */
699 4 for(i=L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucLength;i<BUFSIZE;i++)
700 4 {
701 5 L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucData[i-4] = 0;
702 5 }
703 4
704 4 /* 调整指针 */
705 4 m_sL2Que.ucRxPlaceIndex++;
706 4 m_sL2Que.ucRxPlaceIndex = m_sL2Que.ucRxPlaceIndex%L2RXBUFNUM;
707 4 m_sL2Que.ucRxPendNum++;
708 4 }
709 3 else
710 3 {
711 4 /* 处理不及,置错误标志 */
712 4 m_bL1RxErrorFlag = WRONG;
713 4 }
714 3
715 3 }
716 2
717 2 m_sL1Que.ucRxDealIndex++;
718 2 m_sL1Que.ucRxDealIndex = m_sL1Que.ucRxDealIndex%L1RXBUFNUM;
719 2 m_sL1Que.ucRxPendNum--;
720 2 }
721 1
722 1 return;
723 1 }
724
725 /********************************************************************************/
726 /* 函数名称:void CheckTxL1Layer(void) */
727 /* 简要描述:监测物理层发送函数 */
728 /* */
729 /* 时 间:2002年02月21日 */
730 /********************************************************************************/
731 void CheckTxL1Layer(void)
732 {
733 1 uchar data i;
734 1
735 1 /* 看门狗 */
736 1 WATCHDOG = ~WATCHDOG;
737 1
738 1 /* 发送部分L1 */
739 1 if(m_sL1Que.ucTxPendNum>0) /* 尚有发送帧需处理 */
740 1 {
741 2 /* 发送数据 */
742 2 SendFrameB();
743 2
744 2 /* 指针调整 */
745 2 m_sL1Que.ucTxDealIndex++;
746 2 m_sL1Que.ucTxDealIndex = m_sL1Que.ucTxDealIndex%L1TXBUFNUM;
747 2 m_sL1Que.ucTxPendNum--;
748 2 }
749 1
750 1 return;
751 1 }
752
753
754 /********************************************************************************/
755 /* 函数名称:void SendFrameB(void) */
756 /* 简要描述:B通道发送HDLC消息 */
757 /* */
758 /* 时 间:2002年02月21日 */
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 14
759 /********************************************************************************/
760 void SendFrameB(void)
761 {
762 1 uchar data temp;
763 1 uchar data i,j;
764 1
765 1 WATCHDOG = ~WATCHDOG;
766 1
767 1 m_ucBTxFrameLen = L1TxBuf[m_sL1Que.ucTxDealIndex].ucLength;
768 1
769 1 for(j=0;j<200;j++)
770 1 {
771 2 m_ucBSTARStatus = *(SAB82525+BSTAR);
772 2
773 2 if ((m_ucBSTARStatus&XFW_CEC) == XFW)
774 2 {
775 3 m_bL1TxErrorFlag = RIGHT;
776 3
777 3 // EX0=0;
778 3
779 3 for(i=0;i<m_ucBTxFrameLen;i++)
780 3 {
781 4 *(SAB82525+BFIFO) = L1TxBuf[m_sL1Que.ucTxDealIndex].ucData[i];
782 4 }
783 3 temp = CheckBSTAR();
784 3 *(SAB82525+BCMDR) = 0x0a;
785 3
786 3 // EX0 = 1;
787 3
788 3 return;
789 3 }
790 2 }
791 1
792 1 /* 数据发不出去 */
793 1 m_bL1TxErrorFlag = WRONG;
794 1 // ALARM_LED = ON;
795 1
796 1 return;
797 1 }
798
799
800 /********************************************************************************/
801 /* 函数名称:uchar CheckASTAR(void) */
802 /* 简要描述:检测SAB82525状态函数 */
803 /* */
804 /* 时 间:2002年02月21日 */
805 /********************************************************************************/
806 uchar CheckASTAR(void)
807 {
808 1 uchar data ucStatus;
809 1
810 1 for(;;)
811 1 {
812 2 ucStatus = *(SAB82525+ASTAR);
813 2 if((ucStatus&0x04)==0x00) /* CMDR可写 */
814 2 {
815 3 break;
816 3 }
817 2 }
818 1
819 1 return ucStatus;
820 1 }
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 15
821
822
823 /********************************************************************************/
824 /* 函数名称:uchar CheckBSTAR(void) */
825 /* 简要描述:检测SAB82525状态函数 */
826 /* */
827 /* 时 间:2002年02月21日 */
828 /********************************************************************************/
829 uchar CheckBSTAR(void)
830 {
831 1 uchar data ucStatus;
832 1 for(;;)
833 1 {
834 2 ucStatus = *(SAB82525+BSTAR);
835 2 if((ucStatus&0x04)==0x00) /* CMDR可写 */
836 2 {
837 3 break;
838 3 }
839 2 }
840 1 return ucStatus;
841 1 }
842
843
844 /********************************************************************************/
845 /* 函数名称:void xint0(void) */
846 /* 简要描述:外部中断0(SAB82525中断)服务程序 */
847 /* */
848 /* 时 间:2002年02月21日 */
849 /********************************************************************************/
850 void xint0(void) interrupt 0 using 1 /* use registerbank 1 for interrupt */
851 {
852 1 uchar data temp;
853 1 uchar data i;
854 1
855 1 m_bXint0Flag = TRUE; /* 置中断标志 */
856 1
857 1 m_ucBISTAStatus = *(SAB82525+BISTA);
858 1 m_ucBEXIRStatus = *(SAB82525+BEXIR);
859 1 m_ucBRSTAStatus = *(SAB82525+BRSTA);
860 1 m_ucAISTAStatus = *(SAB82525+AISTA);
861 1 m_ucAEXIRStatus = *(SAB82525+AEXIR);
862 1 m_ucARSTAStatus = *(SAB82525+ARSTA);
863 1
864 1 /* 处理B通道EXIR指示中断 */
865 1 if( (m_ucBISTAStatus&EXB) == EXB )
866 1 {
867 2 if( (m_ucBEXIRStatus&RFO) == RFO )
868 2 {
869 3 /* 接收帧溢出--RECEIVE FRAME OVERFLOW */
870 3 *(SAB82525+BCMDR) = RHR; /* 复位接收FIFO及接收器RECEIVER */
871 3 }
872 2 }
873 1
874 1 /* 处理B通道RPF中断 */
875 1 if( (m_ucBISTAStatus&RPF) == RPF )
876 1 {
877 2 /* 收到>32字节的帧--RECEIVE POOL FULL */
878 2 *(SAB82525+BCMDR) = RHR; /* 复位接收FIFO及接收器RECEIVER */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -