//********************************************
// 网络通信子程序
// 2007.4.13
// Passion
//********************************************
#include "c8051f020.h"
#include <string.h>
#include <stdlib.h>
#include <absacc.h>
//*************************************************************************
#define H_H_Length pac_head[16]
#define L_H_Length pac_head[17]
#define H_CRC Send_Buff[24]
#define L_CRC Send_Buff[25]
#define H_Loc_Port pac_head[34]
#define L_Loc_Port pac_head[35]
#define H_Aim_Port pac_head[36]
#define L_Aim_Port pac_head[37]
#define H_UDP_Length pac_head[38]
#define L_UDP_Length pac_head[39]
#define HUDPCRC Send_Buff[40]
#define LUDPCRC Send_Buff[41]
#define reg00 XBYTE[0x8000] //reg00- 10为isa网卡接口的寄存器地址300-310;
#define reg01 XBYTE[0x8001]
#define reg02 XBYTE[0x8002]
#define reg03 XBYTE[0x8003]
#define reg04 XBYTE[0x8004]
#define reg05 XBYTE[0x8005]
#define reg06 XBYTE[0x8006]
#define reg07 XBYTE[0x8007]
#define reg08 XBYTE[0x8008]
#define reg09 XBYTE[0x8009]
#define reg0a XBYTE[0x800a]
#define reg0b XBYTE[0x800b]
#define reg0c XBYTE[0x800c]
#define reg0d XBYTE[0x800d]
#define reg0e XBYTE[0x800e]
#define reg0f XBYTE[0x800f]
#define reg10 XBYTE[0x8010]
#define Reset_Low P5 &= ~(0x4); // P52
#define Reset_High P5 |= 0x4; // P52
//**********************************************************************
void UDP_Send(void); //UDP协议发送处理
void UDP_Recv(void);
void page_select(unsigned char pagenumber); //RTL8019页选择函数
void read_mac_add(void); //RTL8019网卡MAC读取函数
void Reset_8019(void); //RTL8019复位函数
void RTL8019_init(void); //RTL8019初始化函数
bit RTL8019_receive(void); //RTL8019接收函数
void PORT_Init (void); //C8051F020端口初始化
void write_mac_add(void); //写网卡物理地址
void SYSCLK_Init (void); //外部时钟初始化
void RTL8019_send(void); //RTL8019发送函数
void ARP_Request(); //ARP请求处理
//void ARP_Answer(void);
void RARP(void); //ARP应答处理
bit ARP_Process(void); //ARP请求包处理
bit IP_Process(void); //IP包处理
bit UDP_Process(void); //UDP包处理
bit WRQ_Process(void); //WRQ包处理
bit DATA_Process(void); //DATA包处理
bit OVER_Process(void); //OVER包处理
void ACK_Send(unsigned int count); //ACK包发送
void Pag_TimeOut(void); //数据包接收超时
void Config_Timmer(void); //定时器配置函数
unsigned int CRC_Process(unsigned char LEN,unsigned char mov,unsigned char type); //校验位生成函数
//***********************************************************************
unsigned int kk;
unsigned int Protocol;
unsigned int Pag_Head; //包头寄存器
unsigned int Loc_Port; //源端口
unsigned int Aim_Port; //目的端口
unsigned int Package=0; //块寄存器
unsigned int Count_Pag=1; //块计数器
unsigned int H_Package=0; //总数据块数
unsigned int ms=0; //毫秒计时
unsigned char s=0; //秒计时
unsigned char min=0; //分计时
unsigned char xdata Send_Buff[558]={0x00}; //发送缓存
unsigned char Receive_Buff[68]={0x00}; //接收缓存
unsigned char bnry;
unsigned char curr;
unsigned char A_m_a[6]={0x00}; //目的物理地址
unsigned char A_IP_add[4]={0x00}; //目的IP地址
unsigned char hard_add[6]={0x00,0x01,0x02,0x03,0x04,0x05}; //网卡物理地址
unsigned char IP_add[4]={0x0a,0x05,0x84,0xd9}; //网卡IP地址
unsigned char xdata UDP_F_Head[12]={0x00}; //UDP伪头
unsigned char xdata DATA_Buff[512]={0x00}; //接收数据缓存
unsigned char xdata pac_head[42]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,
0x08,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x11,
0x00,0x00,0x0a,0x05,0x84,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00}; //UDP数据包
//***********************************************************************
void main(void)
{
unsigned char i;
WDTCN = 0xDE; // Disable watchdog timer
WDTCN = 0xAD;
EMI0CF =0x24;
SYSCLK_Init ();
PORT_Init();
RTL8019_init();
for(i=0;i<6;i++)
hard_add[i]=i;
while(1)
{
//P2=0x00;
//if(ms>5)
//Pag_TimeOut();
//if(s>1)
//Request_TimeOut();
//if(min>=1)
//OFF_TimeOut();
RTL8019_receive(); //接收一个数据包
Protocol=Receive_Buff[16];
Protocol=Protocol<<8;
Protocol+=Receive_Buff[17]; //取出协议类型
if(Protocol!=0x0806&&Protocol!=0x0800)
continue; //既不是ARP包也不是IP包则丢弃
else if(Protocol==0x0806) //若为ARP包
ARP_Process(); //ARP包处理函数
else
IP_Process(); //IP报处理函数
}
}
//*********************************************************************
bit ARP_Process(void)
{
unsigned char i;
for(i=42;i<46;i++)
{
if(Receive_Buff[i]!=IP_add[i-42]) //是否与本地IP地址相符
return 0;
}
for(i=0;i<6;i++)
A_m_a[i]=Receive_Buff[i+10]; //取出客户机物理地址
for(i=0;i<4;i++)
A_IP_add[i]=Receive_Buff[i+32]; //取出客户机IP地址
if(Receive_Buff[25]==0x01) //是否为ARP请求
RARP(); //应答
return 1;
}
//*********************************************************************
bit IP_Process(void)
{
unsigned char i;
for(i=0;i<6;i++)
{
if(Receive_Buff[4+i]!=hard_add[i])
return 0;
}
if(Receive_Buff[27]!=0x11) //上层协议是否为UDP
return 0;
else
{
for(i=0;i<6;i++)
A_m_a[i]=Receive_Buff[i+10]; //取出客户机物理地址
for(i=0;i<4;i++)
A_IP_add[i]=Receive_Buff[i+30]; //取出客户机IP地址
UDP_Process(); //UDP报处理函数
return 1;
}
}
//*********************************************************************
bit UDP_Process(void)
{
unsigned int Pag_Head;
Aim_Port=Receive_Buff[38];
Aim_Port<<=8;
Aim_Port+=Receive_Buff[39]; //取出源端口装入目的端口寄存器
Loc_Port=Receive_Buff[40];
Loc_Port<<=8;
Loc_Port+=Receive_Buff[41]; //取出目的端口装入源端口
Pag_Head=Receive_Buff[46];
Pag_Head<<=8;
Pag_Head+=Receive_Buff[47];
if(Pag_Head>=0x0004||Pag_Head<0x0000) //检验数据包头
return 0;
else if(Pag_Head==0x0000) //如果为写请求WRQ
{
s=0;
ms=0;
WRQ_Process(); //WRQ报处理函数
return 1;
}
else if(Pag_Head==