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

📄 ethernet.lst

📁 51 单片机上网
💻 LST
📖 第 1 页 / 共 2 页
字号:
 141   1          EN1_MAR6 = 0xff;
 142   1          EN1_MAR7 = 0xff;
 143   1          
 144   1          EN1_CURR = RX_START_PG + 1; /* RX_CURR_PG; Current memory page = RX_CURR_PG  ? */
 145   1        
 146   1          EN_CMD = EN_PAGE0 + EN_NODMA ;  /* 00001010B: PS1 PS0 RD2 RD1 RD0 TXP STA STP */
 147   1          
 148   1          EN0_RXCR = ENRXCR_RXCONFIG;      /* rx on(broadcasts, no multicast,errors   04*/
 149   1          EN0_TXCR = ENTXCR_TXCONFIG;      /* xmit on. */
 150   1          
 151   1          EN0_ISR = 0xff;      /* Individual bits are cleared by writing a "1" into it. */
 152   1                                               /* It must be cleared after power up. */
 153   1                                               
 154   1          EN0_IMR = ENISR_ALL; /* INTerrupt mask reg */
 155   1          
 156   1              EN_CMD = EN_PAGE0 + EN_NODMA + EN_START;
 157   1      }
 158          
 159          //*******************************************
 160          //  get a packet form a given address in NIC's RAM
 161          //  DMA READ
 162          //
 163          //*******************************************
 164          void getnic(WORD addr, BYTE buf[],WORD len)
 165          {
 166   1              EN0_ISR=ENISR_RDC;                      //clear remote dma interrupt flag
 167   1              EN0_RCNTLO = (BYTE)(len&0xff);                  // read length low
 168   1              EN0_RCNTHI = (BYTE)(len>>8);                    // read length high
 169   1              EN0_RSARLO=(BYTE)(addr &0xff);                  // read address low
 170   1              EN0_RSARHI=(BYTE)(addr>>8);                             // read address high
 171   1              EN_CMD=EN_RREAD+EN_START+EN_PAGE0;              // do dma read
 172   1              while (len--)
 173   1                      *buf++=EN_DATA;
 174   1      }
 175                  
 176          //*******************************************
 177          //  put a packet into a given address in NIC's RAM
 178          //  DMA Write
C51 COMPILER V7.07   ETHERNET                                                              06/30/2006 16:21:46 PAGE 4   

 179          //
 180          //*******************************************
 181          void putnic(WORD addr, BYTE buf[],WORD len)
 182          {
 183   1              len+=len&0x01;
 184   1              EN0_ISR=ENISR_RDC;                      //clear remote dma interrupt flag
 185   1              EN0_RCNTLO = (BYTE)(len&0xff);
 186   1              EN0_RCNTHI = (BYTE)(len>>8);
 187   1              EN0_RSARLO=(BYTE)(addr &0xff);
 188   1              EN0_RSARHI=(BYTE)(addr>>8);
 189   1              EN_CMD=EN_RWRITE+EN_START+EN_PAGE0;
 190   1              while (len--)
 191   1                      EN_DATA=*buf++;
 192   1              len=10000;
 193   1              while (len && ((EN0_ISR & ENISR_RDC)==0))       
 194   1                              len--;
 195   1      }
 196          
 197          //***************************************
 198          //    wrap an rx page number
 199          //***************************************       
 200          BYTE nicwrap(BYTE page)
 201          {
 202   1              if (page>=RX_STOP_PG)
 203   1                      page+=RX_START_PG-RX_STOP_PG;
 204   1              else   if(page<RX_START_PG)
 205   1                                      page+=RX_STOP_PG-RX_START_PG;
 206   1              return (page);
 207   1      }       
 208          
 209          //*********************************************************************
 210          //         延时子程序        1ms
 211          //*********************************************************************
 212          void delay_ms(int number)
 213          {                                                                       //craystal  22.1184Mhz
 214   1              unsigned char i; 
 215   1              unsigned int j;
 216   1              for (j=0;j<number;j++)
 217   1              {
 218   2      //                      for (i=0;i<229;i++);   //11.0592Mhz   (1ms)       
 219   2      //                      for (i=0;i<229;i++);   //22.1184Mhz   (1ms) 
 220   2                              for (i=0;i<255;i++);   //24Mhz   (1ms) 
 221   2              }
 222   1      }       
 223          
 224          //*********************************************************************
 225          //         延时子程序       100ms
 226          //*********************************************************************
 227                                  
 228          //void delay_100ms(int number)
 229          //{
 230          //      unsigned int j;
 231          //      for (j=0;j<number;j++)
 232          //              delay_ms(100);
 233          //}
 234                  
 235          /* Make a frame, given data length. Return length of complete frame
 236          ** If Ethernet, set dest addr & protocol type; if SLIP, ignore these */
 237          int make_frame(ETHERFRAME *efp, BYTE srce[],BYTE dest[], WORD pcol, WORD dlen)
 238          {
 239   1       
 240   1              efp->e.ptype = pcol;
C51 COMPILER V7.07   ETHERNET                                                              06/30/2006 16:21:46 PAGE 5   

 241   1              memcpy(efp->e.dest, dest, MACLEN);
 242   1                  memcpy(efp->e.srce, srce, MACLEN);
 243   1              dlen += sizeof(ETHERHDR);
 244   1              return(dlen);
 245   1      }
 246          
 247          
 248          /* Do TCP-style checksum. Improved algorithm is from RFC 1071 */
 249          WORD csum(void *dp, WORD count)
 250          {
 251   1          register LWORD total=0L;
 252   1          register WORD n, *p, carries;
 253   1      
 254   1          n = count / 2;
 255   1          p = (WORD *)dp;
 256   1          while (n--)
 257   1              total += *p++;
 258   1          if (count & 1)
 259   1              total += (*(BYTE *)p)<<8;
 260   1          while ((carries=(WORD)(total>>16))!=0)
 261   1              total = (total & 0xffffL) + carries;
 262   1          return((WORD)total);
 263   1      }
 264          
 265          unsigned char check_rtl8019as(void)
 266          {
 267   1          EN_CMD = EN_PAGE0 + EN_NODMA + EN_STOP; /* 00001010B: PS1 PS0 RD2 RD1 RD0 TXP STA STP */
 268   1          
 269   1              if(EN0_8019ID0 != 0x50)
 270   1                      return 1;
 271   1              if(EN0_8019ID1 != 0x70)
 272   1                      return 2;
 273   1               return 0;
 274   1      }
 275          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1247    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     10      48
   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 + -