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

📄 net.lst

📁 8051单片机与RTL8019AS的UDP协议栈
💻 LST
📖 第 1 页 / 共 3 页
字号:
 238   2                      OVER_Process();                             //OVER报处理函数
 239   2                      return 1;
C51 COMPILER V7.06   NET                                                                   02/28/2008 17:09:34 PAGE 5   

 240   2              }
 241   1              else
 242   1                      return 0;
 243   1      }
 244          //*********************************************************************
 245          bit WRQ_Process(void)
 246          {
 247   1          s=0;                                            //秒计数器清零
 248   1              H_Package=Receive_Buff[48];
 249   1              H_Package<<=8;
 250   1              H_Package+=Receive_Buff[49];                     //取出总数据块数
 251   1              ACK_Send(0);
 252   1              return 1;
 253   1      }
 254          //*********************************************************************
 255          bit DATA_Process(void)
 256          {
 257   1              unsigned char i;
 258   1              ms=0;                                           //毫秒计数器清零
 259   1              Package=Receive_Buff[48];
 260   1              Package<<=8;
 261   1              Package+=Receive_Buff[49];                       //取出当前块数
 262   1              if(Package!=Count_Pag)
 263   1                      return 0;
 264   1              else
 265   1              {
 266   2                      Count_Pag++;                                //计数器加一  
 267   2                      for(i=0;i<512;i++)
 268   2                              DATA_Buff[i]=Receive_Buff[i+50];        //取出有效数据
 269   2                      ACK_Send(Package);
 270   2                      return 1;
 271   2              }
 272   1      }
 273          //*********************************************************************
 274          bit OVER_Process(void)
 275          {
 276   1              ms=0;                                           //毫秒计数器清零                     
 277   1              H_Package=Receive_Buff[48];
 278   1              H_Package<<=8;
 279   1              H_Package+=Receive_Buff[49];                     //取出总数据块数
 280   1              return 1;
 281   1      }
 282          //*********************************************************************
 283          void Config_Timmer(void)
 284          {
 285   1              TMOD=0x01;                                      //定时器零工作与16位方式
 286   1              TL0=0x66;
 287   1              TH0=0xFC;
 288   1              ET0=1;                                          //定时器零中断使能
 289   1              EA=1;                                           //开总中断
 290   1              TR0=1;
 291   1      }
 292          //*********************************************************************
 293          void timmer0() interrupt 1 using 1
 294          {
 295   1              TR0=0;
 296   1              TL0=0x66;
 297   1              TH0=0xFC;
 298   1          if(ms>=999)
 299   1              {
 300   2                      ms=0;
 301   2                      if(s>=59)
C51 COMPILER V7.06   NET                                                                   02/28/2008 17:09:34 PAGE 6   

 302   2                      {
 303   3                              s=0;
 304   3                              if(min>=59)
 305   3                                      min=0;
 306   3                              else
 307   3                                      min++;
 308   3                      }
 309   2                      else
 310   2                              s++;
 311   2              }
 312   1              else
 313   1                      ms++;
 314   1          TR0=1;
 315   1      }
 316          //************************************************************************
 317          void PORT_Init (void)
 318          {
 319   1      //   XBR0    = 0x07;                     // Enable SMBus, SPI0, and UART0
 320   1       //  XBR1    = 0x00;
 321   1        // XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
 322   1       //  EMI0TC  = 0x21;
 323   1       //  P74OUT  = 0xFF;
 324   1         //P0MDOUT = 0x15;
 325   1         //P3MDOUT=0xff;
 326   1         //P1MDOUT=0xff;
 327   1         //P2MDOUT=0xff;
 328   1      }
 329          //************************************************************************
 330          void RTL8019_init(void)
 331          {
 332   1              unsigned char i;
 333   1              unsigned char j;
 334   1          for(i=0;i<255;i++)
 335   1                  for(j=0;j<255;j++);
 336   1          Reset_8019();          //复位8019
 337   1              //chip_select();         //片选
 338   1          page_select(0);
 339   1              reg00=0x21;            //020与8019通信禁止,发送禁止,即进入停止状态
 340   1          for(i=0;i<255;i++)
 341   1                  for(j=0;j<255;j++);
 342   1              reg0a=0x00;
 343   1              reg0b=0x00;            //020与8019通信字节计数器清零
 344   1              reg0c=0xe0;            //接受禁止
 345   1              reg0d=0xe2;            //发送禁止,使用CRC
 346   1              reg01=0x4c;            //配置接受缓存起始页地址
 347   1              reg02=0x80;            //配置接收缓存结束页地址
 348   1              reg03=0x4c;            //接收缓存边界页地址
 349   1              reg04=0x40;            //发送缓存起始页地址
 350   1              reg07=0xff;            //清中断标志
 351   1              reg0f=0x00;            //终止所有中断
 352   1          reg0e=0xc8;            //8位DMA
 353   1              page_select(1);        //选择第一页
 354   1              reg07=0x4d;            //接收缓冲区首页地址
 355   1              reg08=0x00;
 356   1              reg09=0x00;
 357   1              reg10=0x00;
 358   1              reg0a=0x00;
 359   1              reg0b=0x00;
 360   1              reg0c=0x00;
 361   1              reg0d=0x00;
 362   1              reg0e=0x00;
 363   1              reg0f=0x00;            //地址过滤位
C51 COMPILER V7.06   NET                                                                   02/28/2008 17:09:34 PAGE 7   

 364   1              reg00=0x22;            //RTL8019工作使能
 365   1      //      read_mac_add();        //读取物理地址 
 366   1              write_mac_add();       //写物理地址至ram
 367   1              page_select(0);        //选择第零页
 368   1              reg0c=0xcc;            //接收使能
 369   1              reg0d=0xe0;    
 370   1              reg00=0x22;            //RTL8019工作使能
 371   1              reg07=0xff;            //清中断位
 372   1              //read_reg(reg0f,reg00,0x00,16);
 373   1      }
 374          //***********************************************************
 375          void Reset_8019(void)
 376          {
 377   1              unsigned char i;
 378   1              unsigned char j;
 379   1      
 380   1              unsigned char tmp;
 381   1      
 382   1              Reset_High; 
 383   1          for(i=0;i<255;i++)
 384   1                  for(j=0;j<255;j++);
 385   1              Reset_Low;
 386   1              for(i=0;i<255;i++)
 387   1                  for(j=0;j<255;j++);
 388   1      
 389   1      
 390   1              tmp = reg1f;
 391   1              reg1f = tmp;
 392   1      
 393   1          for(i=0;i<255;i++)
 394   1                  for(j=0;j<255;j++);
 395   1      }
 396          //***********************************************************
 397          /*void read_mac_add(void)
 398          {
 399                  unsigned char i;
 400                  page_select(0);
 401                  reg09=0x00;             //读取物理地址的ram地址为0x0000
 402                  reg08=0x00;
 403                  reg0b=0x00;
 404                  reg0a=0x12;
 405                  reg00=0x0a;             //020读RTL8019
 406                  for(i=0;i<6;i++)
 407                  {
 408                          mac_add[i]=reg10;  
 409                  }
 410          }*/
 411          //***********************************************************
 412          void page_select(unsigned char pagenumber)
 413          {
 414   1              unsigned char data temp;
 415   1              temp=reg00;             
 416   1              temp=temp&0x3B ;
 417   1              pagenumber=pagenumber <<6;
 418   1              temp=temp | pagenumber;
 419   1              reg00=temp;
 420   1      }
 421          //***********************************************************
 422          
 423          //***********************************************************
 424          void SYSCLK_Init (void)
 425          {
C51 COMPILER V7.06   NET                                                                   02/28/2008 17:09:34 PAGE 8   

 426   1         int i;                              // delay counter
 427   1      //    OSCXCN = 0x67;                      // start external oscillator with
 428   1                                             // 18.432MHz crystal
 429   1          for (i=0; i < 256; i++) ;           // Wait for osc. to start up
 430   1      //    while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
 431   1      //    OSCICN = 0x88;                      // select external oscillator as SYSCLK
 432   1                                             // source and enable missing clock
 433   1      }
 434          //***********************************************************
 435          void write_mac_add(void)
 436          {
 437   1              page_select(1);
 438   1              reg01=hard_add[0];
 439   1              reg02=hard_add[1];
 440   1              reg03=hard_add[2];
 441   1              reg04=hard_add[3];
 442   1              reg05=hard_add[4];
 443   1              reg06=hard_add[5];
 444   1              page_select(0);
 445   1      }
 446          //***********************************************************
 447          void RTL8019_send(void)
 448          {
 449   1          unsigned int length=64;
 450   1              unsigned char i;
 451   1              reg09=0x40;                       //设置发送起始页高地址
 452   1              reg08=0x00;                       //发送起始页地地址
 453   1              reg0b=length>>8;                  //字节计数器高字节
 454   1              reg0a=length&0xff;                //字节计数器低字节
 455   1              reg00=0x12;                       //020写RTL8019
 456   1              for(i=0;i<length;i++)
 457   1              {
 458   2                      reg10=Send_Buff[i];          
 459   2              }
 460   1              reg0b=0x00;
 461   1              reg0a=0x00;
 462   1              reg00=0x22;                       //断开020与RTL8019的连接
 463   1              for(i=0;i<6;i++)                  //开始发送数据,最多重发六次
 464   1              {
 465   2                      for(i=0;i<1000;i++)
 466   2                      {
 467   3                         if((reg00&0x04)==0)        //查询TXP位确认发送状态
 468   3                         break;
 469   3                      }
 470   2                      if((reg04&0x01)!=0)           //查询PTX位确认发送是否完成切无错误
 471   2                         break;
 472   2                      reg00=0x3e;                   //发送数据包
 473   2              } 
 474   1              reg07=0xff;                       //清中断
 475   1              reg04=0x40;                       //发送缓冲起始页
 476   1              reg06=length>>8;                  //发送字节高位
 477   1              reg05=length&0xff;                //发送字节低位
 478   1              reg07=0xff;                       //清中断
 479   1              reg00=0x3e;
 480   1      }
 481          //***********************************************************************
 482          //***********************************************************************
 483          bit RTL8019_receive(void)

⌨️ 快捷键说明

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