📄 hdlc.c
字号:
/********************************************************************************/
/* */
/* 描述: 复用解复用板(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 + -