原创 RTL8019驱动

2006-10-13 20:16 4650 7 8 分类: MCU/ 嵌入式

首先,我们要编写一个读写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中读入来.

文章评论1条评论)

登录后参与讨论

用户30174 2010-4-28 14:31

请问我下载过来.用KEIL打开.怎么遍译一下.说显示错误啊!~!~

用户166625 2009-12-21 21:08

前天刚买了块。

用户36438 2009-12-5 18:28

我也淘到了2快裸屏的,终于用我的洞洞给连接起来了,上电一试,OK,搞定了,打算做个智能电子钟。icon

用户834906 2009-9-15 18:15

请问能否将5110的LIB发给我,谢谢! wxdxhjlw@163.com qq:635415083 再次谢谢!!

chunyangjs_567602352 2009-2-5 00:33

请问能否将5110的LIB发给我,谢谢! chunyangjs@sohu.com

用户1033464 2006-11-4 23:32

很想知道您的硬件是怎么连的,想搞清楚如何模拟ISA总线。

多谢赐教!

                                            

相关推荐阅读
用户58572 2006-10-23 15:09
Gun汇编的保留字
Gun汇编的保留字不是很多书会提到的, 查找起来很不方便, 我自己整理了一下. 希望对以后有用. .ascii  “<string>”<?xml:namespace prefix =...
用户58572 2006-10-14 21:18
ARM学习笔记
1.寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位...
用户58572 2006-10-14 21:12
画中画的硬件原理
要实现画中画功能,首先得有两个前提,背景图片,动画或视频,在图片中嵌入视频信息。    先用ARM产生图片信息,用视频解码芯片解调视频信息,再用FPGA把这两路信号合成,输出到FTF LCD上显示,难...
用户58572 2006-10-14 21:03
44B0的初始化程序的理解
 44B0的初始化程序就是初始化各个关键的寄存器,建立中断向量,然后转移到主函数去执行程序。      不过44B0不支持地址映射,所以程序不COPY到RAM种执行。44B0初始化对我们广大初学者来说...
用户58572 2006-10-14 21:02
通过网络烧写39VF160步骤
通过FTP烧写FLASH是一个编程工具,提供对39VF160的编程,这个程序出售时已经烧写到ARM anywhereII的29F040中,用户拿到开发板后可以直接使用。具体内容1.电路连接:     ...
用户58572 2006-10-13 20:39
砌墙工人的命运
三个工人砌一堵墙   有人过来说:“你们在干什么?”   第一个没好气的地说:“没看见吗?砌墙。”   第二个抬头笑了笑,说:“我们在盖一幢高楼。”   第三个边干边哼着歌曲,他的笑容很灿烂开心:我们...
我要评论
1
7
关闭 站长推荐上一条 /2 下一条