📄 hdlc.c
字号:
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 + -