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

📄 rtl8019驱动 .c

📁 RTL8019的驱动
💻 C
字号:


首先,我们要编写一个读写8019寄存器的函数

 

 /*****************************************************************************************************
//函数名:uint8 readRegister(uint8 address)
//描述  :
//参数  : address-- 地址
//返回  : 寄存器的值
//其他  :
******************************************************************************************************/
uint8 readRegister(uint8 address)
{
 uint8  temp;
 uint8  addr;
 uint32 rdata;
 temp = address;
 temp &=  0x1f; //only 5 bits
/*
 addr = (~temp) ;
 IO0SET = (IO0SET & 0xff00ffff) | (temp<<16);
 IO0CLR = (IO0CLR & 0xff00ffff) | (addr<<16);*/
 addr = (~temp) & 0x1f;
 IO0SET = (IO0SET & 0xffe0ffff) | (temp<<16);
 IO0CLR = (IO0CLR & 0xffe0ffff) | (addr<<16);
 
 //IO1SET |=0x
 IO1SET |=0x00ff0000;//IOCON;
 
 //set to read
 IO0CLR |=RTL8019_R;
 IO0CLR |=RTL8019_RDY;
 //change dir to input
 IO1DIR &=0xff00ffff;//改变为输入
 //read the data
 rdata="IO1PIN";
 
 //end read
 IO0SET |=RTL8019_RDY;
 IO0SET |=RTL8019_R;
 
 //change dir to output
 IO1DIR |=0x00ff0000;
 return (uint8 )(rdata>>16);
 }

/*****************************************************************************************************
//函数名:void writeRegister(uint8 address,uint8 val)
//描述  :
//参数  :
//返回  :
//其他  :
******************************************************************************************************/
void writeRegister(uint8 address,uint8 val)
{
 uint8  temp;
 uint8  addr;
 
 
 temp = address;
 temp &=  0x1f; //only 5 bits
/*
addr = (~temp);

 IO0SET= (IO0SET & 0xff00ffff) | (temp<<16);

 IO0CLR = (IO0CLR & 0xff00ffff) | (addr<<16);*/
 addr = (~temp)& 0x1f;
 IO0SET= (IO0SET & 0xffe0ffff) | (temp<<16);
 IO0CLR = (IO0CLR & 0xffe0ffff) | (addr<<16);


 //output data
 IO1DIR |=0x00ff0000;
 //IO1SET |= val<<16;
 //IO1CLR |= (~val)<<16;
  
  addr = (~val);
  IO1SET = (IO1SET & 0xff00ffff) | (val<<16);
  
  IO1CLR= (IO1SET & 0xff00ffff) | (addr<<16); 

  
 //active write 
 IO0CLR |=RTL8019_W;
 IO0CLR |=RTL8019_RDY;
 IO0SET |=RTL8019_RDY;
 IO0SET |=RTL8019_W;
 
 IO1SET |=0x00ff0000;//IOCON;
 }

 

RTL的寄存器分为4页,可以通过设定CR(command Register)的PS1 PS0 来选择.

/*****************************************************************************************************
//函数名:void PageSelect(uint8 pageNum)
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
void PageSelect(uint8 pageNum)
{
 uint8 temp;
 
 temp = readRegister(RTL8019_CR);
 temp &= 0x3b;
 temp |=(pageNum<<6);
 writeRegister(RTL8019_CR,temp);
 } 
有了这3个函数,我们就只需要对RTL8019的寄存器进行设置就可以了.就是说,剩下的工作就是进行配置.下面有个比较典型的配置.

/*****************************************************************************************************
//函数名:void netInit(void)
//描述  :
//参数  :
//返回  :
//其他  :本程序参考过www.laogu.com ,zlg的TCP/IP,想对程序进行更深入的了解可以到他们的网站获取
********************************************************************************************************/
void netInit(void)
{
 HardWareInit();
 delayMs(200);
 writeRegister(0x1f,0x00);
 delayMs(200);
 writeRegister(0x00,0x21);//stop net card
 delayMs(200);
 
 PageSelect(0);
 writeRegister(0x0a,0x00);
 writeRegister(0x0b,0x00);
 writeRegister(0x0c,0xe0);//RCR
 writeRegister(0x0d,0xe2);//TCR

 PageSelect(0);
 writeRegister(0x01,0x4c);//PStart
 writeRegister(0x02,0x80);//PStop
 writeRegister(0x03,0x4c);//Bnry
 PageSelect(0);
 writeRegister(0x04,0x40);//TPSR
 writeRegister(0x07,0xff);//clear intrrput bit
 writeRegister(0x0f,0x11);
 //writeRegister(0x0e,0xcb);
 writeRegister(0x0e,0xc8);///8bits DMA
 PageSelect(1);
 writeRegister(0x07,0x4d);//CURR
 writeRegister(0x08,0x00);
 writeRegister(0x09,0x00);
 writeRegister(0x0a,0x00);
 writeRegister(0x0b,0x00);
 writeRegister(0x0c,0x00);
 writeRegister(0x0d,0x00);
 writeRegister(0x0e,0x00);
 writeRegister(0x0f,0x00);
 writeRegister(0x00,0x22);
 writeMAC(NetPort[0].My_Mac);
 
 PageSelect(0);
 writeRegister(0x0c,0xcc);
  ////RCR 1 1 MON PRO AM AB AR SEP 
 //bit.5 MON = 1 这只检查地址,不存入缓冲
 //bit.4 PRO = 1 所有包的目标MAC地址都接收
 //bit.3 AM  = 1 接收目标地址为组播地址
 //bit.2 AB  = 1 接收目标地址为广播地址
 //bit.1 AR  = 1 长度小于64字节的也接收
 //bit.0 SEP = 1 包有接收错误也接收
 writeRegister(0x0d,0xe0);
 writeRegister(0x00,0x22);
 //writeRegister(0x0f,0xff);//IMR
 writeRegister(0x07,0xff);
 
 }

经过这样的配置以后,连接上网络看到接收的LED在闪烁,说明已经可以接收到网络上的数据.下面要做的就是把数据从8019的ram中读入来.

⌨️ 快捷键说明

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