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

📄 rtl8019as._c

📁 AVR以太网开发板中的几个例子。文件中定义了网卡芯片的IP地址,默认值是192.168.0.99。
💻 _C
字号:
#include "main.h"
#include "rtl8019as.h"
#include "arp.h"
#include "ip.h"
#include "icmp.h"
#include "udp.h"

unsigned int count;//需要读或写的字节数
unsigned char tempmac_d5;
unsigned char tempmac_d4;
unsigned char tempmac_d3;
unsigned char tempmac_d2;
unsigned char tempmac_d1;
unsigned char tempmac_d0;

extern unsigned char tempip_d3;
extern unsigned char tempip_d2;
extern unsigned char tempip_d1;
extern unsigned char tempip_d0;
extern unsigned int ip_id;

void rtl8019_reset(void)
{
 unsigned char temp=0;
 
 RTLRST_SET;
 delay_100ms();
 RTLRST_CLR;
 delay_100ms();
 temp=reg_1f;//读网卡的复位端口
 delay_100ms();
 reg_1f=temp; //写网卡的复位端口
 delay_100ms();
}

void rtl8019_hotreset(void)
{
 unsigned char temp=0;
 
 temp=reg_1f;//读网卡的复位端口
 reg_1f=temp; //写网卡的复位端口
}

void rtl8019_page(unsigned char pagenumber)
{
 unsigned char temp;
 temp=reg_00;
 temp=temp&0x3B;          //TXP位要置为0.
 pagenumber=pagenumber<<6;
 temp=temp|pagenumber;
 reg_00=temp;
}

void rtl8019_init(void)
{
 //rtl8019_page(0); //选择页0的寄存器 
 reg_00=0x21; //选择页0的寄存器,网卡停止运行。
 reg_01=0x4d; //寄存器Pstart
 reg_02=0x80; //Pstop
 reg_03=0x4c; //BNRY
 reg_04=0x40; //TPSR
 reg_05=0xfe;   //TBCR0
 reg_06=0x00;   //TBCR1
 reg_07=0xFF; //ISR
 reg_0c=0xcc; //RCR
 reg_0d=0xe0; //TCR
 reg_0e=0xc8; //DCR 数据配置寄存器 8位数据dma 
 reg_0f=0xff; //IMR disable all interrupt 
 rtl8019_page(1); //选择页1的寄存器
 reg_07=0x4d; //CURR
 reg_08=0x00; //MAR0
 reg_09=0x41; //MAR1
 reg_0a=0x00; //MAR2
 reg_0b=0x80; //MAR3
 reg_0c=0x00; //MAR4
 reg_0d=0x00; //MAR5
 reg_0e=0x00; //MAR6
 reg_0f=0x00; //MAR7
 //rtl8019_page(0); 
 reg_00=0x22; //选择页0寄存器,网卡执行命令。 
} 

void rtl8019_writemynodeid(void)

{ 
 rtl8019_page(1);
 reg_01=mynodeid_0; //PAR0
 reg_02=mynodeid_1; //PAR1
 reg_03=mynodeid_2; //PAR2
 reg_04=mynodeid_3; //PAR3
 reg_05=mynodeid_4; //PAR4
 reg_06=mynodeid_5; //PAR5
}

unsigned char rtl_status(void)
{
 rtl8019_page(0);
 return reg_0c;
}

unsigned char rtl_isrstatus(void)
{
 unsigned char rtlisrstatus;
 rtl8019_page(0);
 rtlisrstatus=reg_07;
 reg_07=0xFF;
 return rtlisrstatus;
}

unsigned char rtl_readcurr(void)
{
 rtl8019_page(1); //选择页1的寄存器
 return reg_07;   //CURR
}


void rtl_setcurr(void)
{
 reg_00=0x21; //选择页0的寄存器,网卡停止运行,因为还没有初始化。
 reg_03=0x4c;   //bnry
 reg_00=0x22; //选择页0寄存器,网卡执行命令。
 //rtl8019_page(1); //选择页1的寄存器
 //reg_07=0x4e;   //CURR
}
 
void rtl8019_write(unsigned int addr,unsigned int count,unsigned char offset)
{
    //addr为要写入到网卡里的ram的起始地址,count为要连续写入的字节数
    unsigned int i=offset;

	rtl8019_page(0);
    reg_09=addr>>8;//address high
    reg_08=addr&0xff;//address low 
    reg_0b=count>>8; //write count high 
    reg_0a=count&0xff;//write count low 
    reg_00=0x12 ;//dma write 
    
	count+=offset;
    for(;i<count;i++)
    {
      reg_10=buffer[i];
    }
    reg_0b=0; // count high 中止DMA操作 
    reg_0a=0;// count low
    reg_00=0x22;//abort/complete dma page 0 
}

void rtl8019_read(unsigned int addr,unsigned int count)
{
  //address为网卡里的ram的起始地址,count为要连续读取的字节数
  unsigned int i=0;
   
  rtl8019_page(0);
  reg_09=addr>>8;//address high
  reg_08=addr&0xff;//address low 
  reg_0b=count>>8; //write count high 
  reg_0a=count&0xff;//write count low 
  reg_00=0x0a ;//dma read

  for(;i<count;i++)
  {
   buffer[i]=reg_10;
  }

  reg_0b=0; // count high 中止DMA操作 
  reg_0a=0;// count low
  reg_00=0x22;//abort/complete dma page 0 
}

void rtl8019_sendpack(unsigned int len,unsigned char offset)
{
  reg_00=0x21; //选择页0的寄存器,网卡停止运行
  reg_04=0x40; //TPSR
  rtl8019_write(0x4000,len,offset);
  reg_00=0x21;
  reg_04=0x40;     //TPSR
  reg_05=len&0xff; //TBCR0
  reg_06=len>>8;   //TBCR1
  reg_00=0x1E;
}

void buildpack(unsigned char mac_d5,
               unsigned char mac_d4,
			   unsigned char mac_d3,
			   unsigned char mac_d2,
			   unsigned char mac_d1,
			   unsigned char mac_d0,
			   unsigned char mac_s5,
			   unsigned char mac_s4,
			   unsigned char mac_s3,
			   unsigned char mac_s2,
			   unsigned char mac_s1,
			   unsigned char mac_s0,
			   unsigned int len)
{
 buffer[0]=mac_d5;
 buffer[1]=mac_d4;
 buffer[2]=mac_d3;
 buffer[3]=mac_d2;
 buffer[4]=mac_d1;
 buffer[5]=mac_d0;
 
 buffer[6]=mac_s5;
 buffer[7]=mac_s4;
 buffer[8]=mac_s3;
 buffer[9]=mac_s2;
 buffer[10]=mac_s1;
 buffer[11]=mac_s0;
 
 buffer[13]=len&0xFF;
 buffer[12]=len>>8;
}

void rtl_packhandle(void)
{
 unsigned int packlen=0;         //包长度
 unsigned int packtyp=0;         //包类型
 unsigned char mac_des[6];       //目的地址
 unsigned char mac_sou[6];       //源地址
 unsigned int i=0;
 
 mac_des[5]=buffer[4];
 mac_des[4]=buffer[5];
 mac_des[3]=buffer[6];
 mac_des[2]=buffer[7];
 mac_des[1]=buffer[8];
 mac_des[0]=buffer[9]; 
 
 mac_sou[5]=buffer[10];
 mac_sou[4]=buffer[11];
 mac_sou[3]=buffer[12];
 mac_sou[2]=buffer[13];
 mac_sou[1]=buffer[14];
 mac_sou[0]=buffer[15];
 
 tempmac_d5=mac_sou[5];
 tempmac_d4=mac_sou[4];
 tempmac_d3=mac_sou[3]; 
 tempmac_d2=mac_sou[2]; 
 tempmac_d1=mac_sou[1];
 tempmac_d0=mac_sou[0]; 
 
 
 if(((buffer[0]&0x01)==0))//如果数据包无效则不作处理
 {
  return;
 }
 
 packlen=buffer[3];              //获取数据长度,包括4字节校验码
 packlen<<=8;
 packlen|=buffer[2];
 packtyp=buffer[16];             //获取数据类型
 packtyp<<=8;
 packtyp|=buffer[17];
 
 switch(packtyp)
 {
  case 0x0806:                   //ARP数据包
       arp_response(&buffer[18]);
	   break;
  case 0x0800:                   //IP数据包
       switch(ip_packhandle(&buffer[18]))
	   {
	    case 1://ICMP包处理
		     buffer[4]=mac_sou[5];
			 buffer[5]=mac_sou[4];
			 buffer[6]=mac_sou[3];
			 buffer[7]=mac_sou[2];
			 buffer[8]=mac_sou[1];
			 buffer[9]=mac_sou[0];
			 
			 buffer[10]=mac_des[5];
			 buffer[11]=mac_des[4];
			 buffer[12]=mac_des[3];
			 buffer[13]=mac_des[2];
			 buffer[14]=mac_des[1];
			 buffer[15]=mac_des[0];
			 
			 rtl8019_sendpack(packlen,4);
			break;
		case 17://UDP包处理	 
		    break;
	    default:break;
	   } 
       break;
   
  default:break;			  
 }
 
 return;
}

unsigned int tsum(unsigned int *buffer,unsigned int size) //校验和的求法
{
 unsigned long cksum=0x0;
 unsigned char *tempp;
 
 if(size&0x01)
 {
  tempp=(unsigned char *)buffer;
  tempp+=size;
  size++;
  *tempp=0;
 }
 
 while(size>0) //各位求和
 {
  cksum=cksum+(*buffer++);
  size-=2;
 }
 cksum=(unsigned int)cksum+(cksum>>16);

 return(~cksum); //再取反
}

void send_ippack(unsigned int len,unsigned int packtype,unsigned char protocol)
{

  buildpack(tempmac_d5,
			tempmac_d4,
			tempmac_d3,
			tempmac_d2,
			tempmac_d1,
			tempmac_d0,
			mynodeid_0,
			mynodeid_1,
			mynodeid_2,
			mynodeid_3,
			mynodeid_4,
			mynodeid_5,
			packtype);
  ip_buildpack(&buffer[14],(len-14),ip_id,protocol,tempip_d3,tempip_d2,tempip_d1,tempip_d0);
  if(len<64){rtl8019_sendpack(64,0);}
  else rtl8019_sendpack(len,0);
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -