標(biāo)題: ARM之ENC28J60的移植 [打印本頁]

作者: xuwei    時(shí)間: 2015-6-13 16:51
標(biāo)題: ARM之ENC28J60的移植
之前在51上搞好了UDP協(xié)議棧,現(xiàn)在挪到ARM上用,本想著會一帆風(fēng)順,結(jié)果卻是荊棘密布,花了一天工夫終于搞完了核心程序的移植,問題不是出在高層而是出在底層,硬件的接口,ARM速度高,接口我把分頻改成最大,最大降低速度,但是還是很不穩(wěn)定,很容易死!后來發(fā)現(xiàn)進(jìn)行短暫的延時(shí)有效,而且很穩(wěn)定,我想可能是速度太快了,硬件沒有時(shí)間反應(yīng)的緣故吧總之,是搞定了,哈哈,在51上的網(wǎng)卡接口只能是控制個(gè)小玩意,移到ARM上是我好久的夢想,也是用它傳輸攝像頭的圖片的開始,加油吧!拍照然后回傳電腦才是我的最終目的!


經(jīng)過幾天的調(diào)試終于可以實(shí)現(xiàn)TCP的連接了,其實(shí)跟UDP很相似只是他有個(gè)應(yīng)答機(jī)制,就是所謂的三次握手,這三次握手都是在我程序的控制下進(jìn)行的,對我來說已經(jīng)很透明,這就是自己寫協(xié)議棧的好處吧!可已學(xué)到不少東西,就是很麻煩,TCP的實(shí)現(xiàn)遠(yuǎn)沒有那么簡單,還有很多東西要寫,比如重發(fā)機(jī)制和四個(gè)定時(shí)器,還有避免報(bào)文的分片,以及現(xiàn)在都搞不懂的操作字,這個(gè)操作字在協(xié)議手冊中沒有提到,但是在實(shí)際中卻是關(guān)鍵,所以要學(xué)的東西真是太多了而這僅僅是個(gè)開始,隨著程序的增大我越來越感覺到我的結(jié)構(gòu)化有問題,雖然一經(jīng)采用了多文件處理,但是還是顯得有點(diǎn)無序,哎,總之,這是自己的成果,還是很高興的!!
  1. #include "ARP.h"
  2. #include "IP.H"
  3. #include "UDP.H"
  4. #include "TCP.H"
  5. /*對內(nèi)部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請求獲取網(wǎng)關(guān)標(biāo)志位,0表示可以進(jìn)行ARP請求,1表示已經(jīng)獲得MAC地址可以關(guān)閉ARP
  13. static xdata uint Receive_Next_Add_Pointer;//下個(gè)數(shù)據(jù)包的開始地址指針
  14. static xdata uint Receive_Now_Add_Pointer;//當(dāng)前地址指針
  15. static xdata uint Receive_MAC_Type;//數(shù)據(jù)包的類型
  16. static xdata uint Receive_Size_Packet;//數(shù)據(jù)包的大小
  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;    /*接收數(shù)據(jù)包的臨時(shí)地址指針緩沖區(qū)*/
  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數(shù)據(jù)

  25.       /*UDP相關(guān)設(shè)置*/
  26. ////////////////////////very important config//////////////////////////////////////////////////////////////////////
  27. //////////////////////////////////////////////////////////////////////////////////////////////
  28. ///////////////////////very important config///////////////////////////////////////////////////////////////////////
  29. //////////////////////////////////////////////////////////////////////////////////////////////
  30. ////////////////////////very important config//////////////////////////////////////////////////////////////////////
  31. static xdata uchar MAC_Target_add[6];//網(wǎng)關(guān)目標(biāo)MAC這個(gè)由ARP自動獲取
  32. static xdata uchar IP_Target_add[4]={192,168,1,89};//外網(wǎng)或者內(nèi)網(wǎng)的IP地址
  33. static xdata uchar UDP_Source_Port[2]={0x0b,0xd1}; //udp本機(jī)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};//發(fā)送的數(shù)據(jù)

  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};//本機(jī)IP
  44. xdata uchar Send_ARP_Frame_Target_IP[4]={192,168,1,1};//網(wǎng)關(guān)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};//本機(jī)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};//發(fā)送端序列號
  54. static xdata uchar TCP_Sequence_Number_Receive[4];//接收端回復(fù)的序列號
  55. static xdata uchar TCP_Send_Data[]={0x02,0x04,0x05,0xb4,0x01,0x01,0x04,0x02,0x01,0x01,0x04,0x02};//發(fā)送的數(shù)據(jù)
  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];//用于校驗(yàn)和計(jì)算的數(shù)組
  59. //xdata uint IP_CHECK_MUNB;//計(jì)算后的IP部首的校驗(yàn)和被寫入這里面
  60. /*****************************


  61. 接收數(shù)據(jù)包

  62. 45頁
  63. *******************************/
  64. void Receiving_data_packet()
  65. {     uchar xdata d2;
  66.                     /*用于ARP請求*/
  67.    
  68. Receive_Next_Add_Pointer=0;//緩沖區(qū)的數(shù)據(jù)包下一個(gè)地址指針. 初始化
  69. Receive_Now_Add_Pointer=0x300;//當(dāng)前數(shù)據(jù)緩沖區(qū)地址指針.

  70.                            

  71. ///檢測EPKTCNT是否為空

  72. while(1)  //死在里面么,這個(gè)是故意的
  73.    {

  74. write_ENC28J60_REG_SPI(ECON1,5);//開啟接收
  75.       for(;;)
  76.    {
  77.      d2=read_ENC28J60_REG_SPI(EPKTCNT);//有無數(shù)據(jù)報(bào)?
  78. // SendOneByte(d2);
  79.        if(d2>0)break;
  80.     }
  81.         //
  82. //delay1s();
  83.          /*ARP請求,注意這個(gè)ARP請求是獲取指定網(wǎng)關(guān)的IP,也就是192.168.1.1*/      
  84.          //
  85.           READ_N_Packet();//讀數(shù)據(jù)包
  86.         if(ARP_REQUEST==0)  //是否獲取MAC?沒有?好進(jìn)入獲取MAC地址,這是個(gè)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;//只發(fā)一次連接請求然后等待回應(yīng)
  106.           }
  107.       
  108.         
  109.       
  110.         
  111.       
  112.                        
  113.       





  114.       Check_The_remaining_space();//檢查是否釋放緩沖區(qū)
  115.          write_ENC28J60_REG_SPI(ECON2,0x40);//PACKET減一
  116.          

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

  120.    檢查剩余空間,如果不夠就釋放空間
  121.    是這樣的流程:
  122.    首先解釋ERXRDPTL和ERXRDPTH這個(gè)寄存器是干什么的呢?他就是說硬件通過ERXWRPTL和ERXWRPTH寫入指定的緩存
  123.    那么他在那里停止呢?緩存器的底部?錯,這個(gè)接收緩沖區(qū)就是一個(gè)FIFO,他是循環(huán)的存儲結(jié)構(gòu),所以他在到底部
  124.    時(shí)不會停會跳到開始字節(jié)繼續(xù),那么這樣一來他不就停不下了嗎?顯然芯片設(shè)計(jì)的人不允許他這樣所以設(shè)置了這個(gè)
  125.    寄存器ERXRDPTL和ERXRDPTH,他就是停止一旦硬件寫到他的地址以后的數(shù)據(jù)他不在接收,全部丟棄,所以要想全部
  126.    一個(gè)包不少的把以太網(wǎng)上的數(shù)據(jù)接收回來就要周期性的更新這個(gè)地址,也就是說他需要程序自己控制而不要干涉他
  127.    否則你將不會得到連續(xù)的數(shù)據(jù)包,我程序里這樣設(shè)計(jì)的:首先在初始化設(shè)定接收緩存的開始地址和結(jié)束地址分別是
  128.    從0x300-0x1fff這7KB的區(qū)域全部是接收緩沖區(qū)(FIFO),初始化后ERXWRPTL和ERXWRPTH這個(gè)指針自動更新對準(zhǔn)0X300
  129.    這個(gè)寫指針是硬件控制的,用戶控制不了,所以呢不用管,只要在乎這個(gè)ERXRDPTL和ERXRDPTH地址指針,這個(gè)指針我首先
  130.    付給他一個(gè)地址0x0e7e,也就是差不多在這個(gè)FIFO的一半的位置什么意思呢?表示如果我不更新這個(gè)指針的話那么硬件從0X300寫到
  131.    0X0E7E就不在寫了,所以我要一邊讀下一個(gè)包的地址一邊計(jì)算他逼近的距離,當(dāng)小與400個(gè)字節(jié)的時(shí)候就把這個(gè)指針向下移動到0X1FFF
  132.    也就是FIFO的底部,這時(shí)候硬件就可以繼續(xù)向下,但是這時(shí)如果不更新這個(gè)指針,他就在0X1FFF的時(shí)候有就停止了,所以采取同樣的辦法
  133.    就是計(jì)算逼近距離小于400字節(jié)就更新指針到原來的位置0X0E7E,他又可以繼續(xù)寫了,就這樣有數(shù)據(jù)包就收數(shù)據(jù)包永遠(yuǎn)追不上指針,就像小時(shí)候
  134.    玩的一個(gè)游戲一個(gè)棍兩頭各一個(gè)動物轉(zhuǎn)動他們他們永遠(yuǎn)不相遇,就是這個(gè)道理,至于處理數(shù)據(jù)包這個(gè)就被抽象出來了,你想怎么處理就怎么處理
  135.    2011年11月23日
  136.   無錫第五項(xiàng)目部
  137.    王均偉

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

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

  140.    檢查是否釋放緩沖區(qū)函數(shù)
  141.   這個(gè)函數(shù)就是要不斷的檢查接收緩
  142.   存數(shù)據(jù)是不是達(dá)到臨界指針,到了
  143.   就要馬上讓指針下移以免數(shù)據(jù)重疊。
  144. *************************/                  /**************************/
  145. void Check_The_remaining_space()           //讀取當(dāng)前終止指針的值
  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; //              下一個(gè)數(shù)據(jù)包的地址和當(dāng)前終止地址作比較
  151.                 //看看是否接近到離終止指針400個(gè)字節(jié)的地方?
  152.                 //還有這個(gè)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. 讀取數(shù)據(jù)包和處理將在這里進(jìn)行
  173. 主要是從BUFF里取出數(shù)據(jù)包并且處理,比如ARP、UDP、的數(shù)據(jù)提取和回應(yīng)啥的
  174. ************************************************/

  175. void READ_N_Packet()
  176. {   
  177.     /***********************數(shù)據(jù)處理開始*********************************************/   
  178.         xdata uchar  i; //定義一個(gè)計(jì)數(shù)變量好用來接收數(shù)據(jù)
  179.    
  180.     xdata uint k; //計(jì)數(shù)
  181.           /*定義接收到的包相關(guān)信息
  182.           比如MAC、源地址IP。目標(biāo)IP啥的
  183.           用來判斷是否需要ARP應(yīng)答
  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協(xié)議類型
  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數(shù)據(jù)長度
  199.     xdata uchar TCP_FLAGES;//TCP標(biāo)志位
  200. //    xdata uint  IP_Chrck_sum_MSB;
  201. //    xdata uint  IP_Chrck_sum_LSB;

  202.          //這都是從接收的數(shù)據(jù)包檢索出的數(shù)據(jù),讀出來存變量*/
  203.            /**這里解釋一下read_buffer_add(Receive_Now_Add_Pointer+18)為什么是18,
  204.            首先抓包后的數(shù)據(jù)內(nèi)個(gè)MAC層的類型位置在12字節(jié)上,而這里要注意,ENC28J60內(nèi)部
  205.            是有個(gè)緩存他要先把下一數(shù)據(jù)包的存放地址寫進(jìn)去,占兩個(gè)字節(jié),然后是4個(gè)字節(jié)的
  206.            狀態(tài)字,加起來是6個(gè)字節(jié),所以要在ENC28J60的接收緩存中找到MAC幀類型就得要加上6
  207.            所以這里是18,注意是ENC28J60,不是PC,詳細(xì)應(yīng)該看手冊的45頁。。。!
  208.            2012年3月1日
  209.            于日照高科園
  210.            王均偉
  211.            **/
  212.             Receive_MAC_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+18); /***讀取數(shù)據(jù)包的類型*****/
  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部首的協(xié)議

  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)); //計(jì)算下一個(gè)數(shù)據(jù)包的地址
  220.      Receive_ARP_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+26); /***讀取數(shù)據(jù)包的操作*****/
  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);//計(jì)算接收到的這個(gè)數(shù)據(jù)包的大小
  225.         
  226.           /*************************************
  227.               如果是ARP請求就應(yīng)答
  228.         ***************************************/
  229.    
  230.          if((Receive_MAC_Type==0x0806)&&(Receive_ARP_Type==0x0001))//檢索ARP請求,回應(yīng)
  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); //發(fā)送者M(jìn)AC
  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);  //發(fā)送者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);  //目標(biāo)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地址是本機(jī)
  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 發(fā)送一幀數(shù)據(jù)應(yīng)答*/     
  269.                      
  270.              Send_ARP_Answer_packet( Receive_MAC_Source_add_MAC,Receive_ARP_Frame_sender_IP,Receive_ARP_Frame_Target_IP); //應(yīng)答
  271.                  
  272.                      
  273.       
  274.                                                       }
  275.      
  276.       }
  277.      
  278.         else
  279.           /*************************************
  280.               如果是ARP應(yīng)答那么接收MAC
  281.         ***************************************/
  282.        /*檢索ARP應(yīng)答,提取目標(biāo)MAC*/
  283.        if((Receive_MAC_Type==0x0806)&&(Receive_ARP_Type==0x0002))//檢索ARP回應(yīng)
  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);  //發(fā)送者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.                //是發(fā)來的應(yīng)答就提取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); //提取發(fā)送者M(jìn)AC
  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是就接收數(shù)據(jù)
  317.    *********************************************************************************/
  318.        if((Receive_MAC_Type==0x0800)&&(Receive_IP_Frame_Type==0x11))//檢索UDP數(shù)據(jù),接收
  319.      {
  320.               /*這個(gè)地方用的上滿ARP的變量由于是局部變量所以
  321.                 可以用,只是用它作為中間量獲取IP,工判斷用
  322.              無實(shí)際意義*/
  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);  //獲得發(fā)送者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);  //獲得目標(biāo)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); //目標(biāo)端口
  344.                Receive_Destination=( ((Receive_Destination_MSB<<8)&0xff00)+(Receive_Destination_LSB&0x00ff));
  345.       
  346.             
  347.                                  //數(shù)據(jù)長度
  348.             
  349.                  /*如果是目標(biāo)發(fā)來*/
  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端口發(fā)到8080的發(fā)來到本機(jī)8080的數(shù)據(jù)接收*/
  358.                     if(   (Receive_Source_Port== UDP_Source_Port_C)
  359.                         &&(Receive_Destination==UDP_Target_Port_C)
  360.                     )
  361.                   {
  362.                  
  363.                        
  364.                        
  365.             
  366.                           /*計(jì)算接收到的數(shù)據(jù)字節(jié)*/
  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.                           /*讀取數(shù)據(jù)字節(jié)最大20個(gè)字節(jié)*/
  371.                              for(i=0;i<Receive_Length;i++)
  372.                              {
  373.                                  /*讀數(shù)據(jù)存數(shù)組數(shù)據(jù)長度不可以超過長度*/
  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]++; //接收到有效數(shù)據(jù)后自動加1
  381.                              UDP_Send_Data[0]=Receive_Data[1];//接收的數(shù)據(jù)加載到發(fā)送緩沖區(qū)

  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數(shù)據(jù)那么接收!
  412.    *********************************************************************************/
  413.        if((Receive_MAC_Type==0x0800)&&(Receive_IP_Frame_Type==0x06))//檢索TCP數(shù)據(jù),接收
  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.       /*   獲得發(fā)送者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);  //獲得發(fā)送者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.                     /*   獲得目標(biāo)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);  //獲得目標(biāo)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); //目標(biāo)端口
  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得標(biāo)志位FLAGES*/
  449.                 TCP_FLAGES=read_buffer_add(Receive_Now_Add_Pointer+53);
  450.                   SendOneByte(TCP_FLAGES);
  451.                   /*接收發(fā)送來的序列號*/
  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.                    /*接收應(yīng)答的序列號*/
  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.                                                  /*如果是目標(biāo)發(fā)來*/  
  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端口發(fā)到8080的發(fā)來到本機(jī)8080的數(shù)據(jù)接收*/
  475.                     if(   (Receive_Source_Port==TCP_Source_Port_C)
  476.                         &&(Receive_Destination==TCP_Target_Port_C)
  477.                     )
  478.                   {
  479.                    /*s是連接回復(fù)!就發(fā)送第三次握手*/
  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.    /***********************數(shù)據(jù)處理結(jié)束*********************************************/


  506.       Receive_Now_Add_Pointer=Receive_Next_Add_Pointer;//下一個(gè)數(shù)據(jù)包地址指針重裝如


  507. }
復(fù)制代碼




作者: 中奧ol    時(shí)間: 2015-7-30 16:44
樓主 有沒有51單片機(jī)控制ENC28J60的程序  可以發(fā)給我嗎2691769770@qq.com
作者: stewart_leung    時(shí)間: 2015-8-21 14:05
厲害厲害,不過我不用他,麻煩啊,不是有W5500嗎?硬件協(xié)議棧




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1