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

📄 hdlc.c

📁 在大型通信系统(机架插板式)中多块单板通过TDM总线
💻 C
📖 第 1 页 / 共 3 页
字号:
    return;
}


/********************************************************************************/
/*  函数名称:void CheckRxL1Layer(void)                                          */
/*  简要描述:监测物理层L1接收函数                                               */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void CheckRxL1Layer(void)                   
{     
    uchar data i;
    
    /* 看门狗 */   
    WATCHDOG = ~WATCHDOG;

    /* 接收部分L1-->L2 */
    if(m_sL1Que.ucRxPendNum>0)      /* 尚有接收帧需处理     */
    {
        /* 包长度小于3时或链路层L2缓冲区满时将丢弃当前包 */
        if(L1RxBuf[m_sL1Que.ucRxDealIndex].ucLength >= 3) 
        {
            if(m_sL2Que.ucRxPendNum <= L2RXBUFNUM)
            {
                /* 数据包从L1缓冲区移至L2缓冲区 */
                L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucLength  = L1RxBuf[m_sL1Que.ucRxDealIndex].ucLength;
                L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucRsv1[0] = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[0];     
                L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucRsv1[1] = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[1];     
                L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucCRID    = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[2];     
                L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucRsv2    = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[3];     
        
                for(i=4;i<L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucLength;i++)   
                {
                    L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucData[i-4] = L1RxBuf[m_sL1Que.ucRxDealIndex].ucData[i];
                }
        
                /* 剩余部分填充0 */
                for(i=L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucLength;i<BUFSIZE;i++)   
                {
                    L2RxBuf[m_sL2Que.ucRxPlaceIndex].ucData[i-4] = 0;
                }
        
                /* 调整指针 */
                m_sL2Que.ucRxPlaceIndex++;
                m_sL2Que.ucRxPlaceIndex = m_sL2Que.ucRxPlaceIndex%L2RXBUFNUM;
                m_sL2Que.ucRxPendNum++;
            }
            else
            {
                /* 处理不及,置错误标志 */
                m_bL1RxErrorFlag = WRONG;          
            }
        
        }
        
        m_sL1Que.ucRxDealIndex++;
        m_sL1Que.ucRxDealIndex = m_sL1Que.ucRxDealIndex%L1RXBUFNUM;
        m_sL1Que.ucRxPendNum--;
    }       
    
    return;
}

/********************************************************************************/
/*  函数名称:void CheckTxL1Layer(void)                                          */
/*  简要描述:监测物理层发送函数                                                 */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void CheckTxL1Layer(void)                   
{     
    uchar data i;
    
    /* 看门狗     */
    WATCHDOG = ~WATCHDOG;
   
    /* 发送部分L1 */
    if(m_sL1Que.ucTxPendNum>0)      /* 尚有发送帧需处理      */
    {
        /* 发送数据 */
        SendFrameB();

        /* 指针调整  */
        m_sL1Que.ucTxDealIndex++;
        m_sL1Que.ucTxDealIndex = m_sL1Que.ucTxDealIndex%L1TXBUFNUM;
        m_sL1Que.ucTxPendNum--;
    }       

    return;
}


/********************************************************************************/
/*  函数名称:void SendFrameB(void)                                              */
/*  简要描述:B通道发送HDLC消息                                                  */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void SendFrameB(void)                  
{     
    uchar data temp;
    uchar data i,j;

    WATCHDOG = ~WATCHDOG;

    m_ucBTxFrameLen = L1TxBuf[m_sL1Que.ucTxDealIndex].ucLength;

    for(j=0;j<200;j++)
    {
        m_ucBSTARStatus = *(SAB82525+BSTAR);
    
        if ((m_ucBSTARStatus&XFW_CEC) == XFW)
        {
            m_bL1TxErrorFlag = RIGHT;

//            EX0=0;

            for(i=0;i<m_ucBTxFrameLen;i++)        
            {
                *(SAB82525+BFIFO) = L1TxBuf[m_sL1Que.ucTxDealIndex].ucData[i];  
            }
            temp = CheckBSTAR();
            *(SAB82525+BCMDR) = 0x0a;
            
//            EX0 = 1;         

            return;
        }
    }
    
    /* 数据发不出去 */
    m_bL1TxErrorFlag = WRONG;   
//    ALARM_LED = ON;
    
    return;
}


/********************************************************************************/
/*  函数名称:uchar CheckASTAR(void)                                             */
/*  简要描述:检测SAB82525状态函数                                               */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
uchar CheckASTAR(void)
{ 
    uchar data ucStatus;

    for(;;)
    { 
        ucStatus = *(SAB82525+ASTAR);
        if((ucStatus&0x04)==0x00)        /* CMDR可写                             */
        {
            break;
        }
    }   

    return ucStatus;
}


/********************************************************************************/
/*  函数名称:uchar CheckBSTAR(void)                                             */
/*  简要描述:检测SAB82525状态函数                                               */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
uchar CheckBSTAR(void)
{ 
    uchar data ucStatus;
    for(;;)
    { 
        ucStatus = *(SAB82525+BSTAR);
        if((ucStatus&0x04)==0x00)        /* CMDR可写                             */
        {
            break;
        }
    }   
    return ucStatus;
}


/********************************************************************************/
/*  函数名称:void xint0(void)                                                   */
/*  简要描述:外部中断0(SAB82525中断)服务程序                                    */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void xint0(void) interrupt 0 using 1    /* use registerbank 1 for interrupt     */
{     
    uchar data temp;
    uchar data i;

    m_bXint0Flag = TRUE;                    /* 置中断标志                        */

    m_ucBISTAStatus = *(SAB82525+BISTA);
    m_ucBEXIRStatus = *(SAB82525+BEXIR);
    m_ucBRSTAStatus = *(SAB82525+BRSTA);
    m_ucAISTAStatus = *(SAB82525+AISTA);
    m_ucAEXIRStatus = *(SAB82525+AEXIR);
    m_ucARSTAStatus = *(SAB82525+ARSTA);
   
    /* 处理B通道EXIR指示中断  */
    if( (m_ucBISTAStatus&EXB) == EXB ) 
    {
        if( (m_ucBEXIRStatus&RFO) == RFO )
        {
            /* 接收帧溢出--RECEIVE FRAME OVERFLOW */
            *(SAB82525+BCMDR) = RHR;        /* 复位接收FIFO及接收器RECEIVER     */
        }
    }                       

    /* 处理B通道RPF中断  */
    if( (m_ucBISTAStatus&RPF) == RPF )  
    {
        /* 收到>32字节的帧--RECEIVE POOL FULL   */
        *(SAB82525+BCMDR) = RHR;        /* 复位接收FIFO及接收器RECEIVER     */
    }
        
    /* 处理B通道RME中断  */
    if ( (m_ucBISTAStatus&RME) == RME )
    {
        /* 收到<32字节的帧--RECEIVE MESSAGE END */
        if( ((m_ucBRSTAStatus&CRC)==CRC) && ((m_ucBRSTAStatus&VFR)==VFR) && ((m_ucBRSTAStatus&RDO)!=RDO) )  
        {
            /* 收到有效的帧--VALID FRAME RECEIVED,且CRC正确,没有RDO--RECEIVE DATA OVERFLOW  */
            m_ucBRBCL = *(SAB82525+BRBCL);
            m_ucBRBCL = (m_ucBRBCL-1);
            if((m_ucBRBCL>0) && (m_ucBRBCL<32))
            {
                /* 帧长度 */
                L1RxBuf[m_sL1Que.ucRxPlaceIndex].ucLength = m_ucBRBCL;   
        
                /* 有效数据 */
                for(i=0;i<m_ucBRBCL;i++)
                {
                    L1RxBuf[m_sL1Que.ucRxPlaceIndex].ucData[i] = *(SAB82525+BFIFO);   
                }
    
                /* CRC status */
                temp = *(SAB82525+BFIFO);   
                L1RxBuf[m_sL1Que.ucRxPlaceIndex].ucData[m_ucBRBCL] = temp;   
        
                m_ucBSTARStatus = CheckBSTAR();
                *(SAB82525+BCMDR) = RMC;
        
                /* 剩余填充0 */
                for(i=m_ucBRBCL+1;i<BUFSIZE;i++)
                {
                    L1RxBuf[m_sL1Que.ucRxPlaceIndex].ucData[i] = 0;   
                }
    
                /* 调整指针 */
                if(m_sL1Que.ucRxPendNum <= L1RXBUFNUM)
                {                   
                    m_sL1Que.ucRxPlaceIndex++;
                    m_sL1Que.ucRxPlaceIndex = m_sL1Que.ucRxPlaceIndex%L1RXBUFNUM;
            
                    m_sL1Que.ucRxPendNum++;
                }
    
                m_bBRxFrameFlag = TRUE;
            }
		}			
        else
        {
            /* 无效的帧 */
            *(SAB82525+BCMDR) = RHR;    /* 复位接收FIFO及接收器RECEIVER     */
        }
			
        if( (m_ucBRSTAStatus&CRC)==CRC)
		{
            m_bL1RxCRCFlag = RIGHT;
        }
        else
        {
            m_bL1RxCRCFlag = WRONG;
        }
    }

    /* 对于沿触发中断方式的CPU,当还有中断为处理完时,以下指令可再次产生中断  */
    *(SAB82525+BMASK) = 0xff;
    *(SAB82525+AMASK) = 0xff;
    *(SAB82525+BMASK) = 0x3e;
    *(SAB82525+AMASK) = 0x3f;

    return;
}


/********************************************************************************/
/*  函数名称:void timer0(void)                                                  */
/*  简要描述:定时器0中断服务程序(定时10ms)                                      */
/*                                                                              */
/*  时    间:2000年02月06日                                                     */
/********************************************************************************/
void timer0(void) interrupt 1 using 2   /* use registerbank 2 for interrupt     */
{     
    m_bTimer0Flag = TRUE;               /* 置中断标志                           */

    TH0=0xd8;                           /* 重装初值                             */
    TL0=0xf0;

    m_ucTimer0Count++;
    
    if(m_sL2Que.ucLinkState == DL_RELEASE)
    {
        COMM_LED = OFF;
    }
    else
    {
        COMM_LED = ON;
    }
    
    
    if(m_sL2Que.ucT201Control == ON)
    {
        m_sL2Que.ucT201++;              /* 重发定时器计数 */
    }
    else
    {
        m_sL2Que.ucT201 = 0;            /* 重发定时器计数值清零 */
    }
        
    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -