?? net.c
字號:
//********************************************
// 網絡通信子程序
// 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==0x0001) //如果為數據塊包
{
ms=0;
DATA_Process(); //DATA報處理函數
return 1;
}
else if(Pag_Head==0x0003) //如果為完成標示OVER
{
min=0;
s=0;
ms=0;
OVER_Process(); //OVER報處理函數
return 1;
}
else
return 0;
}
//*********************************************************************
bit WRQ_Process(void)
{
s=0; //秒計數器清零
H_Package=Receive_Buff[48];
H_Package<<=8;
H_Package+=Receive_Buff[49]; //取出總數據塊數
ACK_Send(0);
return 1;
}
//*********************************************************************
bit DATA_Process(void)
{
unsigned char i;
ms=0; //毫秒計數器清零
Package=Receive_Buff[48];
Package<<=8;
Package+=Receive_Buff[49]; //取出當前塊數
if(Package!=Count_Pag)
return 0;
else
{
Count_Pag++; //計數器加一
for(i=0;i<512;i++)
DATA_Buff[i]=Receive_Buff[i+50]; //取出有效數據
ACK_Send(Package);
return 1;
}
}
//*********************************************************************
bit OVER_Process(void)
{
ms=0; //毫秒計數器清零
H_Package=Receive_Buff[48];
H_Package<<=8;
H_Package+=Receive_Buff[49]; //取出總數據塊數
return 1;
}
//*********************************************************************
void Config_Timmer(void)
{
TMOD=0x01; //定時器零工作與16位方式
TL0=0x66;
TH0=0xFC;
ET0=1; //定時器零中斷使能
EA=1; //開總中斷
TR0=1;
}
//*********************************************************************
void timmer0() interrupt 1 using 1
{
TR0=0;
TL0=0x66;
TH0=0xFC;
if(ms>=999)
{
ms=0;
if(s>=59)
{
s=0;
if(min>=59)
min=0;
else
min++;
}
else
s++;
}
else
ms++;
TR0=1;
}
//************************************************************************
void PORT_Init (void)
{
XBR0 = 0x07; // Enable SMBus, SPI0, and UART0
XBR1 = 0x00;
XBR2 = 0x44; // Enable crossbar and weak pull-ups
EMI0TC = 0x21;
P74OUT = 0xFF;
P0MDOUT = 0x15;
//P3MDOUT=0xff;
//P1MDOUT=0xff;
P2MDOUT=0xff;
}
//************************************************************************
void RTL8019_init(void)
{
unsigned char i;
unsigned char j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
Reset_8019(); //復位8019
//chip_select(); //片選
page_select(0);
reg00=0x21; //020與8019通信禁止,發送禁止,即進入停止狀態
for(i=0;i<255;i++)
for(j=0;j<255;j++);
reg0a=0x00;
reg0b=0x00; //020與8019通信字節計數器清零
reg0c=0xe0; //接受禁止
reg0d=0xe2; //發送禁止,使用CRC
reg01=0x4c; //配置接受緩存起始頁地址
reg02=0x80; //配置接收緩存結束頁地址
reg03=0x4c; //接收緩存邊界頁地址
reg04=0x40; //發送緩存起始頁地址
reg07=0xff; //清中斷標志
reg0f=0x00; //終止所有中斷
reg0e=0xc8; //8位DMA
page_select(1); //選擇第一頁
reg07=0x4d; //接收緩沖區首頁地址
reg08=0x00;
reg09=0x00;
reg10=0x00;
reg0a=0x00;
reg0b=0x00;
reg0c=0x00;
reg0d=0x00;
reg0e=0x00;
reg0f=0x00; //地址過濾位
reg00=0x22; //RTL8019工作使能
// read_mac_add(); //讀取物理地址
write_mac_add(); //寫物理地址至ram
page_select(0); //選擇第零頁
reg0c=0xcc; //接收使能
reg0d=0xe0;
reg00=0x22; //RTL8019工作使能
reg07=0xff; //清中斷位
//read_reg(reg0f,reg00,0x00,16);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -