久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
ARM之ENC28J60的移植
[打印本頁]
作者:
xuwei
時間:
2015-6-13 16:51
標題:
ARM之ENC28J60的移植
之前在51上搞好了UDP協議棧,現在挪到ARM上用,本想著會一帆風順,結果卻是荊棘密布,花了一天工夫終于搞完了核心程序的移植,問題不是出在高層而是出在底層,硬件的接口,ARM速度高,接口我把分頻改成最大,最大降低速度,但是還是很不穩定,很容易死!后來發現進行短暫的延時有效,而且很穩定,我想可能是速度太快了,硬件沒有時間反應的緣故吧總之,是搞定了,哈哈,在51上的網卡接口只能是控制個小玩意,移到ARM上是我好久的夢想,也是用它傳輸攝像頭的圖片的開始,加油吧!拍照然后回傳電腦才是我的最終目的!
經過幾天的調試終于可以實現TCP的連接了,其實跟UDP很相似只是他有個應答機制,就是所謂的三次握手,這三次握手都是在我程序的控制下進行的,對我來說已經很透明,這就是自己寫協議棧的好處吧!可已學到不少東西,就是很麻煩,TCP的實現遠沒有那么簡單,還有很多東西要寫,比如重發機制和四個定時器,還有避免報文的分片,以及現在都搞不懂的操作字,這個操作字在協議手冊中沒有提到,但是在實際中卻是關鍵,所以要學的東西真是太多了而這僅僅是個開始,隨著程序的增大我越來越感覺到我的結構化有問題,雖然一經采用了多文件處理,但是還是顯得有點無序,哎,總之,這是自己的成果,還是很高興的!!
#include "ARP.h"
#include "IP.H"
#include "UDP.H"
#include "TCP.H"
/*對內部FIFO的操作*/
#include "ENC28J60_Buff_Operation.h"
#include "ENC28J60_Receive.h"
#include "ENC28J60_SPI.h"
#include "UART.H"
#include "ENC28J60_Send_Receive.h"
static xdata uchar flage=0;//釋放FIFO的上部分還是下半部分FLAGE=0,釋放下半部分FLAGE=1釋放上半部分
static xdata uchar ARP_REQUEST=0;//ARP請求獲取網關標志位,0表示可以進行ARP請求,1表示已經獲得MAC地址可以關閉ARP
static xdata uint Receive_Next_Add_Pointer;//下個數據包的開始地址指針
static xdata uint Receive_Now_Add_Pointer;//當前地址指針
static xdata uint Receive_MAC_Type;//數據包的類型
static xdata uint Receive_Size_Packet;//數據包的大小
static xdata uint Receive_Add_Pointer_MSB=0;
static xdata uint Receive_Add_Pointer_LSB=0;
static xdata uint Receive_MAC_Type_MSB; /*接收數據包的臨時地址指針緩沖區*/
static xdata uint Receive_MAC_Type_LSB;
static xdata uint Receive_ARP_Type_MSB;
static xdata uint Receive_ARP_Type_LSB;
static xdata uint Receive_ARP_Type;
static xdata uchar Receive_Data[20];//接收到的UDP數據
/*UDP相關設置*/
////////////////////////very important config//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////very important config///////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////very important config//////////////////////////////////////////////////////////////////////
static xdata uchar MAC_Target_add[6];//網關目標MAC這個由ARP自動獲取
static xdata uchar IP_Target_add[4]={192,168,1,89};//外網或者內網的IP地址
static xdata uchar UDP_Source_Port[2]={0x0b,0xd1}; //udp本機IP 3025
static xdata uchar UDP_Target_Port[2]={0x1f,0x41}; //對方端口 8001
static xdata uchar UDP_Send_Data[]={0x56,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa};//發送的數據
/* xdata uchar TCP_Source_Port[4];
xdata uchar TCP_Target_Port[4];
xdata uchar TCP_Send_Data[10];
xdata uchar TCP_Send_Data_length;
*/
xdata uint UDP_Source_Port_C=8001;//對方端口
xdata uint UDP_Target_Port_C=3025;//本地端口
xdata uchar Send_ARP_Frame_sender_IP[4]={192,168,1,114};//本機IP
xdata uchar Send_ARP_Frame_Target_IP[4]={192,168,1,1};//網關IP
xdata uint n=0;
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////very important config////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//TCP端口
static xdata uchar TCP_Source_Port[2]={0x04,0xee};//本機IP 1262
static xdata uchar TCP_Target_Port[2]={0x1f,0x41};//對方端口 8001
static xdata uchar TCP_Sequence_Number_Send[4]={0xcc,0x0a,0x68,0x75};//發送端序列號
static xdata uchar TCP_Sequence_Number_Receive[4];//接收端回復的序列號
static xdata uchar TCP_Send_Data[]={0x02,0x04,0x05,0xb4,0x01,0x01,0x04,0x02,0x01,0x01,0x04,0x02};//發送的數據
xdata uint TCP_Source_Port_C=8001;//對方端口
xdata uint TCP_Target_Port_C=1262;//本地端口
//xdata uint IP_Receive_Send_check_Sum[10];//用于校驗和計算的數組
//xdata uint IP_CHECK_MUNB;//計算后的IP部首的校驗和被寫入這里面
/*****************************
接收數據包
45頁
*******************************/
void Receiving_data_packet()
{ uchar xdata d2;
/*用于ARP請求*/
Receive_Next_Add_Pointer=0;//緩沖區的數據包下一個地址指針. 初始化
Receive_Now_Add_Pointer=0x300;//當前數據緩沖區地址指針.
///檢測EPKTCNT是否為空
while(1) //死在里面么,這個是故意的
{
write_ENC28J60_REG_SPI(ECON1,5);//開啟接收
for(;;)
{
d2=read_ENC28J60_REG_SPI(EPKTCNT);//有無數據報?
// SendOneByte(d2);
if(d2>0)break;
}
//
//delay1s();
/*ARP請求,注意這個ARP請求是獲取指定網關的IP,也就是192.168.1.1*/
//
READ_N_Packet();//讀數據包
if(ARP_REQUEST==0) //是否獲取MAC?沒有?好進入獲取MAC地址,這是個ARP請求
{
Send_ARP_Request_packet(Send_ARP_Frame_sender_IP,Send_ARP_Frame_Target_IP);
}
if(ARP_REQUEST==1)
{
/*TCP鏈接請求*/
Send_TCP_Establish_Connection( &MAC_Target_add,
&IP_Target_add,
&TCP_Source_Port,
&TCP_Target_Port,
&TCP_Sequence_Number_Send,
&TCP_Sequence_Number_Receive,
2,
&TCP_Send_Data,
8
);
ARP_REQUEST=0x88;//只發一次連接請求然后等待回應
}
Check_The_remaining_space();//檢查是否釋放緩沖區
write_ENC28J60_REG_SPI(ECON2,0x40);//PACKET減一
}
}
/*******************************
檢查剩余空間,如果不夠就釋放空間
是這樣的流程:
首先解釋ERXRDPTL和ERXRDPTH這個寄存器是干什么的呢?他就是說硬件通過ERXWRPTL和ERXWRPTH寫入指定的緩存
那么他在那里停止呢?緩存器的底部?錯,這個接收緩沖區就是一個FIFO,他是循環的存儲結構,所以他在到底部
時不會停會跳到開始字節繼續,那么這樣一來他不就停不下了嗎?顯然芯片設計的人不允許他這樣所以設置了這個
寄存器ERXRDPTL和ERXRDPTH,他就是停止一旦硬件寫到他的地址以后的數據他不在接收,全部丟棄,所以要想全部
一個包不少的把以太網上的數據接收回來就要周期性的更新這個地址,也就是說他需要程序自己控制而不要干涉他
否則你將不會得到連續的數據包,我程序里這樣設計的:首先在初始化設定接收緩存的開始地址和結束地址分別是
從0x300-0x1fff這7KB的區域全部是接收緩沖區(FIFO),初始化后ERXWRPTL和ERXWRPTH這個指針自動更新對準0X300
這個寫指針是硬件控制的,用戶控制不了,所以呢不用管,只要在乎這個ERXRDPTL和ERXRDPTH地址指針,這個指針我首先
付給他一個地址0x0e7e,也就是差不多在這個FIFO的一半的位置什么意思呢?表示如果我不更新這個指針的話那么硬件從0X300寫到
0X0E7E就不在寫了,所以我要一邊讀下一個包的地址一邊計算他逼近的距離,當小與400個字節的時候就把這個指針向下移動到0X1FFF
也就是FIFO的底部,這時候硬件就可以繼續向下,但是這時如果不更新這個指針,他就在0X1FFF的時候有就停止了,所以采取同樣的辦法
就是計算逼近距離小于400字節就更新指針到原來的位置0X0E7E,他又可以繼續寫了,就這樣有數據包就收數據包永遠追不上指針,就像小時候
玩的一個游戲一個棍兩頭各一個動物轉動他們他們永遠不相遇,就是這個道理,至于處理數據包這個就被抽象出來了,你想怎么處理就怎么處理
2011年11月23日
無錫第五項目部
王均偉
******************************/
/***********************
檢查是否釋放緩沖區函數
這個函數就是要不斷的檢查接收緩
存數據是不是達到臨界指針,到了
就要馬上讓指針下移以免數據重疊。
*************************/ /**************************/
void Check_The_remaining_space() //讀取當前終止指針的值
{ uint xdata m,l,d,d2; /**************************/
l=read_ENC28J60_REG_SPI(ERXRDPTL);
m=read_ENC28J60_REG_SPI(ERXRDPTH);
d2=((l&0x00ff)+((m<<8)&0xff00)); /*****************************/
d=d2-Receive_Next_Add_Pointer; // 下一個數據包的地址和當前終止地址作比較
//看看是否接近到離終止指針400個字節的地方?
//還有這個Flage表示以0X0E7E為界的緩存的釋放,
//FLAGE=0表示釋放下半部分FIFO(0x0e7e-0x1fff)
//FLAGE=1表示釋放上半部分FIFO(0X1FFF-0X0E7E)
/***************************/
if((d<250)&(flage==0))//如果flage=0和
{
write_ENC28J60_REG_SPI(ERXRDPTL,0xff);
write_ENC28J60_REG_SPI(ERXRDPTH,0x1f);
flage=1;
}
else
if((d<250)&(flage==1))//如果flage=1和空間不足
{
write_ENC28J60_REG_SPI(ERXRDPTL,0x7e);
write_ENC28J60_REG_SPI(ERXRDPTH,0x0e);
flage=0;
}
}
/************************************************
讀取數據包和處理將在這里進行
主要是從BUFF里取出數據包并且處理,比如ARP、UDP、的數據提取和回應啥的
************************************************/
void READ_N_Packet()
{
/***********************數據處理開始*********************************************/
xdata uchar i; //定義一個計數變量好用來接收數據
xdata uint k; //計數
/*定義接收到的包相關信息
比如MAC、源地址IP。目標IP啥的
用來判斷是否需要ARP應答
*/
xdata uchar Receive_MAC_Source_add_MAC[6];
xdata uchar Receive_ARP_Frame_sender_IP[4];
xdata uchar Receive_ARP_Frame_Target_IP[4];
xdata uchar Receive_IP_Frame_Type;//定義IP協議類型
xdata uchar Receive_Source_Port_MSB;
xdata uchar Receive_Source_Port_LSB;
xdata uchar Receive_Destination_MSB;
xdata uchar Receive_Destination_LSB;
xdata uint Receive_Destination;
xdata uint Receive_Source_Port;
xdata uchar Receive_Length_MSB;
xdata uchar Receive_Length_LSB;
xdata uint Receive_Length;//UDP數據長度
xdata uchar TCP_FLAGES;//TCP標志位
// xdata uint IP_Chrck_sum_MSB;
// xdata uint IP_Chrck_sum_LSB;
//這都是從接收的數據包檢索出的數據,讀出來存變量*/
/**這里解釋一下read_buffer_add(Receive_Now_Add_Pointer+18)為什么是18,
首先抓包后的數據內個MAC層的類型位置在12字節上,而這里要注意,ENC28J60內部
是有個緩存他要先把下一數據包的存放地址寫進去,占兩個字節,然后是4個字節的
狀態字,加起來是6個字節,所以要在ENC28J60的接收緩存中找到MAC幀類型就得要加上6
所以這里是18,注意是ENC28J60,不是PC,詳細應該看手冊的45頁!!!!!
2012年3月1日
于日照高科園
王均偉
**/
Receive_MAC_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+18); /***讀取數據包的類型*****/
Receive_MAC_Type_LSB=read_buffer_add(Receive_Now_Add_Pointer+19);
Receive_MAC_Type=( ((Receive_MAC_Type_MSB<<8)&0xff00)+(Receive_MAC_Type_LSB&0x00ff));
Receive_IP_Frame_Type=read_buffer_add(Receive_Now_Add_Pointer+29);//讀取IP部首的協議
Receive_Add_Pointer_MSB=read_buffer_add(Receive_Now_Add_Pointer+1);
Receive_Add_Pointer_LSB=read_buffer_add(Receive_Now_Add_Pointer);
Receive_Next_Add_Pointer=(((Receive_Add_Pointer_MSB<<8)&0xff00)+(Receive_Add_Pointer_LSB&0x00ff)); //計算下一個數據包的地址
Receive_ARP_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+26); /***讀取數據包的操作*****/
Receive_ARP_Type_LSB=read_buffer_add(Receive_Now_Add_Pointer+27);
Receive_ARP_Type=( ((Receive_ARP_Type_MSB<<8)&0xff00)+(Receive_ARP_Type_LSB&0x00ff));
Receive_Size_Packet=(Receive_Next_Add_Pointer-Receive_Now_Add_Pointer);//計算接收到的這個數據包的大小
/*************************************
如果是ARP請求就應答
***************************************/
if((Receive_MAC_Type==0x0806)&&(Receive_ARP_Type==0x0001))//檢索ARP請求,回應
{
Receive_MAC_Source_add_MAC[0]=read_buffer_add(Receive_Now_Add_Pointer+12);
Receive_MAC_Source_add_MAC[1]=read_buffer_add(Receive_Now_Add_Pointer+13);
Receive_MAC_Source_add_MAC[2]=read_buffer_add(Receive_Now_Add_Pointer+14);
Receive_MAC_Source_add_MAC[3]=read_buffer_add(Receive_Now_Add_Pointer+15); //發送者MAC
Receive_MAC_Source_add_MAC[4]=read_buffer_add(Receive_Now_Add_Pointer+16);
Receive_MAC_Source_add_MAC[5]=read_buffer_add(Receive_Now_Add_Pointer+17);
Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+34);
Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+35); //發送者IP
Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+36);
Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+37);
Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+44);
Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+45); //目標IP
Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+46);
Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+47);
/***************************
如果IP地址是本機
******************************/
if((Receive_ARP_Frame_Target_IP[0]==Send_ARP_Frame_sender_IP[0])&
(Receive_ARP_Frame_Target_IP[1]==Send_ARP_Frame_sender_IP[1])&
(Receive_ARP_Frame_Target_IP[2]==Send_ARP_Frame_sender_IP[2]) &
(Receive_ARP_Frame_Target_IP[3]==Send_ARP_Frame_sender_IP[3]))
{
/*ARP 發送一幀數據應答*/
Send_ARP_Answer_packet( Receive_MAC_Source_add_MAC,Receive_ARP_Frame_sender_IP,Receive_ARP_Frame_Target_IP); //應答
}
}
else
/*************************************
如果是ARP應答那么接收MAC
***************************************/
/*檢索ARP應答,提取目標MAC*/
if((Receive_MAC_Type==0x0806)&&(Receive_ARP_Type==0x0002))//檢索ARP回應
{
P0=0x0f;
Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+34);
Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+35); //發送者IP
Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+36);
Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+37);
//是發來的應答就提取MAC
if( (Receive_ARP_Frame_sender_IP[0]==Send_ARP_Frame_Target_IP[0])
&&(Receive_ARP_Frame_sender_IP[1]==Send_ARP_Frame_Target_IP[1])
&&(Receive_ARP_Frame_sender_IP[2]==Send_ARP_Frame_Target_IP[2])
&&(Receive_ARP_Frame_sender_IP[3]==Send_ARP_Frame_Target_IP[3])
)
{
MAC_Target_add[0]=read_buffer_add(Receive_Now_Add_Pointer+12);
MAC_Target_add[1]=read_buffer_add(Receive_Now_Add_Pointer+13);
MAC_Target_add[2]=read_buffer_add(Receive_Now_Add_Pointer+14);
MAC_Target_add[3]=read_buffer_add(Receive_Now_Add_Pointer+15); //提取發送者MAC
MAC_Target_add[4]=read_buffer_add(Receive_Now_Add_Pointer+16);
MAC_Target_add[5]=read_buffer_add(Receive_Now_Add_Pointer+17);
ARP_REQUEST=1;//停止ARP請求
}
}
else
/******************************************************************************
如果不是ARP檢查是不是UDP是就接收數據
*********************************************************************************/
if((Receive_MAC_Type==0x0800)&&(Receive_IP_Frame_Type==0x11))//檢索UDP數據,接收
{
/*這個地方用的上滿ARP的變量由于是局部變量所以
可以用,只是用它作為中間量獲取IP,工判斷用
無實際意義*/
// if(IP_CHECK_MUNB==0)
// {
Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+32);
Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+33); //獲得發送者IP
Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+34);
Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+35);
Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+36);
Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+37); //獲得目標IP
Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+38);
Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+39);
Receive_Source_Port_MSB=read_buffer_add(Receive_Now_Add_Pointer+40);
Receive_Source_Port_LSB=read_buffer_add(Receive_Now_Add_Pointer+41); //源端口
Receive_Source_Port=( ((Receive_Source_Port_MSB<<8)&0xff00)+(Receive_Source_Port_LSB&0x00ff));
Receive_Destination_MSB=read_buffer_add(Receive_Now_Add_Pointer+42);
Receive_Destination_LSB=read_buffer_add(Receive_Now_Add_Pointer+43); //目標端口
Receive_Destination=( ((Receive_Destination_MSB<<8)&0xff00)+(Receive_Destination_LSB&0x00ff));
//數據長度
/*如果是目標發來*/
if((Receive_ARP_Frame_Target_IP[0]==IP_Target_add[0])
&&(Receive_ARP_Frame_sender_IP[1]==IP_Target_add[1])
&&(Receive_ARP_Frame_sender_IP[2]==IP_Target_add[2])
&&(Receive_ARP_Frame_sender_IP[3]==IP_Target_add[3])
)
{
/*如果是8080端口發到8080的發來到本機8080的數據接收*/
if( (Receive_Source_Port== UDP_Source_Port_C)
&&(Receive_Destination==UDP_Target_Port_C)
)
{
/*計算接收到的數據字節*/
Receive_Length_MSB=read_buffer_add(Receive_Now_Add_Pointer+44); //
Receive_Length_LSB=read_buffer_add(Receive_Now_Add_Pointer+45); //
Receive_Length=((((Receive_Length_MSB<<8)&0xff00)+(Receive_Length_LSB&0x00ff))-8);
/*讀取數據字節最大20個字節*/
for(i=0;i<Receive_Length;i++)
{
/*讀數據存數組數據長度不可以超過長度*/
Receive_Data[i]=read_buffer_add(Receive_Now_Add_Pointer+48+i);
}
if(Receive_Data[0]==0x0f)
{
Receive_Data[1]++; //接收到有效數據后自動加1
UDP_Send_Data[0]=Receive_Data[1];//接收的數據加載到發送緩沖區
Send_UDP_packet( MAC_Target_add,
IP_Target_add,
UDP_Source_Port,
UDP_Target_Port,
UDP_Send_Data,
1
);
}
}
}
}
else
/******************************************************************************
如果是TCP數據那么接收!
*********************************************************************************/
if((Receive_MAC_Type==0x0800)&&(Receive_IP_Frame_Type==0x06))//檢索TCP數據,接收
{
/* for (k=0;k<Receive_Size_Packet;k++)
{
SendOneByte(read_buffer_add(Receive_Now_Add_Pointer+k));
} */
/* 獲得發送者IP */
Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+32);
Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+33); //獲得發送者IP
Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+34);
Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+35);
/* 獲得目標IP */
Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+36);
Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+37); //獲得目標IP
Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+38);
Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+39);
Receive_Source_Port_MSB=read_buffer_add(Receive_Now_Add_Pointer+40);
Receive_Source_Port_LSB=read_buffer_add(Receive_Now_Add_Pointer+41); //源端口
SendOneByte(Receive_Source_Port_MSB);
SendOneByte(Receive_Source_Port_LSB);
Receive_Source_Port=( ((Receive_Source_Port_MSB<<8)&0xff00)+(Receive_Source_Port_LSB&0x00ff));
Receive_Destination_MSB=read_buffer_add(Receive_Now_Add_Pointer+42);
Receive_Destination_LSB=read_buffer_add(Receive_Now_Add_Pointer+43); //目標端口
SendOneByte(Receive_Destination_MSB);
SendOneByte(Receive_Destination_LSB);
Receive_Destination=( ((Receive_Destination_MSB<<8)&0xff00)+(Receive_Destination_LSB&0x00ff));
/*讀取TCP得標志位FLAGES*/
TCP_FLAGES=read_buffer_add(Receive_Now_Add_Pointer+53);
SendOneByte(TCP_FLAGES);
/*接收發送來的序列號*/
TCP_Sequence_Number_Send[0]=read_buffer_add(Receive_Now_Add_Pointer+44);
TCP_Sequence_Number_Send[1]=read_buffer_add(Receive_Now_Add_Pointer+45);
TCP_Sequence_Number_Send[2]=read_buffer_add(Receive_Now_Add_Pointer+46);
TCP_Sequence_Number_Send[3]=read_buffer_add(Receive_Now_Add_Pointer+47);
TCP_Sequence_Number_Send[3]++;
/*接收應答的序列號*/
TCP_Sequence_Number_Receive[0]=read_buffer_add(Receive_Now_Add_Pointer+48);
TCP_Sequence_Number_Receive[1]=read_buffer_add(Receive_Now_Add_Pointer+49);
TCP_Sequence_Number_Receive[2]=read_buffer_add(Receive_Now_Add_Pointer+50);
TCP_Sequence_Number_Receive[3]=read_buffer_add(Receive_Now_Add_Pointer+51);
SendOneByte(Receive_ARP_Frame_sender_IP[0]);
SendOneByte(Receive_ARP_Frame_sender_IP[1]);
SendOneByte(Receive_ARP_Frame_sender_IP[2]);
SendOneByte(Receive_ARP_Frame_sender_IP[3]);
/*如果是目標發來*/
if((Receive_ARP_Frame_sender_IP[0]==IP_Target_add[0])
&&(Receive_ARP_Frame_sender_IP[1]==IP_Target_add[1])
&&(Receive_ARP_Frame_sender_IP[2]==IP_Target_add[2])
&&(Receive_ARP_Frame_sender_IP[3]==IP_Target_add[3])
)
{
/*如果是8080端口發到8080的發來到本機8080的數據接收*/
if( (Receive_Source_Port==TCP_Source_Port_C)
&&(Receive_Destination==TCP_Target_Port_C)
)
{
/*s是連接回復!就發送第三次握手*/
if(TCP_FLAGES==0x12)
{
Send_TCP_Establish_Connection( &MAC_Target_add,
&IP_Target_add,
&TCP_Source_Port,
&TCP_Target_Port,
&TCP_Sequence_Number_Receive,
&TCP_Sequence_Number_Send,
0x10,
&TCP_Send_Data,
8
) ;
}
}
}
}
/***********************數據處理結束*********************************************/
Receive_Now_Add_Pointer=Receive_Next_Add_Pointer;//下一個數據包地址指針重裝如
}
復制代碼
作者:
中奧ol
時間:
2015-7-30 16:44
樓主 有沒有51單片機控制ENC28J60的程序 可以發給我嗎
2691769770@qq.com
作者:
stewart_leung
時間:
2015-8-21 14:05
厲害厲害,不過我不用他,麻煩啊,不是有W5500嗎?硬件協議棧
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
又黄又爽的免费视频
|
色婷av
|
一区二区三区在线观看免费
|
在线观看的av网站
|
国产三级在线免费观看
|
日日夜夜av
|
蜜桃91丨九色丨蝌蚪91桃色
|
伊人网在线
|
一级片在线免费观看
|
四虎四虎
|
91久久久久久久久久
|
黄色片视频在线观看
|
国产成人精品一区二区
|
色婷婷色
|
国产91免费
|
国产中文在线观看
|
亚洲成人免费
|
最新av在线
|
香蕉综合网
|
涩久久
|
成人一级黄色片
|
干干干操操操
|
久久久久精
|
欧美成人综合
|
中文字幕黄色片
|
黑人精品xxx一区一二区
|
欧美日韩在线一区二区
|
国产亚洲精品成人av久久ww
|
成人在线视频观看
|
亚洲成人免费在线观看
|
亚洲高清在线视频
|
精品久久一区二区
|
黄色a一级
|
国产激情视频在线
|
国产肉体xxxx裸体784大胆
|
四虎视频在线观看
|
成人一级毛片
|
日本精品国产
|
亚洲精品久久久
|
成人免费看片视频
|
黄色三级网
|