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

📄 main.lst

📁 本程序使用C8051F040芯片与CP2200实现单片机与以太网互联。
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -