📄 main.lst
字号:
447 1 MAC_SetAddress(&MYMAC);
448 1
449 1 MAC_Write(MACCN, 0x0001); // 允许回环模式
450 1
451 1 }
452 /************************************************************************/
453 //访问MAC间接寄存器
454 /************************************************************************/
455 void MAC_Write(unsigned char mac_reg_offset, unsigned int mac_reg_data)
456 {
457 1 MACADDR = mac_reg_offset;
458 1 MACDATAH = (mac_reg_data >> 8); // Copy High Byte
459 1 MACDATAL = (mac_reg_data & 0xFF); // Copy Low Byte
460 1 MACRW = 0;
461 1
462 1 return;
463 1 }
464
465
466 /**************************************************************************/
467 //设置MAC地址
468 /**************************************************************************/
469 void MAC_SetAddress(MACADDRESS* pMAC)
470 {
471 1 UINT1 temp_int;
472 1
473 1 temp_int.Char[0] = pMAC->Char[5];
474 1 temp_int.Char[1] = pMAC->Char[4];
475 1 MAC_Write(MACAD0, temp_int.Int);
476 1
477 1 temp_int.Char[0] = pMAC->Char[3];
478 1 temp_int.Char[1] = pMAC->Char[2];
479 1 MAC_Write(MACAD1, temp_int.Int);
480 1
481 1 temp_int.Char[0] = pMAC->Char[1];
482 1 temp_int.Char[1] = pMAC->Char[0];
483 1 MAC_Write(MACAD2, temp_int.Int);
484 1
485 1 return;
486 1 }
487
488 /**************************************************************************/
C51 COMPILER V7.50 MAIN 12/14/2006 13:34:45 PAGE 9
489 // 以太网帧接收函数
490 /**************************************************************************/
491 void eth_rcve(UCHAR xdata * inbuf)
492 {
493 1 ETH_HEADER xdata * eth;
494 1 eth = (ETH_HEADER xdata *)inbuf;
495 1 if (eth->frame_type < 1520) // 帧长度不能超过IEEE 802标准归定
496 1 {
497 2 return;
498 2 }
499 1
500 1 switch (eth->frame_type) //根据接收到的数据包类型,选择不同的处理方式
501 1 {
502 2 case ARP_PACKET:
503 2 arp_rcve(inbuf);
504 2 break;
505 2
506 2 case IP_PACKET:
507 2 ip_rcve(inbuf);
508 2 break;
509 2 default:break;
510 2 }
511 1 }
512
513 /*************************************************************************/
514 //以太网帧传输函数--------传输层
515 /*************************************************************************/
516 void eth_send(UCHAR xdata * outbuf, UCHAR * hwaddr, UINT ptype, UINT len)
517 {
518 1 ETH_HEADER xdata * eth;
519 1
520 1 eth = (ETH_HEADER xdata *)outbuf;
521 1
522 1 //加入14位的以太网数据帧头标识
523 1 memcpy(eth->dest_hwaddr, hwaddr, 6);
524 1 memcpy(eth->source_hwaddr, my_hwaddr, 6);
525 1 eth->frame_type = ptype;
526 1 CP220x_Send(outbuf, len + 14); // 增加数据包长度
527 1 }
528
529 /*************************************************************************/
530 // CP2200发送函数
531 /*************************************************************************/
532 void CP220x_Send( UCHAR xdata * outbuf, UINT len)
533 {
534 1
535 1 int i;
536 1 unsigned int ramaddr;
537 1
538 1 // 定义宏来增加地址指针
539 1 #define INC_RAMADDR ramaddr++; \
540 1 RAMADDRH = (ramaddr >> 8);\
541 1 RAMADDRL = (ramaddr & 0x00FF);
542 1
543 1
544 1
545 1 while(TXBUSY); //等待传输结束
546 1
547 1 TXSTARTH = 0x00;
548 1 TXSTARTL = 0x00;
549 1 RAMADDRH = 0x00; //地址设为零
550 1 RAMADDRL = 0x00;
C51 COMPILER V7.50 MAIN 12/14/2006 13:34:45 PAGE 10
551 1 ramaddr = 0x0000;
552 1
553 1 for(i = 0; i < len; i++)
554 1 {
555 2 RAMTXDATA = outbuf[i];
556 2 INC_RAMADDR
557 2 }
558 1
559 1 while(ramaddr < 64) //将不足64字节长度的数据填充到64字节
560 1 {
561 2 RAMTXDATA = 0;
562 2 INC_RAMADDR
563 2 }
564 1
565 1 ramaddr--;
566 1 TXENDH = (ramaddr >> 8); //将RAM地址减一后赋给TXEND使其地址为)X0040
567 1 TXENDL = (ramaddr & 0x00FF);
568 1 TXSTARTH = 0x00;
569 1 TXSTARTL = 0x00; //将TXSTAR地址归零
570 1 TXCN = 0x01; //向TXGO写1开始传输
571 1 }
572
573 /****************************************************************/
574 //CP2200芯片接收数据函数
575 /****************************************************************/
576 UCHAR xdata * rcve_frame(void)
577
578 {
579 1 bit rx_ok;
580 1 bit skip = 0;
581 1 UINT1 cplen;
582 1 unsigned int i;
583 1 UCHAR xdata * buf;
584 1
585 1 unsigned char interrupt_read;
586 1 unsigned char valid_bits;
587 1 unsigned char num_packets;
588 1
589 1
590 1 interrupt_read = INT1;
591 1 interrupt_read = INT0; //清中断标志
592 1
593 1
594 1 if( interrupt_read & RXINT) //判断接收中断是否产生
595 1 {
596 2
597 2 valid_bits = TLBVALID; //对接收数据包进行统计
598 2 for(num_packets = 0; valid_bits; num_packets++)
599 2 {
600 3 valid_bits &= valid_bits - 1;
601 3 }
602 2
603 2
604 2 if( num_packets >= 7) //接收区超过7个数据包,停止接收
605 2 {
606 3 RXCN = RXINH;
607 3 }
608 2 }
609 1
610 1 //以下步骤参考CP2200数据手册的接收部分
611 1 rx_ok = (CPINFOL & RXOK) && (CPINFOH & RXVALID);
612 1
C51 COMPILER V7.50 MAIN 12/14/2006 13:34:45 PAGE 11
613 1 if(rx_ok)
614 1 {
615 2 cplen.Char[0] = CPLENH;
616 2 cplen.Char[1] = CPLENL;
617 2 buf=inbuf1;
618 2
619 2 }
620 1 else
621 1 {
622 2 cplen.Int = 0;
623 2 skip = 1;
624 2 buf = NULL;
625 2 }
626 1
627 1 if(1)
628 1 {
629 2 for(i = 0; i < cplen.Int; i++)
630 2 {
631 3 buf[i] = RXAUTORD;
632 3 }
633 2 rcve_buf_allocated = TRUE;
634 2 }
635 1 else
636 1 {
637 2 cplen.Int = 0;
638 2 skip = 1;
639 2 }
640 1
641 1 if(skip)
642 1 {
643 2 RXCN |= 0x02;
644 2 }
645 1
646 1 else
647 1 {
648 2 RXCN |= 0x04;
649 2 }
650 1
651 1 if(TLBVALID == 0x00)
652 1 {
653 2 RXCN = 0x00;
654 2 }
655 1
656 1 return(buf);
657 1 }
658
659
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1462 ----
CONSTANT SIZE = 18 ----
XDATA SIZE = 35 30
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = 2 ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -