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

📄 etherdev.lst

📁 移植uIP1.0到51单片机上的版本mcu_netV1.00 uIP ARP / ICMP / TCP协议的完全移植
💻 LST
字号:
C51 COMPILER V7.06   ETHERDEV                                                              05/02/2009 15:51:21 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE ETHERDEV
OBJECT MODULE PLACED IN .\etherdev.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\src\etherdev.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\etherdev.lst) OBJ
                    -ECT(.\etherdev.obj)

stmt level    source

   1          #include "uip.h"
   2          #include "etherdev.h"
   3          
   4          
   5          /*RTL8019的复位管脚*/
   6          sbit rst_pin = P1^6;
   7          
   8          
   9          static void etherdev_delay_ms(unsigned int count);
  10          static unsigned int etherdev_poll(void);
  11          void page( u8_t pagenumber );
  12          void etherdev_reset(void)
  13          {
  14   1          /*将复位管脚拉高100ms来复位芯片*/
  15   1          rst_pin = 1;
  16   1          etherdev_delay_ms(100);
  17   1          rst_pin = 0;
  18   1          etherdev_delay_ms(100);
  19   1      }
  20          
  21          /*页面设置函数,pnum为0-3*/
  22          void page(u8_t pnum)
  23          {
  24   1              u8_t temp;
  25   1              temp = CR;
  26   1              temp=temp & (~(PS1|PS0|TXP)); /*TXP位也应该清0,防止发送数据*/
  27   1              pnum = pnum <<6;
  28   1              CR = temp | pnum;
  29   1      } 
  30          
  31          /*以毫秒计算延时*/
  32          static void etherdev_delay_ms(unsigned int count)
  33          {
  34   1          for(count *= ETH_DELAY_MULTPLR; count > 0; count--) continue;
  35   1          return;
  36   1      }
  37          
  38          /*网卡初始化函数*/
  39          void etherdev_init(void)
  40          {       
  41   1          /*先复位芯片*/
  42   1          etherdev_reset( );
  43   1              /*先停止收发*/
  44   1              CR = RD2|STP;
  45   1          page(0);    
  46   1          /* 40H页到45H页共1536(6x256)个字节为发送缓存,其余为接收缓存*/
  47   1          /*这样发送缓存可以容纳最长的一个以太网数据帧。*/
  48   1          /*设置接收缓存的起始和结束地址*/
  49   1              PSTART = ETH_RX_PAGE_START; 
  50   1              PSTOP = ETH_RX_PAGE_STOP;
  51   1          /*BNRY指向接收缓存的首页*/
  52   1              BNRY = ETH_RX_PAGE_START; 
  53   1          /*TPSR,发送缓存区首地址*/
  54   1              TPSR = ETH_TX_PAGE_START;
C51 COMPILER V7.06   ETHERDEV                                                              05/02/2009 15:51:21 PAGE 2   

  55   1              RBCR1 = 0x00;
  56   1              RBCR0 = 0x00; 
  57   1              /*RCR接收配置寄存器1100 1100,*/
  58   1          /*接收广播包,组播包,目的MAC与本机相同的包,*/
  59   1          /*接收包不小于64字节,包有接收错误不接收*/
  60   1              RCR = 0xcc; 
  61   1          /*TCR传输配置寄存器 1110 0000*/
  62   1          /*普通模式,发送时附加CRC*/
  63   1              TCR = 0xe0; 
  64   1          /*DCR数据配置寄存器 1100 1000*/
  65   1          /* 8位数据dma,字节长度的DMA传输*/
  66   1              DCR = 0xc8;
  67   1          /*IMR关所有中断*/
  68   1              IMR = 0x00;
  69   1          page(1);
  70   1          /*CURR 指向接收缓存的首页*/
  71   1              CURR = ETH_RX_PAGE_START;
  72   1          /*组播地址寄存器*/
  73   1          MAR0 = 0x00;
  74   1          MAR1 = 0x41;
  75   1          MAR2 = 0x00;
  76   1          MAR3 = 0x00;
  77   1          MAR4 = 0x00;
  78   1          MAR5 = 0x00;
  79   1          MAR6 = 0x00;
  80   1          MAR7 = 0x00;
  81   1          /****Write MAC address 以下为写入MAC地址*****/
  82   1          PAR0 = UIP_ETHADDR0; 
  83   1          PAR1 = UIP_ETHADDR1;
  84   1          PAR2 = UIP_ETHADDR2;
  85   1          PAR3 = UIP_ETHADDR3;
  86   1          PAR4 = UIP_ETHADDR4; 
  87   1          PAR5 = UIP_ETHADDR5;
  88   1              page(0);
  89   1              CR = RD2|STA;
  90   1          /*ISR清所有中断*/
  91   1          ISR = 0xff;
  92   1      }
  93          
  94          /*网卡发包函数*/
  95          void etherdev_send(void)
  96          {
  97   1          u16_t i;
  98   1          u8_t *ptr;
  99   1          
 100   1          ptr = uip_buf;
 101   1              page(0);
 102   1          /*先结束远程DMA*/
 103   1          CR = RD2 | STA;
 104   1          /*等待上次发送完成*/
 105   1          while(CR & TXP) continue;
 106   1          /*清远程DMA中断标志*/
 107   1          ISR |= RDC;
 108   1          /*启动远程写,将数据写到RAM BUFFER中*/
 109   1          RSAR0 = 0x00;  
 110   1          RSAR1 = ETH_TX_PAGE_START;
 111   1          RBCR0 = (u8_t)(uip_len & 0xFF);  
 112   1          RBCR1 = (u8_t)(uip_len >> 8 );  
 113   1          CR = RD1 | STA;
 114   1          /*uIP将要发送的TCP头部数据放到uip_buf中,
 115   1            同时用uip_appdata指向应用层数据*/
 116   1          for(i = 0; i < uip_len; i++)
C51 COMPILER V7.06   ETHERDEV                                                              05/02/2009 15:51:21 PAGE 3   

 117   1          {
 118   2             if(i == 40 + UIP_LLH_LEN) 
 119   2              {
 120   3                  ptr = (u8_t *)uip_appdata;
 121   3              }
 122   2              RDMA_REG = *ptr++;
 123   2          }
 124   1      
 125   1          /*等待远程DMA操作完成*/
 126   1          while(!(ISR & RDC)) continue;
 127   1          CR = RD2 | STA;  
 128   1          /*配置网卡发送数据包*/
 129   1          TPSR = ETH_TX_PAGE_START;  
 130   1          if(uip_len < ETH_MIN_PACKET_LEN)
 131   1          {
 132   2              uip_len = ETH_MIN_PACKET_LEN;
 133   2          }
 134   1          TBCR0 = (u8_t)(uip_len & 0xFF);   
 135   1          TBCR1 = (u8_t)(uip_len >> 8);   
 136   1          CR = RD2|RD1|RD0|TXP|STA; 
 137   1      }
 138          
 139          /*网卡收包函数*/
 140          u16_t etherdev_read(void)
 141          {
 142   1          u16_t len = 0;
 143   1              u8_t status;
 144   1          u8_t retransmit = 0;
 145   1          /*检查接收是否正确*/
 146   1          if(ISR & PRX)
 147   1          {
 148   2              /*检查接收缓存是否满了*/
 149   2              if(ISR & OVW)  
 150   2              {
 151   3                  CR = RD2|STP;
 152   3                  RBCR0 = 0x00;
 153   3                  RBCR1 = 0x00;
 154   3                  while(!(ISR  & RST)) continue;
 155   3                  if(CR & TXP)
 156   3                  {
 157   4                      /*发送失败*/
 158   4                      if(!((ISR & PTX)|| (ISR & TXE)))
 159   4                      {
 160   5                          retransmit = 1;
 161   5                      }
 162   4                  }
 163   3      
 164   3                 TCR = LB0;
 165   3                 CR = RD2|STA;
 166   3                 BNRY = ETH_RX_PAGE_START;
 167   3                 page(1);
 168   3                 CURR = ETH_RX_PAGE_START;
 169   3                 page(0);
 170   3                  /*清中断标志*/
 171   3                 ISR = PRX | OVW;
 172   3                 TCR = 0x00;
 173   3              
 174   3                 if(retransmit)
 175   3                 {  
 176   4                    CR = RD2|TXP|STA;   
 177   4                 }
 178   3              }
C51 COMPILER V7.06   ETHERDEV                                                              05/02/2009 15:51:21 PAGE 4   

 179   2              else 
 180   2              {
 181   3                  u16_t i;
 182   3                  u8_t next_rx_packet;
 183   3                  u8_t current;
 184   3                  ISR = RDC;
 185   3                  /*先读RTL8019添加的4个字节*/
 186   3                  RSAR0 = 0x00;
 187   3                  RSAR1 = BNRY;
 188   3                  RBCR0 = 0x04;
 189   3                  RBCR1 = 0x00;
 190   3      
 191   3                  /*获取本帧数据的长度和下一帧页地址*/
 192   3                  CR = RD0 | STA;
 193   3                  status = RDMA_REG;
 194   3                  next_rx_packet = RDMA_REG;
 195   3                  len = (RDMA_REG); //RDMA);
 196   3                  len += (RDMA_REG<<8);//<< 8;
 197   3                  len -= 4;
 198   3                 /*等待远程DMA操作完成*/
 199   3                 while(!(ISR & RDC)) continue; 
 200   3      
 201   3                  CR = RD2 | STA;
 202   3                  if(len <= UIP_BUFSIZE)
 203   3                  {
 204   4                      ISR = RDC;
 205   4                      RSAR0 = 0x04;
 206   4                      RSAR1 = BNRY;
 207   4                      RBCR0 = (u8_t)(len & 0xFF);
 208   4                      RBCR1 = (u8_t)(len >> 8);                
 209   4                      CR = RD0 | STA;
 210   4                      /*启动远程读数据*/
 211   4                      for(i = 0; i < len; i++)
 212   4                      {
 213   5                          *(uip_buf + i) = RDMA_REG;
 214   5                      }
 215   4      
 216   4                     while(!(ISR & RDC)) continue;
 217   4                     CR = RD2 | STA;
 218   4                  }
 219   3                  else
 220   3                  {
 221   4                      len = 0;
 222   4                  }
 223   3                  /*更新BNRY*/
 224   3                  BNRY = next_rx_packet;
 225   3                  page(1);
 226   3                  current = CURR;
 227   3                  page(0);
 228   3                  /*RAM BUFFER中没有数据时清PRX*/
 229   3                  if(next_rx_packet == current)
 230   3                  {
 231   4                      ISR = PRX;
 232   4                  }
 233   3              }
 234   2          }
 235   1          return len;
 236   1      }
 237          


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V7.06   ETHERDEV                                                              05/02/2009 15:51:21 PAGE 5   

   CODE SIZE        =    732    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----       8
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -