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

📄 hdlc.c

📁 在大型通信系统(机架插板式)中多块单板通过TDM总线
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************************************/
/*                                                                              */
/*  描述: 复用解复用板(V2.0)控制器程序                                          */
/*  VER:  2.0                                                                   */
/*  REV:  1.0                                                                   */
/*  作者: 胡丙龙                                                                */
/*  时间: 2002年02月21日                                                        */
/*                                                                              */
/********************************************************************************/
#pragma  debug code small optimize(5) objectextend 

#include "reg52.h"
#include "mdb.h"
#include "hpi.h"
#include "hdlc.h"
#include "constant.h"
#include "sab82525.h"


/* 结构变量定义 */
L1Queue idata m_sL1Que;
L2Queue idata m_sL2Que;
L3Queue idata m_sL3Que;

/* 缓冲区定义   */
L1Pack xdata L1RxBuf[L1RXBUFNUM];       /* 定义全局变量,物理层接收缓冲区       */
L1Pack xdata L1TxBuf[L1TXBUFNUM];       /* 定义全局变量,物理层发送缓冲区       */
L2Pack xdata L2RxBuf[L2RXBUFNUM];       /* 定义全局变量,链路层接收缓冲区       */
L2Pack xdata L2TxBuf[L2TXBUFNUM];       /* 定义全局变量,链路层发送缓冲区       */
L3Pack xdata L3RxBuf[L3RXBUFNUM];       /* 定义全局变量,网络层接收缓冲区       */
L3Pack xdata L3TxBuf[L3TXBUFNUM];       /* 定义全局变量,网络层发送缓冲区       */

L3Pack xdata L3TxVar;                   /* 网络层发送暂存变量,用户接口          */
L3Pack xdata L3RxVar;                   /* 网络层接收暂存变量,用户接口          */

/* 辅助变量定义 */
uchar data m_ucARSTAStatus;
uchar data m_ucBRSTAStatus;
uchar data m_ucASTARStatus;
uchar data m_ucBSTARStatus;
uchar data m_ucAISTAStatus;
uchar data m_ucBISTAStatus;
uchar data m_ucAEXIRStatus;
uchar data m_ucBEXIRStatus;
uchar data m_ucATxFrameLen;
uchar data m_ucBTxFrameLen;
uchar data m_ucARBCL;
uchar data m_ucBRBCL;

uchar bdata m_ucHDLCErrorFlag;      
sbit m_bL1RxErrorFlag = m_ucHDLCErrorFlag^0;    /* 定义物理层L1接收队列溢出标志,收到后来不及处理    */
sbit m_bL2TxErrorFlag = m_ucHDLCErrorFlag^1;    /* 定义链路层L2发送队列溢出标志,U/I/S帧来不及发送   */
sbit m_bL3TxErrorFlag = m_ucHDLCErrorFlag^2;    /* 定义网络层L3发送队列溢出标志,I帧来不及发送       */
sbit m_bL1RxCRCFlag   = m_ucHDLCErrorFlag^3;    /* 定义物理层L1接收CRC校验错标志                    */
sbit m_bARxFrameFlag  = m_ucHDLCErrorFlag^4;    /* 定义A通道接收到HDLC消息标志                      */
sbit m_bBRxFrameFlag  = m_ucHDLCErrorFlag^5;    /* 定义B通道接收到HDLC消息标志                      */
sbit m_bL1TxErrorFlag = m_ucHDLCErrorFlag^6;    /* 定义物理层L1发送错误标志     */

/* 外部变量 */
extern uchar xdata *SAB82525;           /* 定义SAB82525芯片译码地址             */

extern uchar data m_ucTimeSlot;         /* 时隙号                               */
extern uchar data m_ucTimer0Count;      /* 10ms定时计数器                       */

extern bit m_bTimer0Flag;
extern bit m_bTimer1Flag;
extern bit m_bXint0Flag;
extern bit m_bXint1Flag;

/* 函数声明 */
void  InitSAB82525(void);               /* 初始化HDLC函数                       */
void  InitHDLC(void);                   /* 初始化HDLC缓冲区                     */
void  CheckRxL3Layer(void);             /* 监测第三层接收情况函数               */    
void  CheckTxL2Layer(void);             /* 监测第二层发送情况函数               */                   
void  CheckRxL2Layer(void);             /* 监测第二层接收情况函数               */    
void  CheckTxL1Layer(void);             /* 监测物理层发送情况函数               */                   
void  CheckRxL1Layer(void);             /* 监测物理层接收情况函数               */    
void  SendFrameB(void);                 /* A通道发送HDLC消息函数                */
uchar CheckASTAR(void);                 /* 检查ASTAR状态函数                    */
uchar CheckBSTAR(void);                 /* 检查BSTAR状态函数                    */
uchar SendMSG(void);                    /* 发送消息L3,外部接口                  */

/* 外部函数 */
extern void  HandleCMD(void);           /* 处理收到的命令L3,外部接口            */

/********************************************************************************/
/*  函数名称:void InitHDLC(void)                                                */
/*  简要描述:初始化HDLC缓冲区及参数                                             */
/*                                                                              */
/*  时    间:2002年02月25日                                                     */
/********************************************************************************/
void InitHDLC(void)                  
{     
    uchar data i,j;

    WATCHDOG = ~WATCHDOG;               /* 看门狗   */

    /* 初始化缓冲区 */
    for(i=0;i<L3RXBUFNUM;i++)           /* 网络层L3 */
    {
        L3RxBuf[i].ucPID = 0;       
        L3RxBuf[i].ucLength = 0;        
        L3RxBuf[i].uiType = 0;      
        for(j=0;j<BUFSIZE-8;j++)
        {
            L3RxBuf[i].ucData[j] = 0;
        }
    }
    for(i=0;i<L3TXBUFNUM;i++)
    {
        L3TxBuf[i].ucPID = 0;       
        L3TxBuf[i].ucLength = 0;        
        L3TxBuf[i].uiType = 0;      
        for(j=0;j<BUFSIZE-8;j++)
        {
            L3TxBuf[i].ucData[j] = 0;
        }
    }
    for(i=0;i<L2RXBUFNUM;i++)           /* 链路层L2 */
    {
        L2RxBuf[i].ucLength = 0;        
        L2RxBuf[i].ucRsv1[0] = 0;       
        L2RxBuf[i].ucRsv1[1] = 0;       
        L2RxBuf[i].ucCRID = 0;      
        L2RxBuf[i].ucRsv2 = 0;      
        for(j=0;j<BUFSIZE-4;j++)
        {
            L2RxBuf[i].ucData[j] = 0;
        }
    }
    for(i=0;i<L2TXBUFNUM;i++)           
    {
        L2TxBuf[i].ucLength = 0;        
        L2TxBuf[i].ucRsv1[0] = 0;       
        L2TxBuf[i].ucRsv1[1] = 0;       
        L2TxBuf[i].ucCRID = 0;      
        L2TxBuf[i].ucRsv2 = 0;      
        for(j=0;j<BUFSIZE-4;j++)
        {
            L2TxBuf[i].ucData[j] = 0;
        }
    }
    for(i=0;i<L1RXBUFNUM;i++)           /* 物理层L1 */
    {
        L1RxBuf[i].ucLength = 0;        
        for(j=0;j<BUFSIZE-8;j++)
        {
            L1RxBuf[i].ucData[j] = 0;
        }
    }
    for(i=0;i<L1TXBUFNUM;i++)           
    {
        L1TxBuf[i].ucLength = 0;        
        for(j=0;j<BUFSIZE-8;j++)
        {
            L1TxBuf[i].ucData[j] = 0;
        }
    }

    
    /* 初始化变量   */
    m_sL1Que.ucTxPendNum = 0;               /* 物理层 */
    m_sL1Que.ucRxPendNum = 0;
    m_sL1Que.ucTxDealIndex = 0;
    m_sL1Que.ucTxPlaceIndex = 0;
    m_sL1Que.ucRxDealIndex = 0;
    m_sL1Que.ucRxPlaceIndex = 0;

    m_sL2Que.ucLinkState = DL_RELEASE;      /* 链路层 */
    m_sL2Que.ucTxIFrameStatus = IDLE;       
    m_sL2Que.ucT201Control = OFF;
    m_sL2Que.ucT201 = 0;
    m_sL2Que.ucN200 = 0;
    m_sL2Que.ucRSendFlag = FALSE;
    m_sL2Que.ucTxPendNum = 0;
    m_sL2Que.ucRxPendNum = 0;
    m_sL2Que.ucTxDealIndex = 0;
    m_sL2Que.ucTxPlaceIndex = 0;
    m_sL2Que.ucRxDealIndex = 0;
    m_sL2Que.ucRxPlaceIndex = 0;

    m_sL3Que.ucTxPendNum = 0;               /* 网络层 */
    m_sL3Que.ucRxPendNum = 0;
    m_sL3Que.ucTxDealIndex = 0;
    m_sL3Que.ucTxPlaceIndex = 0;
    m_sL3Que.ucRxDealIndex = 0;
    m_sL3Que.ucRxPlaceIndex = 0;

    m_bL1RxErrorFlag = RIGHT;
    m_bL2TxErrorFlag = RIGHT;
    m_bL3TxErrorFlag = RIGHT;
    m_bL1RxCRCFlag   = RIGHT;
    m_bL1TxErrorFlag = RIGHT;
    m_bARxFrameFlag  = FALSE;
    m_bBRxFrameFlag  = FALSE;
    
    return;
}


/********************************************************************************/
/*  函数名称:void InitSAB82525(void)                                            */
/*  简要描述:初始化SAB82525函数                                                 */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void InitSAB82525(void)                  
{     
    WATCHDOG = ~WATCHDOG;
    
    /* 初始化A通道,测试时用内部环回  */
    *(SAB82525+ACCR1) = 0x25;           /* 设为:待机+总线模式1+TXD开漏输出+空闲发1+时钟模式5    */ 
    *(SAB82525+ACCR2) = 0x38;           /* 设为:发送时钟由外部输入              */
    *(SAB82525+ATSAX) = (m_ucTimeSlot<<2)|0x03;  /* 设置时隙                    */
    *(SAB82525+ATSAR) = (m_ucTimeSlot<<2)|0x03;  /* 设置时隙                    */
    *(SAB82525+AXCCR) = 0x07;           /* 设为:每个时隙8位                     */
    *(SAB82525+ARCCR) = 0x07;           /* 设为:每个时隙8位                     */
    *(SAB82525+AMASK) = 0x3f;           /* 设为:开RME+RPF中断                   */
    *(SAB82525+AMODE) = 0x88;           /* 设为:透明模式+无地址识别+外部定时    */ 
    *(SAB82525+ARLCR) = 0x01;           /* 设为:接收数据帧长度检测(62字节)      */
    *(SAB82525+AXBCH) = 0x00;           /* 设为:全双工LAPB/LAPD                 */
        
    *(SAB82525+ACMDR) = 0xc1;           /* 设为:复位HDLC接收器+发送器           */  
    *(SAB82525+ACCR1) = 0xa5;           /* 设为:启动+                           */
    m_ucASTARStatus = CheckASTAR();


    /* 初始化B通道,测试时设定外部环回  */
    *(SAB82525+BCCR1) = 0x25;           /* 设为:待机+总线模式1+TXD开漏输出+空闲发1+时钟模式5    */ 
    *(SAB82525+BCCR2) = 0x38;           /* 设为:发送时钟由外部输入              */
    *(SAB82525+BTSAX) = (m_ucTimeSlot<<2)|0x03; /* 设置时隙                     */
    *(SAB82525+BTSAR) = (m_ucTimeSlot<<2)|0x03; /* 设置时隙                     */
    *(SAB82525+BXCCR) = 0x07;           /* 设为:每个时隙8位                     */
    *(SAB82525+BRCCR) = 0x07;           /* 设为:每个时隙8位                     */
    *(SAB82525+BMASK) = 0x3e;           /* 设为:开RME+RPF+EXB中断           	*/
    *(SAB82525+BMODE) = 0x88;           /* 设为:透明模式+无地址识别+外部定时    */ 
    *(SAB82525+BRLCR) = 0x01;           /* 设为:接收数据帧长度检测(62字节)      */
    *(SAB82525+BXBCH) = 0x00;           /* 设为:全双工LAPB/LAPD                 */
        
    *(SAB82525+BCMDR) = 0xc1;           /* 设为:复位HDLC接收器+发送器           */  
    *(SAB82525+BCCR1) = 0xa5;           /* 设为:启动+                           */
    m_ucBSTARStatus = CheckBSTAR();

    return;
}


/********************************************************************************/
/*  函数名称:void CheckRxL3Layer(void)                                          */
/*  简要描述:监测网络层L3接收通讯函数                                           */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void CheckRxL3Layer(void)                   
{     
    uchar data i;
    
    /* 看门狗 */   
    WATCHDOG = ~WATCHDOG;

    /* 接收部分L3 */
    if(m_sL3Que.ucRxPendNum>0)      /* 尚有接收帧需处理 */  
    {
        /* 数据包从L3缓冲区移至临时变量中 */
        L3RxVar = L3RxBuf[m_sL3Que.ucRxDealIndex];
                    
        /* 调整接收部分L3指针 */
        m_sL3Que.ucRxDealIndex++;
        m_sL3Que.ucRxDealIndex = m_sL3Que.ucRxDealIndex%L3RXBUFNUM;
        m_sL3Que.ucRxPendNum--;

        /* 调用处理函数 */
        HandleCMD();
    }
     
    return;
} 


/********************************************************************************/
/*  函数名称:uchar SendMSG(void)                                                */
/*  简要描述:网络层发送函数外部接口                                             */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
uchar SendMSG(void)
{     
    uchar data i;
    
    /* 看门狗     */
    WATCHDOG = ~WATCHDOG;

    /* 发送部分L3 */
	if(m_sL2Que.ucLinkState == DL_ESTABLISH)
	{
	    if(m_sL3Que.ucTxPendNum <= L3TXBUFNUM)       /* 尚有空间      */
	    {
	        /* 数据包从临时变量移至L3缓冲区中 */
	        L3TxBuf[m_sL3Que.ucTxPlaceIndex] = L3TxVar;
	                    
	        /* 调整接收部分L3指针 */
	        m_sL3Que.ucTxPlaceIndex++;
	        m_sL3Que.ucTxPlaceIndex = m_sL3Que.ucTxPlaceIndex%L3TXBUFNUM;
	        m_sL3Que.ucTxPendNum++;
	
	        m_bL3TxErrorFlag = RIGHT;
	    }
	    else
	    {
	        /* 网络层发送队列满,来不及处理,置错误标志   */  
        	m_bL3TxErrorFlag = WRONG;
	        return FALSE;
	    }
	}

	return TRUE;
} 


/********************************************************************************/
/*  函数名称:void CheckRxL2Layer(void)                                          */
/*  简要描述:监测链路层L2接收通讯函数                                           */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void CheckRxL2Layer(void)                   
{     
    uchar data i;
    
    /* 看门狗 */   

⌨️ 快捷键说明

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