📄 hdlc.lst
字号:
225 1 m_ucASTARStatus = CheckASTAR();
226 1
227 1
228 1 /* 初始化B通道,测试时设定外部环回 */
229 1 *(SAB82525+BCCR1) = 0x25; /* 设为:待机+总线模式1+TXD开漏输出+空闲发1+时钟模式5 */
230 1 *(SAB82525+BCCR2) = 0x38; /* 设为:发送时钟由外部输入 */
231 1 *(SAB82525+BTSAX) = (m_ucTimeSlot<<2)|0x03; /* 设置时隙 */
232 1 *(SAB82525+BTSAR) = (m_ucTimeSlot<<2)|0x03; /* 设置时隙 */
233 1 *(SAB82525+BXCCR) = 0x07; /* 设为:每个时隙8位 */
234 1 *(SAB82525+BRCCR) = 0x07; /* 设为:每个时隙8位 */
235 1 *(SAB82525+BMASK) = 0x3e; /* 设为:开RME+RPF+EXB中断 */
236 1 *(SAB82525+BMODE) = 0x88; /* 设为:透明模式+无地址识别+外部定时 */
237 1 *(SAB82525+BRLCR) = 0x01; /* 设为:接收数据帧长度检测(62字节) */
238 1 *(SAB82525+BXBCH) = 0x00; /* 设为:全双工LAPB/LAPD */
239 1
240 1 *(SAB82525+BCMDR) = 0xc1; /* 设为:复位HDLC接收器+发送器 */
241 1 *(SAB82525+BCCR1) = 0xa5; /* 设为:启动+ */
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 5
242 1 m_ucBSTARStatus = CheckBSTAR();
243 1
244 1 return;
245 1 }
246
247
248 /********************************************************************************/
249 /* 函数名称:void CheckRxL3Layer(void) */
250 /* 简要描述:监测网络层L3接收通讯函数 */
251 /* */
252 /* 时 间:2002年02月21日 */
253 /********************************************************************************/
254 void CheckRxL3Layer(void)
255 {
256 1 uchar data i;
257 1
258 1 /* 看门狗 */
259 1 WATCHDOG = ~WATCHDOG;
260 1
261 1 /* 接收部分L3 */
262 1 if(m_sL3Que.ucRxPendNum>0) /* 尚有接收帧需处理 */
263 1 {
264 2 /* 数据包从L3缓冲区移至临时变量中 */
265 2 L3RxVar = L3RxBuf[m_sL3Que.ucRxDealIndex];
266 2
267 2 /* 调整接收部分L3指针 */
268 2 m_sL3Que.ucRxDealIndex++;
269 2 m_sL3Que.ucRxDealIndex = m_sL3Que.ucRxDealIndex%L3RXBUFNUM;
270 2 m_sL3Que.ucRxPendNum--;
271 2
272 2 /* 调用处理函数 */
273 2 HandleCMD();
274 2 }
275 1
276 1 return;
277 1 }
278
279
280 /********************************************************************************/
281 /* 函数名称:uchar SendMSG(void) */
282 /* 简要描述:网络层发送函数外部接口 */
283 /* */
284 /* 时 间:2002年02月21日 */
285 /********************************************************************************/
286 uchar SendMSG(void)
287 {
288 1 uchar data i;
289 1
290 1 /* 看门狗 */
291 1 WATCHDOG = ~WATCHDOG;
292 1
293 1 /* 发送部分L3 */
294 1 if(m_sL2Que.ucLinkState == DL_ESTABLISH)
295 1 {
296 2 if(m_sL3Que.ucTxPendNum <= L3TXBUFNUM) /* 尚有空间 */
297 2 {
298 3 /* 数据包从临时变量移至L3缓冲区中 */
299 3 L3TxBuf[m_sL3Que.ucTxPlaceIndex] = L3TxVar;
300 3
301 3 /* 调整接收部分L3指针 */
302 3 m_sL3Que.ucTxPlaceIndex++;
303 3 m_sL3Que.ucTxPlaceIndex = m_sL3Que.ucTxPlaceIndex%L3TXBUFNUM;
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 6
304 3 m_sL3Que.ucTxPendNum++;
305 3
306 3 m_bL3TxErrorFlag = RIGHT;
307 3 }
308 2 else
309 2 {
310 3 /* 网络层发送队列满,来不及处理,置错误标志 */
311 3 m_bL3TxErrorFlag = WRONG;
312 3 return FALSE;
313 3 }
314 2 }
315 1
316 1 return TRUE;
317 1 }
318
319
320 /********************************************************************************/
321 /* 函数名称:void CheckRxL2Layer(void) */
322 /* 简要描述:监测链路层L2接收通讯函数 */
323 /* */
324 /* 时 间:2002年02月21日 */
325 /********************************************************************************/
326 void CheckRxL2Layer(void)
327 {
328 1 uchar data i;
329 1
330 1 /* 看门狗 */
331 1 WATCHDOG = ~WATCHDOG;
332 1
333 1 /* 接收部分L2及L2-->L3 */
334 1 if(m_sL2Que.ucRxPendNum>0) /* 尚有接收帧需处理 */
335 1 {
336 2 /* 判断帧类型 */
337 2 switch (L2RxBuf[m_sL2Que.ucRxDealIndex].ucCRID)
338 2 {
339 3 case SABME_CONTROL:
340 3
341 3 /* 链路层发送队列未满 */
342 3 if(m_sL2Que.ucTxPendNum <= L2TXBUFNUM)
343 3 {
344 4 /* 发送UA帧 */
345 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength = 4;
346 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;
-
347 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;
-
348 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID = UA_CONTROL;
-
349 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2 = 0;
-
350 4
351 4 /* 调整L2发送指针 */
352 4 m_sL2Que.ucTxPlaceIndex++;
353 4 m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
354 4 m_sL2Que.ucTxPendNum++;
355 4 }
356 3 else
357 3 {
358 4 /* 链路层发送队列满,来不及处理,置错误标志 */
359 4 m_bL2TxErrorFlag = WRONG;
360 4 }
361 3
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 7
362 3 /* 标识链路状态 */
363 3 m_sL2Que.ucLinkState = DL_ESTABLISH;
364 3
365 3 m_sL2Que.ucTxIFrameStatus = IDLE; /* 可以发送I帧了 */
366 3 m_sL2Que.ucRSendFlag = FALSE;
367 3 m_sL2Que.ucT201Control = OFF;
368 3
369 3 break;
370 3
371 3 case IFRAME_CONTROL:
372 3
373 3 if(m_sL2Que.ucLinkState == DL_ESTABLISH) /* 链路建立时才将数据从L2-->l3 */
374 3 {
375 4 /* 数据包从L2缓冲区移至L3缓冲区 */
376 4 L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucPID = L2RxBuf[m_sL2Que.ucRxDealIndex].ucData
-[0];
377 4 L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucLength = L2RxBuf[m_sL2Que.ucRxDealIndex].ucData
-[1];
378 4 L3RxBuf[m_sL3Que.ucRxPlaceIndex].uiType = L2RxBuf[m_sL2Que.ucRxDealIndex].ucData
-[2];
379 4 L3RxBuf[m_sL3Que.ucRxPlaceIndex].uiType = (L3RxBuf[m_sL3Que.ucRxPlaceIndex].uiTy
-pe<<8)|
380 4 L2RxBuf[m_sL2Que.ucRxDealIndex].ucData
-[3];
381 4
382 4 for(i=0;i<L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucLength-4;i++)
383 4 {
384 5 L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucData[i] = L2RxBuf[m_sL2Que.ucRxDealIndex].u
-cData[4+i];
385 5 }
386 4
387 4 /* 剩余部分填充0 */
388 4 for(i=L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucLength-4;i<BUFSIZE-8;i++)
389 4 {
390 5 L3RxBuf[m_sL2Que.ucRxPlaceIndex].ucData[i] = 0;
391 5 }
392 4
393 4 /* 调整接收部分L3<-->L2指针 */
394 4 m_sL3Que.ucRxPlaceIndex++;
395 4 m_sL3Que.ucRxPlaceIndex = m_sL3Que.ucRxPlaceIndex%L3RXBUFNUM;
396 4 m_sL3Que.ucRxPendNum++;
397 4
398 4 /* 链路层发送队列未满 */
399 4 if(m_sL2Que.ucTxPendNum <= L2TXBUFNUM)
400 4 {
401 5 /* 发送RR帧 */
402 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength = 4;
403 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;
-
404 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;
-
405 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID = RR_CONTROL;
-
406 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2 = 0;
-
407 5
408 5 /* 调整L2发送指针 */
409 5 m_sL2Que.ucTxPlaceIndex++;
410 5 m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
411 5 m_sL2Que.ucTxPendNum++;
412 5 }
413 4 else
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 8
414 4 {
415 5 /* 链路层发送队列满 */
416 5 m_bL2TxErrorFlag = WRONG;
417 5 }
418 4 }
419 3
420 3 break;
421 3
422 3 case UA_CONTROL:
423 3
424 3 /* 标识链路状态 */
425 3 m_sL2Que.ucLinkState = DL_ESTABLISH;
426 3
427 3 /* 停止SABME重发 */
428 3 m_sL2Que.ucTxIFrameStatus = IDLE; /* 可以发送I帧了 */
429 3 m_sL2Que.ucRSendFlag = FALSE;
430 3 m_sL2Que.ucT201Control = OFF;
431 3
432 3 break;
433 3
434 3 case RR_CONTROL:
435 3
436 3 /* 停止I帧重发 */
437 3 m_sL2Que.ucRSendFlag = FALSE;
438 3 m_sL2Que.ucT201Control = OFF;
439 3
440 3 break;
441 3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -