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

📄 hdlc.lst

📁 在大型通信系统(机架插板式)中多块单板通过TDM总线
💻 LST
📖 第 1 页 / 共 5 页
字号:
 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 + -