📄 ethernet.c
字号:
#include <reg52.h>
#include <absacc.h>
typedef unsigned char byte;
typedef unsigned int word;
sfr T2MOD=0xc9;
sfr SCON1=0xc0;
#define XTALL 11.0592
#define sum_hign (*(byte xdata*) 0x8000)//双口RAM存储数据总数的高字节
#define sum_low (*(byte xdata*) 0x8001)//双口RAM存储数据总数的低字节
#define send_buf ((byte xdata*) 0x8002)//数据头缓冲区起始地址
#define data_buf ((byte xdata*) 0x802c)//数据接收缓冲区起始地址
#define flag_num (*(byte xdata*) 0x87ff)//读完双口RAM写入标志字节区
#define ask_num (*(byte xdata*) 0xa000)//DRAM申请缓冲区
#define state_temp XBYTE[0x0007]//ISR状态
#define RTL8019PORT 0x0000
#define NIC_CHIP_ADR RTL8019PORT
#define nic_outp(p,c) XBYTE[NIC_CHIP_ADR+p]=c
#define nic_inp(p) XBYTE[p+NIC_CHIP_ADR]
//页0
#define NIC_CR_REG 0x00
#define NIC_PSTART_REG 0x01
#define NIC_PSTOP_REG 0x02
#define NIC_BNRY_REG 0x03
#define NIC_TPSR_REG 0x04
#define NIC_TBCR0_REG 0x05
#define NIC_TBCR1_REG 0x06
#define NIC_ISR_REG 0x07
#define NIC_RSAR0_REG 0x08
#define NIC_RSAR1_REG 0x09
#define NIC_RBCR0_REG 0x0a
#define NIC_RBCR1_REG 0x0b
#define NIC_RCR_REG 0x0c
#define NIC_TCR_REG 0x0d
#define NIC_DCR_REG 0x0e
#define NIC_IMR_REG 0x0f
#define NIC_DATA_REG 0x10
#define NIC_RST_REG 0x1f
//页1
#define NIC_PAR0_REG 0x01
#define NIC_CURR_REG 0x07
#define NIC_MAR0_REG 0x08
idata byte HOST_IP[4],HOST_MAC[6],INTENT_IP[4],INTENT_MAC[6],TITLE[2],OFFSET[2],TTL,rsr_num;
idata byte HOST_PORT[2],UDP_LENGTH[2],UDP_CRC,INTENT_PORT[2],test_num,currp,bnryp,sp_state;
idata byte receive_sum;
idata word length,pack_sum,rxd_sum,sent_sum;//pack_sum表示封装字节总数
sbit RST_PIN=P3^4;//rtl8019as复位引脚
sbit test_pin=P1^0;
bit begin_flag,allow_flag,arp_flag,udp_flag,send_flag,succed_flag;
bit rxd_flag,read_flag,recfin_flag;
///////////////////////////////////////////////////////
void delay(byte p){//延时子程序
while(p)
p--;
}
void serial_isr() interrupt 4 using 1{//串行通信测试
byte receive_num;
RI=0;
receive_num=SBUF;
switch(sp_state){
case 0: if(receive_num==0xaa)//数据头判断
sp_state=0x01;
else if(receive_num==0xbb)
sp_state=0x05;
else if(receive_num==0xcc)
sp_state=0x07;
else sp_state=0x00;
break;
case 1: if(receive_num==0xff){//测试数据
sp_state=0x02;
}
else{
sp_state=0x00;
}
break;
case 2: sum_hign=receive_num;//求测试数据总数高字节
sp_state=0x03;
break;
case 3: sum_low=receive_num;//低字节
if((sum_hign>=7)&&(sum_low>0xd4)){
sp_state=0x00;
}
else{
sp_state=0x04;
}
break;
case 4: if(rxd_sum<(sum_hign*256+sum_low)){//数据
*(data_buf+rxd_sum)=receive_num;
rxd_sum++;
}
if(rxd_sum==(sum_hign*256+sum_low)){//数据接收完毕
send_flag=1;
sp_state=0x00;
}
break;
case 5: if(receive_num==0xee)//指定本网卡物理地址
sp_state=0x06;
else sp_state=0x00;
break;
case 6: //HOST_MAC[receive_sum]=receive_num;//求本网卡物理地址
nic_outp(NIC_CR_REG,0x61);//页1
delay(10);
nic_outp(NIC_PAR0_REG+receive_sum,receive_num); // 改写物理地址
HOST_MAC[receive_sum]=nic_inp(NIC_PAR0_REG+receive_sum);
nic_outp(NIC_CR_REG,0x22);//页0正常工作
receive_sum++;
if(receive_sum==0x06){
sp_state=0x00;
receive_sum=0x00;
}
break;
case 7: if(receive_num==0xdd)//指定本网卡IP地址
sp_state=0x08;
else sp_state=0x00;
case 8: HOST_IP[receive_sum]=receive_num;//求本网卡IP地址
receive_sum++;
if(receive_sum==0x04){
sp_state=0x00;
receive_sum=0x00;
}
break;
default: break;
}
}
void send_data(void){//发送字节
byte test_num;
word u;
for(u=0;u<rxd_sum;u++){
test_num=*(send_buf+u);
SBUF=test_num;
while(TI==0);
TI=0;
}
}
void pack_udp(void){//封装数据
word i;
//首先封装以太网头
for(i=0;i<6;i++){//目的物理地址
*(send_buf+i)=INTENT_MAC[i];
}
for(i=0;i<6;i++){//送源物理地址值
*(send_buf+6+i)=HOST_MAC[i];//送数据到远程端口
}
*(send_buf+12)=0x08;//数据类型
*(send_buf+13)=0x00;
//封装IP头
*(send_buf+14)=0x45;//版本号和头长度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -