找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3348|回复: 2
收起左侧

ARM之ENC28J60的移植

[复制链接]
ID:82781 发表于 2015-6-13 16:51 | 显示全部楼层 |阅读模式
之前在51上搞好了UDP协议栈,现在挪到ARM上用,本想着会一帆风顺,结果却是荆棘密布,花了一天工夫终于搞完了核心程序的移植,问题不是出在高层而是出在底层,硬件的接口,ARM速度高,接口我把分频改成最大,最大降低速度,但是还是很不稳定,很容易死!后来发现进行短暂的延时有效,而且很稳定,我想可能是速度太快了,硬件没有时间反应的缘故吧总之,是搞定了,哈哈,在51上的网卡接口只能是控制个小玩意,移到ARM上是我好久的梦想,也是用它传输摄像头的图片的开始,加油吧!拍照然后回传电脑才是我的最终目的!


经过几天的调试终于可以实现TCP的连接了,其实跟UDP很相似只是他有个应答机制,就是所谓的三次握手,这三次握手都是在我程序的控制下进行的,对我来说已经很透明,这就是自己写协议栈的好处吧!可已学到不少东西,就是很麻烦,TCP的实现远没有那么简单,还有很多东西要写,比如重发机制和四个定时器,还有避免报文的分片,以及现在都搞不懂的操作字,这个操作字在协议手册中没有提到,但是在实际中却是关键,所以要学的东西真是太多了而这仅仅是个开始,随着程序的增大我越来越感觉到我的结构化有问题,虽然一经采用了多文件处理,但是还是显得有点无序,哎,总之,这是自己的成果,还是很高兴的!!
  1. #include "ARP.h"
  2. #include "IP.H"
  3. #include "UDP.H"
  4. #include "TCP.H"
  5. /*对内部FIFO的操作*/
  6. #include "ENC28J60_Buff_Operation.h"
  7. #include "ENC28J60_Receive.h"
  8. #include "ENC28J60_SPI.h"
  9. #include "UART.H"
  10. #include "ENC28J60_Send_Receive.h"
  11. static xdata uchar flage=0;//释放FIFO的上部分还是下半部分FLAGE=0,释放下半部分FLAGE=1释放上半部分
  12. static xdata uchar ARP_REQUEST=0;//ARP请求获取网关标志位,0表示可以进行ARP请求,1表示已经获得MAC地址可以关闭ARP
  13. static xdata uint Receive_Next_Add_Pointer;//下个数据包的开始地址指针
  14. static xdata uint Receive_Now_Add_Pointer;//当前地址指针
  15. static xdata uint Receive_MAC_Type;//数据包的类型
  16. static xdata uint Receive_Size_Packet;//数据包的大小
  17. static xdata uint Receive_Add_Pointer_MSB=0;
  18. static xdata uint Receive_Add_Pointer_LSB=0;
  19. static xdata uint Receive_MAC_Type_MSB;    /*接收数据包的临时地址指针缓冲区*/
  20. static xdata uint Receive_MAC_Type_LSB;

  21. static xdata uint Receive_ARP_Type_MSB;
  22. static xdata uint Receive_ARP_Type_LSB;
  23. static xdata uint Receive_ARP_Type;
  24. static xdata uchar Receive_Data[20];//接收到的UDP数据

  25.       /*UDP相关设置*/
  26. ////////////////////////very important config//////////////////////////////////////////////////////////////////////
  27. //////////////////////////////////////////////////////////////////////////////////////////////
  28. ///////////////////////very important config///////////////////////////////////////////////////////////////////////
  29. //////////////////////////////////////////////////////////////////////////////////////////////
  30. ////////////////////////very important config//////////////////////////////////////////////////////////////////////
  31. static xdata uchar MAC_Target_add[6];//网关目标MAC这个由ARP自动获取
  32. static xdata uchar IP_Target_add[4]={192,168,1,89};//外网或者内网的IP地址
  33. static xdata uchar UDP_Source_Port[2]={0x0b,0xd1}; //udp本机IP  3025
  34. static xdata uchar UDP_Target_Port[2]={0x1f,0x41}; //对方端口 8001
  35. static xdata uchar UDP_Send_Data[]={0x56,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa};//发送的数据

  36.                   /*    xdata    uchar TCP_Source_Port[4];
  37.       xdata   uchar TCP_Target_Port[4];
  38.          xdata   uchar TCP_Send_Data[10];
  39.       xdata   uchar TCP_Send_Data_length;
  40.         */
  41.    xdata uint   UDP_Source_Port_C=8001;//对方端口
  42.    xdata uint   UDP_Target_Port_C=3025;//本地端口

  43. xdata uchar Send_ARP_Frame_sender_IP[4]={192,168,1,114};//本机IP
  44. xdata uchar Send_ARP_Frame_Target_IP[4]={192,168,1,1};//网关IP
  45. xdata uint n=0;
  46. //////////////////////////////////////////////////////////////////////////////////////////////
  47. //////////////////////very important config////////////////////////////////////////////////////////////////////////
  48. //////////////////////////////////////////////////////////////////////////////////////////////
  49. //////////////////////////////////////////////////////////////////////////////////////////////
  50. //TCP端口
  51. static xdata uchar TCP_Source_Port[2]={0x04,0xee};//本机IP  1262
  52. static xdata uchar TCP_Target_Port[2]={0x1f,0x41};//对方端口 8001
  53. static xdata uchar TCP_Sequence_Number_Send[4]={0xcc,0x0a,0x68,0x75};//发送端序列号
  54. static xdata uchar TCP_Sequence_Number_Receive[4];//接收端回复的序列号
  55. static xdata uchar TCP_Send_Data[]={0x02,0x04,0x05,0xb4,0x01,0x01,0x04,0x02,0x01,0x01,0x04,0x02};//发送的数据
  56. xdata uint   TCP_Source_Port_C=8001;//对方端口
  57. xdata uint   TCP_Target_Port_C=1262;//本地端口
  58. //xdata uint IP_Receive_Send_check_Sum[10];//用于校验和计算的数组
  59. //xdata uint IP_CHECK_MUNB;//计算后的IP部首的校验和被写入这里面
  60. /*****************************


  61. 接收数据包

  62. 45页
  63. *******************************/
  64. void Receiving_data_packet()
  65. {     uchar xdata d2;
  66.                     /*用于ARP请求*/
  67.    
  68. Receive_Next_Add_Pointer=0;//缓冲区的数据包下一个地址指针. 初始化
  69. Receive_Now_Add_Pointer=0x300;//当前数据缓冲区地址指针.

  70.                            

  71. ///检测EPKTCNT是否为空

  72. while(1)  //死在里面么,这个是故意的
  73.    {

  74. write_ENC28J60_REG_SPI(ECON1,5);//开启接收
  75.       for(;;)
  76.    {
  77.      d2=read_ENC28J60_REG_SPI(EPKTCNT);//有无数据报?
  78. // SendOneByte(d2);
  79.        if(d2>0)break;
  80.     }
  81.         //
  82. //delay1s();
  83.          /*ARP请求,注意这个ARP请求是获取指定网关的IP,也就是192.168.1.1*/      
  84.          //
  85.           READ_N_Packet();//读数据包
  86.         if(ARP_REQUEST==0)  //是否获取MAC?没有?好进入获取MAC地址,这是个ARP请求
  87.          {
  88.          Send_ARP_Request_packet(Send_ARP_Frame_sender_IP,Send_ARP_Frame_Target_IP);
  89.          
  90.          }
  91.         if(ARP_REQUEST==1)
  92.          {
  93.      
  94.        /*TCP链接请求*/
  95.   Send_TCP_Establish_Connection(   &MAC_Target_add,
  96.               &IP_Target_add,
  97.                &TCP_Source_Port,
  98.                &TCP_Target_Port,
  99.             &TCP_Sequence_Number_Send,
  100.             &TCP_Sequence_Number_Receive,
  101.             2,
  102.             &TCP_Send_Data,
  103.             8
  104.        );
  105.           ARP_REQUEST=0x88;//只发一次连接请求然后等待回应
  106.           }
  107.       
  108.         
  109.       
  110.         
  111.       
  112.                        
  113.       





  114.       Check_The_remaining_space();//检查是否释放缓冲区
  115.          write_ENC28J60_REG_SPI(ECON2,0x40);//PACKET减一
  116.          

  117.    }
  118. }
  119.   /*******************************

  120.    检查剩余空间,如果不够就释放空间
  121.    是这样的流程:
  122.    首先解释ERXRDPTL和ERXRDPTH这个寄存器是干什么的呢?他就是说硬件通过ERXWRPTL和ERXWRPTH写入指定的缓存
  123.    那么他在那里停止呢?缓存器的底部?错,这个接收缓冲区就是一个FIFO,他是循环的存储结构,所以他在到底部
  124.    时不会停会跳到开始字节继续,那么这样一来他不就停不下了吗?显然芯片设计的人不允许他这样所以设置了这个
  125.    寄存器ERXRDPTL和ERXRDPTH,他就是停止一旦硬件写到他的地址以后的数据他不在接收,全部丢弃,所以要想全部
  126.    一个包不少的把以太网上的数据接收回来就要周期性的更新这个地址,也就是说他需要程序自己控制而不要干涉他
  127.    否则你将不会得到连续的数据包,我程序里这样设计的:首先在初始化设定接收缓存的开始地址和结束地址分别是
  128.    从0x300-0x1fff这7KB的区域全部是接收缓冲区(FIFO),初始化后ERXWRPTL和ERXWRPTH这个指针自动更新对准0X300
  129.    这个写指针是硬件控制的,用户控制不了,所以呢不用管,只要在乎这个ERXRDPTL和ERXRDPTH地址指针,这个指针我首先
  130.    付给他一个地址0x0e7e,也就是差不多在这个FIFO的一半的位置什么意思呢?表示如果我不更新这个指针的话那么硬件从0X300写到
  131.    0X0E7E就不在写了,所以我要一边读下一个包的地址一边计算他逼近的距离,当小与400个字节的时候就把这个指针向下移动到0X1FFF
  132.    也就是FIFO的底部,这时候硬件就可以继续向下,但是这时如果不更新这个指针,他就在0X1FFF的时候有就停止了,所以采取同样的办法
  133.    就是计算逼近距离小于400字节就更新指针到原来的位置0X0E7E,他又可以继续写了,就这样有数据包就收数据包永远追不上指针,就像小时候
  134.    玩的一个游戏一个棍两头各一个动物转动他们他们永远不相遇,就是这个道理,至于处理数据包这个就被抽象出来了,你想怎么处理就怎么处理
  135.    2011年11月23日
  136.   无锡第五项目部
  137.    王均伟

  138.   ******************************/

  139. /***********************

  140.    检查是否释放缓冲区函数
  141.   这个函数就是要不断的检查接收缓
  142.   存数据是不是达到临界指针,到了
  143.   就要马上让指针下移以免数据重叠。
  144. *************************/                  /**************************/
  145. void Check_The_remaining_space()           //读取当前终止指针的值
  146. {     uint xdata m,l,d,d2;           /**************************/

  147.   l=read_ENC28J60_REG_SPI(ERXRDPTL);
  148.   m=read_ENC28J60_REG_SPI(ERXRDPTH);
  149. d2=((l&0x00ff)+((m<<8)&0xff00));          /*****************************/
  150.     d=d2-Receive_Next_Add_Pointer; //              下一个数据包的地址和当前终止地址作比较
  151.                 //看看是否接近到离终止指针400个字节的地方?
  152.                 //还有这个Flage表示以0X0E7E为界的缓存的释放,
  153.                 //FLAGE=0表示释放下半部分FIFO(0x0e7e-0x1fff)
  154.                 //FLAGE=1表示释放上半部分FIFO(0X1FFF-0X0E7E)
  155.                  /***************************/
  156.   if((d<250)&(flage==0))//如果flage=0和
  157.   {
  158.    write_ENC28J60_REG_SPI(ERXRDPTL,0xff);
  159. write_ENC28J60_REG_SPI(ERXRDPTH,0x1f);
  160. flage=1;

  161.   }
  162.   else
  163.   if((d<250)&(flage==1))//如果flage=1和空间不足
  164.   {
  165.    write_ENC28J60_REG_SPI(ERXRDPTL,0x7e);
  166. write_ENC28J60_REG_SPI(ERXRDPTH,0x0e);
  167. flage=0;

  168.   }

  169. }

  170.    
  171. /************************************************
  172. 读取数据包和处理将在这里进行
  173. 主要是从BUFF里取出数据包并且处理,比如ARP、UDP、的数据提取和回应啥的
  174. ************************************************/

  175. void READ_N_Packet()
  176. {   
  177.     /***********************数据处理开始*********************************************/   
  178.         xdata uchar  i; //定义一个计数变量好用来接收数据
  179.    
  180.     xdata uint k; //计数
  181.           /*定义接收到的包相关信息
  182.           比如MAC、源地址IP。目标IP啥的
  183.           用来判断是否需要ARP应答
  184.           */
  185.     xdata uchar Receive_MAC_Source_add_MAC[6];
  186.     xdata uchar Receive_ARP_Frame_sender_IP[4];
  187.     xdata uchar Receive_ARP_Frame_Target_IP[4];
  188.     xdata uchar Receive_IP_Frame_Type;//定义IP协议类型
  189.    
  190.     xdata uchar Receive_Source_Port_MSB;
  191.     xdata uchar Receive_Source_Port_LSB;
  192.     xdata uchar Receive_Destination_MSB;
  193.     xdata uchar Receive_Destination_LSB;
  194.     xdata uint  Receive_Destination;
  195.     xdata uint  Receive_Source_Port;
  196.     xdata uchar Receive_Length_MSB;
  197.     xdata uchar Receive_Length_LSB;
  198.     xdata uint  Receive_Length;//UDP数据长度
  199.     xdata uchar TCP_FLAGES;//TCP标志位
  200. //    xdata uint  IP_Chrck_sum_MSB;
  201. //    xdata uint  IP_Chrck_sum_LSB;

  202.          //这都是从接收的数据包检索出的数据,读出来存变量*/
  203.            /**这里解释一下read_buffer_add(Receive_Now_Add_Pointer+18)为什么是18,
  204.            首先抓包后的数据内个MAC层的类型位置在12字节上,而这里要注意,ENC28J60内部
  205.            是有个缓存他要先把下一数据包的存放地址写进去,占两个字节,然后是4个字节的
  206.            状态字,加起来是6个字节,所以要在ENC28J60的接收缓存中找到MAC帧类型就得要加上6
  207.            所以这里是18,注意是ENC28J60,不是PC,详细应该看手册的45页!!!!!
  208.            2012年3月1日
  209.            于日照高科园
  210.            王均伟
  211.            **/
  212.             Receive_MAC_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+18); /***读取数据包的类型*****/
  213.         Receive_MAC_Type_LSB=read_buffer_add(Receive_Now_Add_Pointer+19);
  214.      Receive_MAC_Type=( ((Receive_MAC_Type_MSB<<8)&0xff00)+(Receive_MAC_Type_LSB&0x00ff));
  215.       
  216.      Receive_IP_Frame_Type=read_buffer_add(Receive_Now_Add_Pointer+29);//读取IP部首的协议

  217.      Receive_Add_Pointer_MSB=read_buffer_add(Receive_Now_Add_Pointer+1);
  218.               Receive_Add_Pointer_LSB=read_buffer_add(Receive_Now_Add_Pointer);
  219.      Receive_Next_Add_Pointer=(((Receive_Add_Pointer_MSB<<8)&0xff00)+(Receive_Add_Pointer_LSB&0x00ff)); //计算下一个数据包的地址
  220.      Receive_ARP_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+26); /***读取数据包的操作*****/
  221.         Receive_ARP_Type_LSB=read_buffer_add(Receive_Now_Add_Pointer+27);
  222.      Receive_ARP_Type=( ((Receive_ARP_Type_MSB<<8)&0xff00)+(Receive_ARP_Type_LSB&0x00ff));
  223.    
  224.      Receive_Size_Packet=(Receive_Next_Add_Pointer-Receive_Now_Add_Pointer);//计算接收到的这个数据包的大小
  225.         
  226.           /*************************************
  227.               如果是ARP请求就应答
  228.         ***************************************/
  229.    
  230.          if((Receive_MAC_Type==0x0806)&&(Receive_ARP_Type==0x0001))//检索ARP请求,回应
  231.           {
  232.       
  233.               
  234.         
  235.                  
  236.                   
  237.                Receive_MAC_Source_add_MAC[0]=read_buffer_add(Receive_Now_Add_Pointer+12);
  238.                Receive_MAC_Source_add_MAC[1]=read_buffer_add(Receive_Now_Add_Pointer+13);
  239.                Receive_MAC_Source_add_MAC[2]=read_buffer_add(Receive_Now_Add_Pointer+14);
  240.                Receive_MAC_Source_add_MAC[3]=read_buffer_add(Receive_Now_Add_Pointer+15); //发送者MAC
  241.                Receive_MAC_Source_add_MAC[4]=read_buffer_add(Receive_Now_Add_Pointer+16);
  242.                    Receive_MAC_Source_add_MAC[5]=read_buffer_add(Receive_Now_Add_Pointer+17);
  243.            
  244.            
  245.                
  246.               Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+34);
  247.               Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+35);  //发送者IP
  248.               Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+36);
  249.               Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+37);
  250.               
  251.               Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+44);
  252.               Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+45);  //目标IP
  253.               Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+46);
  254.               Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+47);
  255.            
  256.                  /***************************
  257.                      如果IP地址是本机
  258.                  ******************************/   
  259.                 if((Receive_ARP_Frame_Target_IP[0]==Send_ARP_Frame_sender_IP[0])&
  260.                 (Receive_ARP_Frame_Target_IP[1]==Send_ARP_Frame_sender_IP[1])&  
  261.                 (Receive_ARP_Frame_Target_IP[2]==Send_ARP_Frame_sender_IP[2]) &
  262.                 (Receive_ARP_Frame_Target_IP[3]==Send_ARP_Frame_sender_IP[3]))
  263.                 {
  264.                     
  265.                        
  266.            
  267.                   
  268.                  /*ARP 发送一帧数据应答*/     
  269.                      
  270.              Send_ARP_Answer_packet( Receive_MAC_Source_add_MAC,Receive_ARP_Frame_sender_IP,Receive_ARP_Frame_Target_IP); //应答
  271.                  
  272.                      
  273.       
  274.                                                       }
  275.      
  276.       }
  277.      
  278.         else
  279.           /*************************************
  280.               如果是ARP应答那么接收MAC
  281.         ***************************************/
  282.        /*检索ARP应答,提取目标MAC*/
  283.        if((Receive_MAC_Type==0x0806)&&(Receive_ARP_Type==0x0002))//检索ARP回应
  284.        {
  285.       
  286.                P0=0x0f;
  287.             
  288.            Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+34);
  289.            Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+35);  //发送者IP
  290.            Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+36);
  291.            Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+37);
  292.                //是发来的应答就提取MAC
  293.               
  294.                 if(       (Receive_ARP_Frame_sender_IP[0]==Send_ARP_Frame_Target_IP[0])
  295.                      &&(Receive_ARP_Frame_sender_IP[1]==Send_ARP_Frame_Target_IP[1])  
  296.                &&(Receive_ARP_Frame_sender_IP[2]==Send_ARP_Frame_Target_IP[2])
  297.                &&(Receive_ARP_Frame_sender_IP[3]==Send_ARP_Frame_Target_IP[3])
  298.               )
  299.               {
  300.         
  301.             MAC_Target_add[0]=read_buffer_add(Receive_Now_Add_Pointer+12);
  302.             MAC_Target_add[1]=read_buffer_add(Receive_Now_Add_Pointer+13);
  303.             MAC_Target_add[2]=read_buffer_add(Receive_Now_Add_Pointer+14);
  304.             MAC_Target_add[3]=read_buffer_add(Receive_Now_Add_Pointer+15); //提取发送者MAC
  305.             MAC_Target_add[4]=read_buffer_add(Receive_Now_Add_Pointer+16);
  306.                 MAC_Target_add[5]=read_buffer_add(Receive_Now_Add_Pointer+17);
  307.                ARP_REQUEST=1;//停止ARP请求
  308.               
  309.                }

  310.      
  311.      
  312.       }
  313.     else
  314.      
  315.    /******************************************************************************
  316.                   如果不是ARP检查是不是UDP是就接收数据
  317.    *********************************************************************************/
  318.        if((Receive_MAC_Type==0x0800)&&(Receive_IP_Frame_Type==0x11))//检索UDP数据,接收
  319.      {
  320.               /*这个地方用的上满ARP的变量由于是局部变量所以
  321.                 可以用,只是用它作为中间量获取IP,工判断用
  322.              无实际意义*/
  323.            
  324.       //  if(IP_CHECK_MUNB==0)
  325.        // {
  326.              Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+32);
  327.              Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+33);  //获得发送者IP
  328.              Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+34);
  329.              Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+35);
  330.             
  331.              Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+36);
  332.              Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+37);  //获得目标IP
  333.              Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+38);
  334.              Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+39);
  335.       
  336.       
  337.       
  338.                Receive_Source_Port_MSB=read_buffer_add(Receive_Now_Add_Pointer+40);
  339.                Receive_Source_Port_LSB=read_buffer_add(Receive_Now_Add_Pointer+41); //源端口
  340.                Receive_Source_Port=( ((Receive_Source_Port_MSB<<8)&0xff00)+(Receive_Source_Port_LSB&0x00ff));
  341.       
  342.                   Receive_Destination_MSB=read_buffer_add(Receive_Now_Add_Pointer+42);
  343.                Receive_Destination_LSB=read_buffer_add(Receive_Now_Add_Pointer+43); //目标端口
  344.                Receive_Destination=( ((Receive_Destination_MSB<<8)&0xff00)+(Receive_Destination_LSB&0x00ff));
  345.       
  346.             
  347.                                  //数据长度
  348.             
  349.                  /*如果是目标发来*/
  350.                if((Receive_ARP_Frame_Target_IP[0]==IP_Target_add[0])
  351.               &&(Receive_ARP_Frame_sender_IP[1]==IP_Target_add[1])  
  352.               &&(Receive_ARP_Frame_sender_IP[2]==IP_Target_add[2])
  353.               &&(Receive_ARP_Frame_sender_IP[3]==IP_Target_add[3])
  354.               
  355.               )
  356.               {
  357.                     /*如果是8080端口发到8080的发来到本机8080的数据接收*/
  358.                     if(   (Receive_Source_Port== UDP_Source_Port_C)
  359.                         &&(Receive_Destination==UDP_Target_Port_C)
  360.                     )
  361.                   {
  362.                  
  363.                        
  364.                        
  365.             
  366.                           /*计算接收到的数据字节*/
  367.                            Receive_Length_MSB=read_buffer_add(Receive_Now_Add_Pointer+44); //
  368.                                        Receive_Length_LSB=read_buffer_add(Receive_Now_Add_Pointer+45); //
  369.                            Receive_Length=((((Receive_Length_MSB<<8)&0xff00)+(Receive_Length_LSB&0x00ff))-8);
  370.                           /*读取数据字节最大20个字节*/
  371.                              for(i=0;i<Receive_Length;i++)
  372.                              {
  373.                                  /*读数据存数组数据长度不可以超过长度*/
  374.                             Receive_Data[i]=read_buffer_add(Receive_Now_Add_Pointer+48+i);
  375.                            
  376.                              }
  377.                
  378.                              if(Receive_Data[0]==0x0f)
  379.                              {

  380.                             Receive_Data[1]++; //接收到有效数据后自动加1
  381.                              UDP_Send_Data[0]=Receive_Data[1];//接收的数据加载到发送缓冲区

  382.                     Send_UDP_packet(   MAC_Target_add,
  383.                            IP_Target_add,
  384.                            UDP_Source_Port,
  385.                            UDP_Target_Port,
  386.                            UDP_Send_Data,
  387.                            1
  388.                           
  389.                           );
  390.                            
  391.                              }
  392.                            
  393.                            
  394.                         
  395.                         
  396.                   }
  397.       
  398.       
  399.          
  400.          
  401.               
  402.               }
  403.      
  404.       
  405.      
  406.      
  407.      
  408.       }
  409.       else
  410.        /******************************************************************************
  411.                   如果是TCP数据那么接收!
  412.    *********************************************************************************/
  413.        if((Receive_MAC_Type==0x0800)&&(Receive_IP_Frame_Type==0x06))//检索TCP数据,接收
  414.     {            
  415.             /* for (k=0;k<Receive_Size_Packet;k++)
  416.       {
  417.      
  418.         SendOneByte(read_buffer_add(Receive_Now_Add_Pointer+k));
  419.      
  420.       }      */
  421.    
  422.       /*   获得发送者IP    */
  423.                                      Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+32);
  424.              Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+33);  //获得发送者IP
  425.              Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+34);
  426.              Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+35);
  427.                     /*   获得目标IP    */
  428.              Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+36);
  429.              Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+37);  //获得目标IP
  430.              Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+38);
  431.              Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+39);
  432.       
  433.       
  434.       
  435.                Receive_Source_Port_MSB=read_buffer_add(Receive_Now_Add_Pointer+40);
  436.                Receive_Source_Port_LSB=read_buffer_add(Receive_Now_Add_Pointer+41); //源端口
  437.                  SendOneByte(Receive_Source_Port_MSB);
  438.               SendOneByte(Receive_Source_Port_LSB);
  439.                Receive_Source_Port=( ((Receive_Source_Port_MSB<<8)&0xff00)+(Receive_Source_Port_LSB&0x00ff));
  440.       
  441.                   Receive_Destination_MSB=read_buffer_add(Receive_Now_Add_Pointer+42);
  442.                Receive_Destination_LSB=read_buffer_add(Receive_Now_Add_Pointer+43); //目标端口
  443.                 SendOneByte(Receive_Destination_MSB);
  444.               SendOneByte(Receive_Destination_LSB);
  445.                Receive_Destination=( ((Receive_Destination_MSB<<8)&0xff00)+(Receive_Destination_LSB&0x00ff));
  446.                
  447.                
  448.                /*读取TCP得标志位FLAGES*/
  449.                 TCP_FLAGES=read_buffer_add(Receive_Now_Add_Pointer+53);
  450.                   SendOneByte(TCP_FLAGES);
  451.                   /*接收发送来的序列号*/
  452.                TCP_Sequence_Number_Send[0]=read_buffer_add(Receive_Now_Add_Pointer+44);
  453.                TCP_Sequence_Number_Send[1]=read_buffer_add(Receive_Now_Add_Pointer+45);
  454.                TCP_Sequence_Number_Send[2]=read_buffer_add(Receive_Now_Add_Pointer+46);
  455.                TCP_Sequence_Number_Send[3]=read_buffer_add(Receive_Now_Add_Pointer+47);
  456.                TCP_Sequence_Number_Send[3]++;
  457.                    /*接收应答的序列号*/
  458.                TCP_Sequence_Number_Receive[0]=read_buffer_add(Receive_Now_Add_Pointer+48);
  459.                TCP_Sequence_Number_Receive[1]=read_buffer_add(Receive_Now_Add_Pointer+49);
  460.                TCP_Sequence_Number_Receive[2]=read_buffer_add(Receive_Now_Add_Pointer+50);
  461.                TCP_Sequence_Number_Receive[3]=read_buffer_add(Receive_Now_Add_Pointer+51);
  462.                   SendOneByte(Receive_ARP_Frame_sender_IP[0]);
  463.                   SendOneByte(Receive_ARP_Frame_sender_IP[1]);
  464.                   SendOneByte(Receive_ARP_Frame_sender_IP[2]);
  465.                   SendOneByte(Receive_ARP_Frame_sender_IP[3]);

  466.                                                  /*如果是目标发来*/  
  467.                if((Receive_ARP_Frame_sender_IP[0]==IP_Target_add[0])
  468.               &&(Receive_ARP_Frame_sender_IP[1]==IP_Target_add[1])  
  469.               &&(Receive_ARP_Frame_sender_IP[2]==IP_Target_add[2])
  470.               &&(Receive_ARP_Frame_sender_IP[3]==IP_Target_add[3])
  471.               
  472.               )
  473.               {
  474.                     /*如果是8080端口发到8080的发来到本机8080的数据接收*/
  475.                     if(   (Receive_Source_Port==TCP_Source_Port_C)
  476.                         &&(Receive_Destination==TCP_Target_Port_C)
  477.                     )
  478.                   {
  479.                    /*s是连接回复!就发送第三次握手*/
  480.                     if(TCP_FLAGES==0x12)
  481.                     {
  482.                      
  483.                   
  484. Send_TCP_Establish_Connection(   &MAC_Target_add,
  485.               &IP_Target_add,
  486.                &TCP_Source_Port,
  487.                &TCP_Target_Port,
  488.             &TCP_Sequence_Number_Receive,
  489.             &TCP_Sequence_Number_Send,
  490.             0x10,
  491.             &TCP_Send_Data,
  492.             8
  493.        ) ;
  494.                   
  495.                   
  496.                     }



  497.                   }


  498.               }
  499.                  
  500.      
  501.    
  502.    
  503.    
  504.     }

  505.    /***********************数据处理结束*********************************************/


  506.       Receive_Now_Add_Pointer=Receive_Next_Add_Pointer;//下一个数据包地址指针重装如


  507. }
复制代码



回复

使用道具 举报

ID:70267 发表于 2015-7-30 16:44 | 显示全部楼层
楼主 有没有51单片机控制ENC28J60的程序  可以发给我吗2691769770@qq.com
回复

使用道具 举报

ID:87991 发表于 2015-8-21 14:05 | 显示全部楼层
厉害厉害,不过我不用他,麻烦啊,不是有W5500吗?硬件协议栈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表