⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ethernet.c

📁 10m以太网卡源程序
💻 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 + -