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

📄 global.lst

📁 51单片机上实现tcp/ip的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 214   1        uint ii;
 215   1      
 216   1        page(0);
 217   1        bnry=Reg03;        //bnry page have read 读页指针
 218   1        page(1);
 219   1        curr=Reg07;        //curr writepoint 8019写页指针
 220   1        page(0);
 221   1        if((curr==0)) return(0);    //读的过程出错
 222   1        bnry=bnry++;
 223   1        if(bnry>0x7f) bnry=0x4c;
 224   1        if(bnry!=curr)    //此时表示有新的数据包在缓冲区里
 225   1        {                 //在任何操作都最好返回page0
 226   2           page(0);
 227   2           //=======================================
 228   2           Reg09=bnry;    //读页地址的高字节
 229   2           Reg08=0x00;    //读页地址的低字节
 230   2           Reg0b=0x00;    //读取字节计数高字节
 231   2           Reg0a=18;      //读取字节计数高字节
 232   2           Reg00=0x0a;    //启动Remote DMA读操作
 233   2           
 234   2           for(i=0;i<18;i++)//读取一包的前18个字节:4字节的8019头部,6字节目的地址,6字节原地址,2字节协议
 235   2           {
 236   3               RxdNetBuff.bytes.bytebuf[i]=Reg10;
 237   3           }
 238   2       //=======================================中止DMA操作
 239   2           Reg0b=0x00;    //
 240   2           Reg0a=0x00;    //
 241   2           Reg00=0x22;    //结束或放弃DMA操作
C51 COMPILER V7.06   GLOBAL                                                                05/27/2008 11:02:05 PAGE 5   

 242   2       //=======================================
 243   2           i=RxdNetBuff.bytes.bytebuf[3];
 244   2           RxdNetBuff.bytes.bytebuf[3]=RxdNetBuff.bytes.bytebuf[2];
 245   2           RxdNetBuff.bytes.bytebuf[2]=i; //将长度字段的高低字节掉转
 246   2           RxdNetBuff.EtherFrame.length=RxdNetBuff.EtherFrame.length-4;//去掉4个字节的CRC
 247   2      
 248   2      //=====================以上各步操作表示读入的数据包有效
 249   2      
 250   2           if(((RxdNetBuff.bytes.bytebuf[0]&0x01)==0)||(RxdNetBuff.bytes.bytebuf[1]>0x7f)
 251   2             ||(RxdNetBuff.bytes.bytebuf[1]<0x4c)||(RxdNetBuff.bytes.bytebuf[2]>0x06))
 252   2           {//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度>1500字节
 253   3               page(1);
 254   3               curr=Reg07;     //page1
 255   3               page(0);        //切换回page0
 256   3               bnry = curr -1;
 257   3               if(bnry < 0x4c) 
 258   3                   bnry =0x7f;
 259   3               Reg03=bnry;     //write to bnry
 260   3             
 261   3               Reg07=0xff;
 262   3               return(0);
 263   3           }//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度>1500字节
 264   2      //=============================================
 265   2                  
 266   2           else//表示数据包是完好的.读取剩下的数据
 267   2           {
 268   3               if((RxdNetBuff.EtherFrame.NextProtocal==0x0800)||(RxdNetBuff.EtherFrame.NextProtocal==0x0806))
 269   3               { //协议为IP或ARP才接收
 270   4                   Reg09=bnry;                   //read page address high
 271   4                   Reg08=4;                      //read page address low
 272   4                   Reg0b=RxdNetBuff.EtherFrame.length>>8;  //read count high
 273   4                   Reg0a=RxdNetBuff.EtherFrame.length&0xff;//read count low;
 274   4                   Reg00=0x0a;                             //read dma
 275   4                   for(ii=4;ii<RxdNetBuff.EtherFrame.length+4;ii++)
 276   4                      {RxdNetBuff.bytes.bytebuf[ii]=Reg10;}
 277   4                   //================终止DMA操作
 278   4                   Reg0b=0x00;            //read count high   
 279   4                   Reg0a=0x00;            //read count low;
 280   4                   Reg00=0x22;            //结束或放弃DMA
 281   4                   //============================
 282   4               }
 283   3               //=========================================
 284   3               bnry=RxdNetBuff.bytes.bytebuf[1]-1;
 285   3               if(bnry<0x4c)
 286   3                   {bnry=0x7f;}
 287   3               Reg03=bnry;      //write to bnry
 288   3               Reg07=0xff;
 289   3               if((TCP1024.State==TCP_STATE_ESTABLISHED)&&(RxdNetBuff.IpFrame.NextProtocal==6))
 290   3                   if(RxdNetBuff.IpFrame.SourceIp[0]!=TxdNetBuff.IpFrame.DestId[0])
 291   3                       if(RxdNetBuff.IpFrame.SourceIp[1]!=TxdNetBuff.IpFrame.DestId[1])//目标IP地址是否本机
 292   3                           return(0);
 293   3               return(1);   //have new packet
 294   3           }//表示数据包是完好的.读取剩下的数据
 295   2        }//if(bnry!=curr)//此时表示有新的数据包在缓冲区里
 296   1        return(0);
 297   1      }
 298          
 299          /**********************************************************************
 300          **函数原型:   void     InitNic()
 301          **入口参数:   无
 302          **出口参数:   无
 303          **返 回 值:   无              
C51 COMPILER V7.06   GLOBAL                                                                05/27/2008 11:02:05 PAGE 6   

 304          **说    明:   对芯片的工作寄存器进行设置,各个寄存器的用法可参考文档和
 305          **            络芯片的数据手册
 306          ************************************************************************/
 307          void InitNic()
 308          {
 309   1        Delay_MS(10);
 310   1      /**********************************************************************
 311   1      
 312   1      1.Reg00命令寄存器: CR,命令寄存器,地址偏移量00H,为一个字节
 313   1        位:  7   6   5   4   3   2   1   0 
 314   1      名字: PS1 PS0 RD2 RD1 RD0 TXP STA STP 
 315   1      //============================================
 316   1      2.
 317   1      RD2,RD1,RD0: 这3个位代表要执行的功能。
 318   1       0   0   1 : 读网卡内存
 319   1       0   1   0 : 写网卡内存
 320   1       0   1   1 : 发送网卡数据包
 321   1       1   *   * : 完成或结束DMA的读写操作
 322   1      //============================================
 323   1      3.TXP位置1时发送数据包,发完自动清零
 324   1      //============================================
 325   1      4.
 326   1      STA,STP:    这两个位用来启动命令或停止命令
 327   1       1   0         启动命令
 328   1       0   1         停止命令
 329   1      //============================================
 330   1      ********************************************************/
 331   1        Reg00=0x21;   //使芯片处于停止模式,这时进行寄存器设置
 332   1      
 333   1        Delay_MS(10); //延时10毫秒,确保芯片进入停止模式
 334   1        page(0);
 335   1        Reg0a=0x00;   //清rbcr0
 336   1        Reg0b=0x00;   //清rbcr1
 337   1        Reg0c= 0xe0;  //RCR,监视模式,不接收数据包
 338   1        Reg0d= 0xe2;  //TCR,loop back模式
 339   1      
 340   1        Reg01=0x4c;
 341   1        Reg02=0x80;
 342   1        Reg03=0x4c;
 343   1        Reg04=0x40;  //TPSR,发送起始页寄存器
 344   1        Reg07=0xff;  //清除所有中断标志位,中断状态寄存器
 345   1        Reg0f=0x00;  //中断屏蔽寄存器清0,禁止中断
 346   1      
 347   1        Reg0e=0xc8;  // 数据配置寄存器,8位dma方式
 348   1        page(1);
 349   1        Reg07=0x4d;
 350   1        Reg08=0x00;
 351   1        Reg09=0x00;
 352   1        Reg0a=0x00;
 353   1        Reg0b=0x00;
 354   1        Reg0c=0x00;
 355   1        Reg0d=0x00;
 356   1        Reg0e=0x00;
 357   1        Reg0f=0x00;
 358   1        Reg00=0x22;  //这时让芯片开始工作
 359   1      
 360   1        SetMacID();  //将芯片物理地址写入到MAR寄存器
 361   1      
 362   1        page(0);
 363   1        Reg0c=0xcc;  //将芯片设置成正常模式,跟外部网络连接
 364   1        Reg0d=0xe0;
 365   1        Reg00=0x22;  //启动芯片开始工作
C51 COMPILER V7.06   GLOBAL                                                                05/27/2008 11:02:05 PAGE 7   

 366   1        Reg07=0xff;  //清除所有中断标志位
 367   1      
 368   1      }
 369          
 370          /**********************************************************************
 371          **函数原型:   void  Timer0_Init( )
 372          **入口参数:   无
 373          **出口参数:   无
 374          **返 回 值:  无              
 375          **说    明:  初始化定时器0
 376          ************************************************************************/
 377          void Timer0_Init()
 378          {
 379   1        tmod=tmod&0xf0;
 380   1        tmod=tmod|0x01;
 381   1        th0 = 0;
 382   1        tl0 = 0;
 383   1        tr0 = 1;
 384   1      }
 385          
 386          /**********************************************************************
 387          **函数原型:   void     Serial_Init( )
 388          **入口参数:   无
 389          **出口参数:   无
 390          **返 回 值:  无              
 391          **说    明:  初始化串口
 392          ************************************************************************/
 393          void Serial_Init()
 394          {
 395   1      //====设置波特率===================
 396   1        tmod = tmod & 0x0f;
 397   1        tmod = tmod | 0x20;
 398   1        th1  = 0xfa;
 399   1        tr1  = 1;
 400   1        pcon = pcon | 0x80;     
 401   1      //=======================
 402   1      //工作方式为8位数据
 403   1        sm0 = 0; 
 404   1        sm1 = 1; 
 405   1        sm2 = 0;
 406   1        tr1 = 1;          
 407   1      //==========================
 408   1        ren = 1;               //允许接收
 409   1        ti  = 1;
 410   1      }
 411          
 412          /**********************************************************************
 413          **函数原型:   void     Interrupt_Init(void)
 414          **入口参数:   无
 415          **出口参数:   无
 416          **返 回 值:   无              
 417          **说    明:   初始化中断
 418          ************************************************************************/
 419          void Interrupt_Init(void)
 420          {
 421   1        //定时器0允许中断
 422   1        et0 = 1; 
 423   1        ea  = 1; 
 424   1      //======================    
 425   1        et1 = 0;    //禁止定时器1中断
 426   1      //======================
 427   1        ps0 = 1;        //设置串行口高优先级
C51 COMPILER V7.06   GLOBAL                                                                05/27/2008 11:02:05 PAGE 8   

 428   1      //==============================
 429   1        es0 = 1;
 430   1        ea  = 1;    //允许串口中断
 431   1      }
 432          
 433          /**********************************************************************

⌨️ 快捷键说明

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