51单片机RTL8019AS网卡驱动程序(重要有程序)
RTL8019AS使用手册(个人整理)
序言
本资料为个人整理,由于网上和书本上的关于 RTL8019AS 的资料不详细, 而且很杂、很乱,给刚刚入门以太网的新手带来很大的难度。本人在调试过程中 也遇到了许许多多的问题,借鉴于此,所以本人把自己调试过程当中所遇到的问 题和所用到的关于 RTL8019AS 的资料搜集、整理,方便日后查看,同时也给想用 RTL8019AS 接入以太网的朋友提供一些技术支持。本资料在搜集过程当中,大部 分来自网络,所以,在此我对网络上的大侠们表示谢意。
3.1 写 RAM...................................................................................................................................... 13 3.2 读 RAM...................................................................................................................................... 14 4 发送数据包..................................................................................................................................... 14 5 初始化 RTL8019AS.......................................................................................................................... 16 6 RTL8...................................................................................................... 18
RTL8019AS,RTL8029AS如何读写网卡的RAM
要接收和发送数据包都必须读写网卡的内部的16k的ram,必须通过DMA进行读和写.网卡的内部ram是一块双端口的16k字节的ram.所谓双端口就是说有两套总线连结到该ram,一套总线A是网卡控制器读/写网卡上的ram,另一套总线B是单片机读/写网卡上的ram.总线A又叫Local DMA,总线B又叫Remote DMA.上图中虚线框住的部分为Remote DMA,也就是单片机对网卡ram进行读写的总线,对8019来说就是ISA总线.没有框住的部分(左边的部分),就是Local DMA,网卡控制器对网卡ram进行读写的总线.其中的地址总线没有画出来,只画了数据总线.实际在ram的内部还有一些总线仲裁的逻辑,这里也没有画出来.所谓总线仲裁的逻辑就是为了实现两套总线都能进行对ram的读写,而不互相冲突.网卡控制器读写网卡ram(Local DMA)的优先级比单片机读写网卡ram的优先级要高.优先级要高的意思是:1.当两者都要请求控制总线时.Local DMA优先获得控制权.2.高优先级的Local DMA可以中断Remote DMA,而Remote DMA不能中断Local DMA3.在Remote DMA,也就是单片机对网卡ram读写的过程进行中可以被Local DMA 中断,Local DMA中断Remote DMA,然后进行Local DMA的数据传输,Local DMA传输完毕之后继续刚才被中断的Remote DMA,以完成Remote DMA的传输.上图中的Remote就是Remote DMA的传输,Local burst就是Local DMA的传输.图的左边是一个Remote DMA被Local DMA中断的示意图.Remote DMA是等到Local Burst完成之后才结束该次的传输.被打断多久的时间取决于FT1,FT0(是DCR配置寄存器的位)单片机的总线要比网卡的DMA总线慢很多.网卡的DMA总线大概在10Mhz,而单片机的总线大概1Mhz.所以在Remote DMA的过程中不需要特别的等待时序.但是如果使用较快的CPU,比如DSP,ARM等,可能要考虑时序问题.也就是说IOCHRDY(ISA总线的一个信号,RTL8019AS),或者TRDY(PCI总线的信号RTL8029AS) ,是需要考虑连到CPU上,或者做一定的处理.那么对于不快也不慢的AVR单片机来说,要不要接IOCHRDY?估计是要的.因为我不提供avr的上网方案,所以也没有做太多的研究.对于77E58来说可以不接IOCHRDY,因为77E58可以内部设置外部ram的存取的速度.DMA有8位和16位两种.网卡支持这两种DMA,一般我们使用8位的DMA,8位的DMA的接线比较少,同时适合单片机处理.电脑里一般使用16位DMA.有人问到在电脑里如何使用8位的DMA的问题.有些卡自动检测总线上的IOCS16B来选择总线,比如RTL8019as,我试过RTL8019as使用8位DMA在电脑里是失败的.如果真的要在电脑里使用8位的DMA,要把该引脚IOCS16B断开(可以割断),而不连到ISA总线上,这样这些网卡会自动的进行8位的操作(地址译码为10位).对于使用DM9008芯片的网卡,16位DMA传输是由SLOT引脚决定的。
51单片机上网 RTL8019AS 寄存器配置C源代码
#include <reg54.h>#include <absacc.h>#include "uip.h"sbit RESET=P4^0;typedef unsigned char uchar;typedef unsigned int uint;#define TX_PAGES 6#define NE_START_PG 0x40 //发送寄存器的首页地址#define TX_START_PG NE_START_PG#define NE_STOP_PG 0x60 //接收寄存器环的末地址+1#define RX_STOP_PG NE_STOP_PG //#define RX_START_PG NE_START_PG + TX_PAGES#define RX_CURR_PG RX_START_PG + 1//下面定义的是RTL8019AS特殊寄存器#define BASE_ADDRESS 0x8000#define CR XBYTE [BASE_ADDRESS+0x0000] //设置CR寄存器地址#define DMA_PORT XBYTE [BASE_ADDRESS+0x1000] //设置远程DMA端口#define RESET_PORT XBYTE [BASE_ADDRESS+0x1800] //设置复位端口//---------定义PAGE0-------------//定义PAGE0中的只读寄存器#define PG0_CLDA0 XBYTE [BASE_ADDRESS+0x0100]#define PG0_CLDA1 XBYTE [BASE_ADDRESS+0x0200]#define PG0_BNRY XBYTE [BASE_ADDRESS+0x0300]#define PG0_TSR XBYTE [BASE_ADDRESS+0x0400]#define PG0_NCR XBYTE [BASE_ADDRESS+0x0500]#define PG0_FIFO XBYTE [BASE_ADDRESS+0x0600]#define PG0_ISR XBYTE [BASE_ADDRESS+0x0700]#define PG0_CRDA0 XBYTE [BASE_ADDRESS+0x0800]#define PG0_CRDA1 XBYTE [BASE_ADDRESS+0x0900]#define PG0_8019D0 XBYTE [BASE_ADDRESS+0x0A00]#define PG0_8019D1 XBYTE [BASE_ADDRESS+0x0B00]#define PG0_RSR XBYTE [BASE_ADDRESS+0x0C00]#define PG0_CNTR0 XBYTE [BASE_ADDRESS+0x0D00]#define PG0_CNTR1 XBYTE [BASE_ADDRESS+0x0E00]#define PG0_CNTR2 XBYTE [BASE_ADDRESS+0x0F00]//定义PAGE0中的只写寄存器#define PG0_PSTART XBYTE [BASE_ADDRESS+0x0100]#define PG0_PSTOP XBYTE [BASE_ADDRESS+0x0200]#define PG0_BNRY XBYTE [BASE_ADDRESS+0x0300]#define PG0_TPSR XBYTE [BASE_ADDRESS+0x0400]#define PG0_TBCR0 XBYTE [BASE_ADDRESS+0x0500]#define PG0_TBCR1 XBYTE [BASE_ADDRESS+0x0600]#define PG0_ISR XBYTE [BASE_ADDRESS+0x0700]#define PG0_RSAR0 XBYTE [BASE_ADDRESS+0x0800]#define PG0_RSAR1 XBYTE [BASE_ADDRESS+0x0900]#define PG0_RBCR0 XBYTE [BASE_ADDRESS+0x0A00]#define PG0_RBCR1 XBYTE [BASE_ADDRESS+0x0B00]#define PG0_RCR XBYTE [BASE_ADDRESS+0x0C00]#define PG0_TCR XBYTE [BASE_ADDRESS+0x0D00]#define PG0_DCR XBYTE [BASE_ADDRESS+0x0E00]#define PG0_IMR XBYTE [BASE_ADDRESS+0x0F00]//定义PAGE1 读写寄存器#define PG1_PAR0 XBYTE [BASE_ADDRESS+0x0100]#define PG1_PAR1 XBYTE [BASE_ADDRESS+0x0200]#define PG1_PAR2 XBYTE [BASE_ADDRESS+0x0300]#define PG1_PAR3 XBYTE [BASE_ADDRESS+0x0400]#define PG1_PAR4 XBYTE [BASE_ADDRESS+0x0500]#define PG1_PAR5 XBYTE [BASE_ADDRESS+0x0600]#define PG1_CURR XBYTE [BASE_ADDRESS+0x0700]#define PG1_MAR0 XBYTE [BASE_ADDRESS+0x0800]#define PG1_MAR1 XBYTE [BASE_ADDRESS+0x0900]#define PG1_MAR2 XBYTE [BASE_ADDRESS+0x0A00]#define PG1_MAR3 XBYTE [BASE_ADDRESS+0x0B00]#define PG1_MAR4 XBYTE [BASE_ADDRESS+0x0C00]#define PG1_MAR5 XBYTE [BASE_ADDRESS+0x0D00]#define PG1_MAR6 XBYTE [BASE_ADDRESS+0x0E00]#define PG1_MAR7 XBYTE [BASE_ADDRESS+0x0F00]//定义PAGE2 只读寄存器#define PG2_PSTART XBYTE [BASE_ADDRESS+0x0100]#define PG2_PSTOP XBYTE [BASE_ADDRESS+0x0200]#define PG2_TPSR XBYTE [BASE_ADDRESS+0x0400]#define PG2_RCR XBYTE [BASE_ADDRESS+0x0C00]#define PG2_TCR XBYTE [BASE_ADDRESS+0x0D00]#define PG2_DCR XBYTE [BASE_ADDRESS+0x0E00]#define PG2_IMR XBYTE [BASE_ADDRESS+0x0F00]//定义PAGE3 寄存器#define PG3_9346CR XBYTE [BASE_ADDRESS+0x0100] #define PG3_CONFIG0 XBYTE [BASE_ADDRESS+0x0300] #define PG3_CONFIG1 XBYTE [BASE_ADDRESS+0x0400] #define PG3_CONFIG2 XBYTE [BASE_ADDRESS+0x0500] #define PG3_CONFIG3 XBYTE [BASE_ADDRESS+0x0600] #define PG3_CONFIG4 XBYTE [BASE_ADDRESS+0x0D00]//以下是特殊寄存器的位定义// CR寄存器#define stop_cmd 0x01 //停止接受或发送数据#define start_cmd 0x02 //启动接受或发送数据#define txp 0x04 //发送数据#define no_dma 0x00 //禁止DMA#define read_dma 0x08 //允许远程DMA读#define write_dma 0x10 //允许远程DMA写#define send_pck 0x18 //发送数据#define abort_dma 0x20 //退出/完成远程DMA#define page0 0x00 //PAGE0选择#define page1 0x40 //PAGE1选择#define page2 0x80 //PAGE2选择#define page3 0xc0 //PAGE3选择// ISR中断状态寄存器#define isr_prx 0x01 //无错误接受数据包#define isr_ptx 0x02 //无错误发送数据包#define rxe 0x04 //接受数据包带有如下错误:CRC错误、包丢失错误以及帧队列错误#define txe 0x08 //过分冲突导致传输错误#define ovw 0x10 //接受缓冲器溢出#define cnt 0x20 //当一个或多个网络计数器的MSB 设置完成时该位被设置。
RTL8019as_中文手册
存储器读命令
32
SMEMWB I
存储器写命令。用来闪存写命令解码
4.3,存储器接口管脚(包括 BROM,EEPROM)
编号
名称
类型
75
BCSB
O
76
EECS
O
66-69 , 71-74 , BA21-14 O
77-82,84-85
BD7-0 I/O
[79]
[EESK] O
[78]
[EEDI] O
[77]
发送满切斯特编码数据到 MAU。这些输出是源输出
和需要 270 欧姆的下拉电阻到地。
59,58 TPIN+ I 这对 IP 输入收到 10Mbps 的微分满切斯特编码。
TPIN-
45,46
TPOUT+ O 这是一对进位微分的 tp 传输输出。输出满切斯特编码
TPOUT-
信号有预扭曲性,以防止在双绞线媒体的 overcharge
43-36
描述
地址使能脚,ISA 信号对有效的输入输出命令 必须是低电平
中断请求总线:能够分别映射到
IRQ15,IRQ12,IRQ10,IRQ5,IRQ4,IRQ3,IRQ2/9. 唯一一条线被选择在一个时间里反映中断请 求。其他的线都是 tri-stated.RTL8019AS 仍然 用这些脚座位输入线,从而管理 ISA 总线上实 际相应的中断线上的状态。结果记录在 INTR 寄存器中,这个寄存器可用软件用来保护中断 冲突。
输入输出写指令端
ISA 总线上的高效硬件复位端。少于 800ns 的 高电平脉冲被忽略。
地址总线。SA10 用来实现 PNP 端口的完全解 码,地址为 279h 和 A79h。在 RTL8019AS 中, SA10 未被解码。SA10 以 0 作为可提供的接近 pnp 端口。 数据总线
基于RTL8019AS单片机在以太网通信中的应用
基于RTL8019AS单片机在以太网通信中的应用作者:汪文涛等来源:《科技视界》2014年第24期【摘要】近年来随着网络和嵌入式技术的不断发展,嵌入式和网络的结合已经成为最新的研究动态之一。
本文中选用嵌入式芯片C8051F020和以太网接口芯片RTL8019AS设计了一种通信接口模块,其中嵌入式芯片C8051F020中嵌入了人为处理后TCP/IP精简协议,与以太网接口芯片RTL8019AS协同工作,共同实现了以太网通信接口的功能。
实验表明,本方案具有结构简单、实现方便、实用价值高和成本低等特点。
【关键词】以太网;C8051F020;RTL8019AS;TCP/IP精简协议0 引言随着网络技术的迅速发展,网络用户呈指数增长,在使用计算机进行网络连互的同时,小至各类家电、仪器仪表设备大至工业生产过程中数据采集、控制设备都在逐步趋向网络化。
网络数据传输技术具有传输距离远、传输速率高、信息共享程度高等优点,因此对嵌入式设备增加网络功能有着深远的意义。
目前在工业控制领域底层的仪器仪表、各类传感器的参数等数据几乎都是通过现场总线的方式进行上传,但是现场总线的协议并不是统一的,故而在生产过程中带来极大的不便。
由于TCP/IP协议在行业内已有统一的标准,故而利用嵌入式芯片内嵌TCP/IP精简协议与以太网接口芯片RTL8019AS协同工作便能很好地解决这个问题。
这种方法的显著优点就是成本低、实现简单。
可以说通过以太网进行通信是工业控制领域一大趋势。
本文以远程数据传输和控制指令传输为应用背景,设计了一套基于嵌入式系统的以太网通信模块。
1 系统简介本系统采用的核心嵌入式控制芯片是C8051F020,该单片机使用美国Cygnal公司的CIP-51微控制器内核。
它采用PQFP-100的封装形式,内部集成了ADC、DAC、PCA、模拟比较器以及多种节电休眠和停机方式,工作频率高达25MHz。
以太网接口芯片是采用采用RealTek公司生产的RTL8019AS,它符合EthernetII与IEEE802.3标准;全双工,收发可同时进行,内置16KB的SRAM,用于收发缓冲,降低了对处理器的速度要求;支持8/16位的数据总线;采用了100脚PQFP封装。
Linux下8019网卡驱动程序
Linux下8019网卡驱动程序福建鑫诺通信有限公司陈光平(chenggp_fj@)本文以S3C44B0的CPU为例,详细解析了linux下RTL8019网卡驱动程序工作原理,其间知识大多来源互联网络,特别是浙大潘纲的论文,在此不一一列出,此文目的只是让嵌入式linux爱好者得到更多网卡驱动的资料,并获得交流机会,不足之处请指正(一)、硬件相关部份1、CPU与网卡的连接方式(s3c44B0 CPU) (RTL 8019网卡)CPU与网卡接线图上图为S3c44b0CPU和网卡的接线图,此接法并非固定,如接法不同,则牵涉到很多相应的改动,下面会详细分析不同之处从硬件部门得到:网卡在CPU的存储空间上接BANK4,即0x08000000(看44B0手册)外部中断号为:EXTINT3 (irqs.h文件获得值为22)上面两个值可以查CPU手册,或询问硬件设计人员由上图可以知道以下数据:(1)、网卡与CPU地址线连接错开8位(A0接A8)(2)、总共连线,其实4根就足够用了,因为每根线可以译码4个地址空间,总共是16个地址空间,每个地址空间对应一个寄存器地址,而8019总共就是16个寄存器(3)、一般是跳线模式,不使用9346芯片1-1 基地址算法首先8019的基地址是300H(见RTL8019芯片资料:选择IO总线地址),但是有些硬件已在芯片中做过了偏移,比如我们的网卡已做了处理,基址已偏移到0x08000000,那么因为网卡A0接CPU的A8,表示基地址左移8位,下一个寄存器reg0的地址就是:0x08000100(0000,0000,0001 0001,0000,0000)还不理解的话我们看另一种接法:(S3C44B0 CPU ) (RTL8019芯片) 这种接法地址线只错开一位,我们来看(假如仍使用BANK4):A1 A0,为何A0不能接A0,因为8019是共用数据线和地址线的,如果A0接A0的话,无法配置8位和16位方式现在可以看到,基地址为300H 的话,左移一位(A0->A1),就是600H,于是算出基地址为: 0x08000600,下一个寄存器的地址就是0x08000602,因为都左移一位,相当于x2了2、8019网卡的工作原理本节主要讨论一下8019是怎么工作的,如下图:(本地DMA ) (远端DMA )(图2 与DMA 有关的寄存器 )2-1 远端DMA 和本地DMA首先解释一下远端DMA 和本地DMA 的区别,以发送为例,网络发送数据是下面这样一个流程:CPU 将数据先发送到网卡上的16KRAM 中,这之间必须要有一个数据通道,我们称为远端DMA ,而数据从网卡的RAM 中发出给链路,RTL8019控制器与RAM 之间的通道称为本地DMA2-2 CPU 读写数据到网络芯片先解释一下上面提到的几个重要的寄存器,我们从上面分阶段说明:RBCR0,RBCR1:存放要读写数据的长度RSAR0,RSAR1:存放数据到网络芯片(RAM)中存放的起始地址(而不是页号,但通常还是以某页的00为开始,如0x4000)CR:向命令寄存器发出Remote DMA开始指令上面的流程后面会详细解说2-3 网络芯片发数据到以太网CPU把数据用Remote DMA发到网络芯片之后,就可以用让网络芯片用Local DMA向外数据了,需要设置如下的控制器:TPSR:网络芯片要发送的数据在网络芯片RAM中的起始页号,所以发送的数据只能从某页的开头存放。
以太网控制芯片RTL8019AS详细配置
以太网控制芯片RTL8019AS 详细配置苏锦秀,杨庆江,张广璐(黑龙江科技学院 黑龙江哈尔滨 150027)摘 要:R TL8019AS 是目前实现设备接入以太网普遍采用的一种接口控制芯片,在实际应用中最重要的就是对芯片的配置。
为了使广大工程技术人员能够更好地应用该芯片,对R TL8019AS 工作在不同方式下的配置做了详细的说明解释,并总结了在应用中芯片工作在不同方式下的优缺点。
关键词:R TL8019AS ;跳线方式;非跳线方式;工作方式中图分类号:TP368.4 文献标识码:B 文章编号:10042373X (2007)222151203The Detailed Conf iguration of Ethernet Controlling Chip RT L8019ASSU Jinxiu ,YAN G Qingjiang ,ZHAN G Guanglu(Heilongjiang Institute of Science and Technology ,Harbin ,150027,China )Abstract :R TL8019AS is a kind of interface controlling chip which the equipments access to Ethernet in current.In the practical application ,the most important is the chip ′s configuration.In order to enable the general engineers and technicians u 2sing this chip better ,the article gives detailed configuration showing to the R TL8019AS which working under different styles.And summarizes the chip ′s strongpoint and shortcoming working in the different styles in the application.The article enables the general engineers and technicians understand the the chip ′s configuration better ,and provides certain instruction in prac 2tice.K eywords :R TL8019AS ;jumper ;jumperless ;working style收稿日期:2007204223 以太网控制芯片R TL8019AS 以其优良的性能、低兼的价格,在市场上10Mb/s 网卡中占有相当的比例。
为uCOS51增加Shell界面
为uCOS51增加Shell界面巨龙公司系统集成开发部杨屹asdjf@2002/10/13引言自从发表《uCOS51移植心得》以来,我收到了很多朋友们的来信,大家对公开源码表示鼓励,谢谢大家的支持!很多人对于编写自己的操作系统很感兴趣,uCOS51是个不错的选择。
它的优点是简单易懂,学习成本低,有利于向32位CPU过渡。
目前,嵌入式BBS 上的热点是:嵌入式实时多任务操作系统、单片机上网、32bitCPU(如ARM等)。
其实通过uCOS51学习完全可以掌握这些热门技术的精髓,而且学习成本低廉。
为此我会陆续将我在研发过程中的经验体会写出来与大家交流,共同进步。
我准备讨论以下内容:uCOS51高效内核、OS人机界面SHELL的编写、51机开发板的硬件设计、RTL8019AS网卡驱动程序、51TCP/IP协议栈设计、应用协议FTP、PPP、HTTP、SMTP、SNMP……在51上的实现技术、51OS任务划分和应用程序实例、由51软件系统向ARM的移植以及其他想到的题目。
欢迎大家积极参与。
注:开发板原理图、PCB图、GAL烧录文件、芯片手册、全部源程序可以来信索取,在整理好后会共享在网上。
讨论2----OS人机界面SHELL的编写uCOSII只提供了操作系统内核,用户要自己添加文件处理、人机界面、网络接口等重要部分。
其中Shell(人机界面)提供了人与机器交互的界面,是机器服务于人的体现,是系统必不可少的重要组成部分。
现代的很多OS如UNIX、DOS、VxWorks都提供了友好的命令行界面。
Windows更是提供了GUI。
大部分人认识OS都是从这里开始的。
uCOS51同样拥有Shell,它是我从以前写的前后台程序中移植过来的。
命令行Shell的工作原理比较简单,主要思路就是单片机接收用户键盘输入的字符存入命令缓冲区,并回显到屏幕,当用户按下回车键,触发软件状态机状态变迁,从输入态转移到命令解释态,然后根据用户命令调用相关子程序执行相应操作,执行完毕后重新回到输入态。
用51单片机控制RTL8019AS实现以太网通讯
用51单片机控制RTL8019AS实现以太网通讯用51单片机控制RTL8019AS实现以太网通讯摘要:介绍以太网的帧协议和以太网控制芯片RTL8019AS的结构特性;介绍51单片机控制RTL8019AS实现以太网通讯的硬件设计方案;采用C51语言实现ARP协议(地址解析协议),并进行了系统的调试与验证。
关键词:RTL8019ASEthernet51单片机TCP/IP协议互联网络硬件、软件的迅猛发展,使得网络用户呈指数增长,在使用计算机进行网络互联的同时,各种家电设备、仪器仪表以及工业生产中的数据采集与控制设备在逐步地走向网络化,以便共享网络中庞大的信息资源。
在电子设备日趋网络化的背景下,利用廉价的51单片机来控制RTL8019AS实现以太网通讯具有十分重要的意义。
1以太网(Ethernet)协议一个标准的以太网物理传输帧由七部分组成(如表1所示,单位:字节)。
表1以太网的物理传输帧结构表PRSDDASATYPEDATAFCS同步位分隔位目的地址源地址类型字段数据段帧校验序列7166246~15004除了数据段的长度不定外,其他部分的长度固定不变。
数据段为46~1500字节。
以太网规定整个传输包的最大长度不能超过1514字节(14字节为DA、SA、TYPE),最小不能小于60字节。
除去DA、SA、TYPE14字节,还必须传输46字节的数据,当数据段的数据不足46字节时需填充,填充字符的个数不包括在长度字段里;超过1500字节时,需拆成多个帧传送。
事实上,发送数据时,PR、SD、FCS及填充字段这几个数据段由以太网控制器自动产生;而接收数据时,PR、SD被跳过,控制器一旦检测到有效的前序字段(即PR、SD),就认为接收数据开始。
2RTL8019AS以太网控制器简介由台湾Realtek公司生产的RTL8019AS以太网控制器,由于其优良的性能、低兼的价格,使其在市场上10Mbps网卡中占有相当的比例。
详解uIP TCPIP协议栈在51单片机上的设计实现
详解uIP TCPIP协议栈在51单片机上的设计实现一引言随着信息技术的不断发展,以及人们对日常生活舒适度、方便度要求的提高,信息家电、智能仪表等产品越来越频繁的出现在我们的生活当中;人们也越来越热衷于把家电、仪表等设备连接到Internet 中,从而可以方便、及时的对它们进行远程察看、远程控制。
把这些设备接入Internet ,就需要考虑TCP/IP 网络协议的实现。
51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。
该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。
目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。
51单片机是基础入门的一个单片机,还是应用最广泛的一种。
需要注意的是52系列的单片机一般不具备自编程能力。
本文将简要描述uIP的实现方法,分析uIP协议栈的应用接口,并讨论如何将其应用到51系列单片机上。
二uIP协议栈的实现方法简述uIP协议栈主要提供了三个函数供系统底层调用。
即uip_init(),uip_input()和uip_periodic()。
其与应用程序的主要接口是UIP_APPCALL()。
ip_init()是系统初始化时调用的,主要初始化协议栈的侦听端口和默认所有连接是封闭的。
当网卡驱动收到一个输进包时,将放进全局缓冲区uip_buf中,包的大小由全局变量uip_len约束。
同时将调用uip_input ()函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序。
当uip_input ()返回时,一个输出包同样放在全局缓冲区uip_buf里,大小赋给uip_len.假如uip_len是0,则说明没有包要发送。
否则调用底层系统的发包函数将包发送到网络上。
51单片机上网RLT8019 AS C文件源代码
本代码为10Mbit RTL8019网卡C文件完整代码,配置方式为跳线方式,适合51系列单片机,经多次使用,性能稳定,学习51单片机上网的网友可直接下载使用,#include "eth.h"#define TIME0_TH0 0xce#define TIME0_TL0 0x41// Packet transmit & receive buffer configuration#define ETH_TX_PAGE_START 0x40 // 0x4000 Tx buffer is 6 * 256 = 1536 bytes#define ETH_RX_PAGE_START 0x4c // 0x4600 Rx buffer is 26 * 256 = 6656 bytes#define ETH_RX_PAGE_STOP 0x60 // 0x6000#define ETH_MIN_PACKET_LEN 0x3Cstatic void etherdev_reg_write(unsigned char reg, unsigned char wr_data);static unsigned char etherdev_reg_read(unsigned char reg);static void etherdev_delay_ms(unsigned int count);static unsigned int etherdev_poll(void);void Delay1(uchar x);//static void etherdev_timer0_isr(void) interrupt 1 using 1;// Manipulate PS1 & PS0 in CR to select RTL8019AS register page.void page(uchar pagenumber){ uchar data temp;temp=CR; //读入命令寄存器的值。
基于51单片机网卡驱动程序
基于单片机网卡驱动程序时间我的网管板使用了网卡芯片接入以太网。
选它的好处是:兼容,软件移植性好;接口简单不用转换芯片如桥;价格便宜$片(我的购入价为元片);带宽充裕(针对);较长一段时间内不会停产。
有种配置模式:跳线方式、即插即用方式、串行配置方式。
为了节省成本,我去掉了而使用作为闪盘存储地址和其他可配置信息。
模式用在机中,这里用不上。
只剩下跳线配置模式可用,它的电路设计参考提供的板图纸。
一天时间就可以完成,相对来说硬件设计比较简单。
与这部分硬件相对应的软件是网卡驱动。
所谓驱动程序是指一组子程序,它们屏蔽了底层硬件处理细节,同时向上层软件提供硬件无关接口。
驱动程序可以写成子程序嵌入到应用程序里(如下的端口操作和),也可以放在动态链接库里,用到的时候再动态调入以便节省内存。
在中,为了使、、三种模式的应用程序共存,提出了虚拟机的概念,在的配合下,系统工作在保护模式,接管了、中断、内存访问,应用程序不能直接访问硬件。
这样提高了系统可靠性和兼容性,也带来了软件编程复杂的问题。
任何网卡驱动都要按或模式编写,对于硬件一侧要处理虚拟机操作、总线协议(如、)、即插即用、电源管理;上层软件一侧要实现规范。
因此在下实现网卡驱动是一件相当复杂的事情。
我这里说的驱动程序特指实模式下的一组硬件芯片驱动子程序。
从程序员的角度看,工作流程非常简单,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,会自动把数据包转换成物理帧格式在物理信道上传输。
反之,收到物理信号后将其还原成数据,按指定格式存放在芯片中以便主机程序取用。
简言之就是完成数据包和电信号之间的相互转换:数据包<>电信号。
以太网协议由芯片硬件自动完成,对程序员透明。
驱动程序有种功能:芯片初始化、收包、发包。
以太网协议不止一种,我用的是。
它的帧结构如图所示。
物理信道上的收发操作均使用这个帧格式。
其中,前导序列、帧起始位、校验由硬件自动添加删除,与上层软件无关。
51单片机RTL8019AS网卡驱动程序(重要有程序)
51单片机RTL8019AS网卡驱动程序时间:2006-09-05 来源: 作者: 点击:3863 字体大小:【大中小】我的SNMP网管板使用了RTL8019AS 10M ISA网卡芯片接入以太网。
选它的好处是:NE2000兼容,软件移植性好;接口简单不用转换芯片如PCI-ISA 桥;价格便宜2.1$/片(我的购入价为22元RMB/片);带宽充裕(针对51);较长一段时间内不会停产。
8019有3种配置模式:跳线方式、即插即用P&P方式、串行Flash配置方式。
为了节省成本,我去掉了9346而使用X5045作为闪盘存储MAC地址和其他可配置信息。
P&P模式用在PC机中,这里用不上。
只剩下跳线配置模式可用,它的电路设计参考REALTEK提供的DEMO板图纸。
一天时间就可以完成,相对来说硬件设计比较简单。
与这部分硬件相对应的软件是网卡驱动。
所谓驱动程序是指一组子程序,它们屏蔽了底层硬件处理细节,同时向上层软件提供硬件无关接口。
驱动程序可以写成子程序嵌入到应用程序里(如DOS下的I/O端口操作和ISR),也可以放在动态链接库里,用到的时候再动态调入以便节省内存。
在WIN98中,为了使V86、WIN16、WIN32三种模式的应用程序共存,提出了虚拟机的概念,在CPU的配合下,系统工作在保护模式,OS接管了I/O、中断、内存访问,应用程序不能直接访问硬件。
这样提高了系统可靠性和兼容性,也带来了软件编程复杂的问题。
任何网卡驱动都要按VXD或WDM模式编写,对于硬件一侧要处理虚拟机操作、总线协议(如ISA、PCI)、即插即用、电源管理;上层软件一侧要实现NDIS规范。
因此在WIN98下实现网卡驱动是一件相当复杂的事情。
我这里说的驱动程序特指实模式下的一组硬件芯片驱动子程序。
从程序员的角度看,8019工作流程非常简单,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,8019会自动把数据包转换成物理帧格式在物理信道上传输。
基于RTL8019AS的单片机网络通信接口设计
基于RTL8019AS的单片机网络通信接口设计作者:吴全玉陈杰来源:《现代电子技术》2008年第22期摘要:网络数据传输技术具有传输速率高、传送距离远、通讯协议完善、信息共享程度高等优点,为嵌入式设备增加网络功能有着深远的意义。
介绍以太网的帧协议和以太网控制芯片RTL8019AS的结构特性以及工作原理,设计STC89C54RD+单片机控制RTL8019AS实现以太网通讯的硬件设计方案和软件流程图;采用标准C语言实现ARP协议,所有程序在Keilc51环境下编译连接。
最后并进行系统的调试与验证,取得了满意的效果。
关键词:以太网;RTL8019AS;网络数据传输技术;TCP/IP协议中图分类号:TP393文献标识码:B文章编号:1004373X(2008)2204703Design of Single Chip Computer Network Communication Interface Based on RTL8019ASWU Quanyu,CHEN Jie(West Anhui University,Lu′an,237012,China)Abstract:The data transmission of net has many virtues,such as high transmission speed and perfect communication protocol.It is important that the embedded devices have communicated with Ethernet.The frame of Ethernet protocol and the Ethernet microcontroller TL8019AS characteristics are presented,the principle diagram of hardware system that STC89C54RD+ single chip computer controlling RTL8019AS is designed,and the diagram of software is given.ARP protocol based on the standard C language is realized in the paper,and it is succeeded to compile and link them in keil c51 environment.Finally,the system debugging and the experiment results are also given,the result is satisfied.Keywords:Ethernet;RTL8019AS;network data transmission technology;TCP/IP protocol1 引言网络技术的飞速发展促使嵌入式设备的数据传输方式发生重大变化,如今嵌入式设备网络化已成为嵌入式技术发展的一个重要方向。
开发指南---51单片机+RTL8019上网编程指南
18H--1FH 共 8 个地址,为复位端口。对该端口偶数地址的读,或者写入任何数,都引起网卡的复位。 1.6. 跟复位有关的标志位: 其中的第 7 位 RST 跟复位有关。
3
网卡执行正确的复位之后该位为 1。在 linux 或 windows 的驱动程序中,一般在复位之后检查该标志位以确认是 否正确复位,特别是在即插即用的检测过程中。对于我们用单片机控制网卡来说,我们可以不检查该标志位,因为如 果复位不正常的情况通常是网卡坏了。 1.7. 寄存器:
main() 4
{ delaymsecond(10);//延时大约 1 秒,保证电源稳定和网卡自身的上电完成。 netcardreset();//复位网卡的子程序 。。。。 } 下面介绍网卡的复位子程序: #define reg1f XBYTE[0xdf00] //网卡的复位端口的地址,对应于网卡的地址 25FH。 #define uint unsigned int //uint 代表 unsigned int ,作者一般使用缩写 uint #define uchar unsigned char //uchar 代表 unsigned char,我比较懒,不愿意多写 sbit reset=p3^4; //单片机的 p3.4 脚连接到网卡的 RSTDRV 复位引脚 void netcardreset() { uint data i; uchar data temp; reset=1; //使网卡的 RSTDRV 引脚变成高电平,网卡是高电平复位的。 for(i=0;i<250;i++);//延时程序,至少需要 reset=0; //使网卡的 RSTDRV 引脚变成低电平,网卡上电复位完毕 for(i=0;i<250;i++); temp=reg1f;//读网卡的复位端口 reg1f=temp; //写网卡的复位端口 for(i=0;i<250;i++); } 上面所讲的实际上是网卡复位的两种情况, reset=1;reset=0 相当于冷复位 temp=reg1f;reg1f=temp 相当于热复位 对网卡的复位端口的读或写将复位网卡,网卡内部将执行复位过程。读写是随意的,写入任意的数都将复位网卡 。 实际上只要使用冷复位就可以了,热复位程序可以不要。热复位主要在电脑里有用,冷复位就像电脑的冷启动, 热复位相当于电脑的热启动。 --作者的复位网卡的过程是简化了的,一个电脑里的复位过程是比较复杂的,如果你有网卡驱动的 UNIX,LINUX 程序的源代码,它的代码将会做一些判断和检查,检查网卡是否存在,和是否工作正常,和是否存在地址和中断冲突 。 但在我们的这个系统里可以省去这些,我们认为网卡的地址和 I/O 是没有冲突和正常工作的。当然如果读者愿意,也 可以写一些检查代码。 1.9. 网卡初始化
51RTL8019网络传输整个系统详解ARPUDPTCPIP数据传
TCP/IP协议栈与数据包封装TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层。
如下图所示(该图出自)。
图36.1. TCP/IP协议栈两台计算机通过TCP/IP协议通讯的过程如下所示(该图出自)。
图36.2. TCP/IP通讯过程传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示(该图出自)。
图36.3. TCP/IP数据包的封装不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
上图对应两台计算机在同一网段中的情况,如果两台计算机在不同的网段中,那么数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器,如下图所示(该图出自)。
图36.4. 跨路由器通讯过程其实在链路层之下还有物理层,指的是电信号的传递方式,比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤等都属于物理层的概念。
物理层的能力决定了最大传输速率、传输距离、抗干扰性等。
集线器(Hub)是工作在物理层的网络设备,用于双绞线的连接和信号中继(将已衰减的信号再次放大使之传得更远)。
链路层有以太网、令牌环网等标准,链路层负责网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。
网卡驱动程序使用说明
警告,请选是
由于无徽标测试,弹出警告窗口,请选仍然继续
系统显示正在安装
安装中
文件语言未考虑,请选是
系统在将rtl8139.sys文件复制到windows\system32\driver目录中
步骤10.完成安装,安装成功,单击完成按钮。网卡可以正常使用。
步骤10
至此完成网卡驱动程序的安转。
4.2
步骤1.打开我的电脑右键菜单选择属性,在系统属性中选择硬件页,
步骤1
步骤2.左键单击设备管理器
步骤2
步骤3.打开右键菜单属性
步骤3
步骤4.选择驱动程序页
步骤4
卸载完成后设备管理器里就看不到该设备了。
1.2
说明:
a.程序名称:realtek8139网卡(及其兼容网卡)小端口驱动程序;
b.本项目的任务开发者:上海交通大学02级计算机网络课程第十项目小组
c.用户:我们开发团队自身及有兴趣了解我们项目的广大师生。
1.3
a.《DDK Refrence CN》abstracted from MSDN
b.DDK examples from DDK2000,Microsoft
c.内存:64MB以上;
3.2
a.操作系统:Microsoft的Windows系列;
b.程序语言:Visual C++6.0;
c.其它:WinDDK 2000;
4
本程序原文件编译后生成一个*.sys文件一个和*.inf文件一个。
现命名为rtl8139.sys和netRTL8139.inf,其中netRTL8139.inf文件名可任取,而rtl8139.sys文件名与.inf文件直接关联。
步骤5.
C51单片机模块驱动程序参考
0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46
};定义在函数外部
unsigned char Key_ASC2(unsigned char key)
{
unsigned char key_asc2;
{
StartI2C();
Write8Bit(0xA2);
ChackAck();
Write8Bit(RomAddress);
ChackAck();
StartI2C();
Write8Bit(0xA3);
ChackAck();
for(;bytes!=1;bytes--)
{
*RamAddress=Read8Bit();
i=*ptr;
i &=பைடு நூலகம்0x80;
if(i==0)
break;
}
}
函数功能描述:向1602指令寄存器写指令;
void WriteW(uint a)
{
ptr=0xAFF0;//RS=0,R/W=0
*ptr=a;
}
函数功能描述:LCD初始化;
void LCD_Init(void)
{
CheckBF();
WriteW(0x38);
函数功能描述:键盘初始化,将标志位置1;
void Key_Init(void)
{
bKeyUp_Flag=1;//标志(全局变量)位置1
}
函数功能描述:键盘扫描函数,得到键的行列位置;
unsigned char GetScanKey(void)
{
unsigned char key, i, temp;
VxWorks5.5RTL81X9网卡驱动
VxWorks5.5RTL81X9网卡驱动VxWorks Torando2.2 RTL81X9网卡驱动添加过程Step 1.下载RTL81X9驱动源代码。
Step 2.复制一个BSP包,并且修改名称,例如,我复制了一个PC486的BSP包,改名为i486bsp,如图所示:Step 3.修改复制的BSP里面的Makefile文件,修改文件内容的如下:TARGET_DIR = i486bspMACH_EXTRA =rtl81x9.o ;添加rtl81x9.o到系统中Step 4.复制RTL81X9的驱动代码rtl81x9.h、rtl81x9.c、sysRtl81x9End.c文件到你的bsp包中。
Step 5.修改BSP包中的Config.h文件。
在文件如下部分添加黄色标记的内容#define INCLUDE_PCI/* Network driver options */#define INCLUDE_END /* Enhanced Network Driver Support */#undef INCLUDE_DEC21X40_END /* (END) DEC 21x4x PCI interface */#undef INCLUDE_EL_3C90X_END /* (END) 3Com Fast EtherLink XL PCI */#undef INCLUDE_ELT_3C509_END /* (END) 3Com EtherLink III interface */#undef INCLUDE_ENE_END /* (END) Eagle/Novell NE2000 interface */ #undef INCLUDE_FEI_END /* (END) Intel 8255[7/8/9] PCI interface */ #undef INCLUDE_GEI8254X_END /* (END) Intel82543/82544 PCI interface */ #undef INCLUDE_LN_97X_END /* (END) AMD 79C97x PCI interface */#undef INCLUDE_ULTRA_END /* (END) SMC Elite16 Ultra interface */#define INCLUDE_RTL_81X9_ENDStep 6.修改ConfigNet.h文件,在文件如下部分添加黄色标记的部分添加:/* Intel 82543/82544 PCI (gei) driver defines */#ifdef INCLUDE_GEI8254X_END#define GEI8254X_LOAD_FUNC sysGei8254xEndLoad#define GEI8254X_BUFF_LOAN TRUE#define GEI8254X_LOAD_STR ""IMPORT END_OBJ * GEI8254X_LOAD_FUNC (char *, void *);#endif /* INCLUDE_GEI8254X_END */#ifdef INCLUDE_RTL_81X9_END#define RTL_81X9_LOAD_FUNC sysRtl81x9EndLoad#define RTL_81X9_LOAD_LOAN TRUE#define RTL_81X9_LOAD_STRING ""IMPORT END_OBJ * RTL_81X9_LOAD_FUNC (char *, void *);#endif /* INCLUDE_RTL_81X9_END */END_TBL_ENTRY endDevTbl [] ={#ifdef INCLUDE_EL_3C90X_END{0, EL_3C90X_LOAD_FUNC, EL_3C90X_LOAD_STR, EL_3C90X_BUFF_LOAN,NULL, FALSE},#endif /* INCLUDE_EL_3C90X_END */#ifdef INCLUDE_LN_97X_END{0, LN_97X_LOAD_FUNC, LN_97X_LOAD_STR,NULL, FALSE},#endif /* INCLUDE_LN_97X_END */#ifdef INCLUDE_FEI_END{0, FEI82557_LOAD_FUNC, FEI82557_LOAD_STRING, FEI82557_BUFF_LOAN,NULL, FALSE},#endif /* INCLUDE_FEI_END */#ifdef INCLUDE_DEC21X40_END{0, END_DC_LOAD_FUNC, END_DC_LOAD_STRING, END_DC_BUFF_LOAN,NULL, FALSE},#endif /* INCLUDE_DEC21X40_END */#ifdef INCLUDE_ELT_3C509_END{0, END_3C509_LOAD_FUNC, END_3C509_LOAD_STRING, END_3C509_BUFF_LOAN,NULL, FALSE},#endif /* INCLUDE_ELT_3C509_END */#ifdef INCLUDE_ULTRA_END{0, END_ULTRA_LOAD_FUNC, END_ULTRA_LOAD_STRING, END_ULTRA_BUFF_LOAN,NULL, FALSE},#endif /* INCLUDE_ULTRA_END */#ifdef INCLUDE_ENE_END{0, END_ENE_LOAD_FUNC, END_ENE_LOAD_STRING, END_ENE_BUFF_LOAN,NULL, FALSE},#endif /* INCLUDE_ENE_END */#ifdef INCLUDE_GEI8254X_END{0, GEI8254X_LOAD_FUNC, GEI8254X_LOAD_STR,NULL, FALSE},#endif /* INCLUDE_GEI8254X_END */#ifdef INCLUDE_RTL_81X9_END{0, RTL_81X9_LOAD_FUNC, RTL_81X9_LOAD_STRING, RTL_81X9_LOAD_LOAN,NULL, FALSE},#endif /* INCLUDE_RTL_81X9_END */{0, END_TBL_END, NULL, 0, NULL, FALSE}};Step 7.最后,修改sysLib.c文件,在文件中如下部分中添加黄色标示的部分:/* imports */IMPORT char end; /* linker defined end-of-image */ IMPORT GDT sysGdt[]; /* the global descriptor table */ IMPORT void elcdetach (int unit);IMPORT VOIDFUNCPTR intEoiGet; /* BOI/EOI function pointer */ IMPORT void intEnt (void);IMPORT int sysCpuProbe (void); /* set a type of CPU family */ IMPORT VOID sysUsbOhciPciInit (void); /* USB OHCI Init */ /* include rtl81x9End driver support routines */#ifdef INCLUDE_RTL_81X9_ENDIMPORT STATUS sysRtl81x9PciInit (void);#endif /* INCLUDE_RTL_81X9_END */#ifdef INCLUDE_PCI /* BSP PCI bus & config support */# include "pciCfgStub.c" /* customize pciConfigLib for BSP */ # include "pci/pciConfigLib.c"# include "pciCfgIntStub.c" /* customize pciIntLib for BSP */ # include "pci/pciIntLib.c"# if (defined(INCLUDE_PCI_CFGSHOW) && !defined(PRJ_BUILD))# include "pci/pciConfigShow.c"# endif /* (defined(INCLUDE_PCI_CFGSHOW) && !defined(PRJ_BUILD)) */#if (PCI_CFG_TYPE == PCI_CFG_AUTO)# include "pci/pciAutoConfigLib.c"# include "sysBusPci.c"#endif /* (PCI_CFG_TYPE == PCI_CFG_AUTO) */#endif /* INCLUDE_PCI */#ifdef INCLUDE_PCMCIA# include "pcmcia/pccardLib.c"# include "pcmcia/pccardShow.c"#endif /* INCLUDE_PCMCIA */#ifdef INCLUDE_NETWORK# include "sysNet.c" /* network driver support */#endif /* INCLUDE_NETWORK */#ifdef INCLUDE_RTL_81X9_END#include "sysRtl81x9End.c"#endif /* INCLUDE_RTL_81X9_END */#ifdef INCLUDE_PCIpciConfigLibInit (PCI_MECHANISM_1, PCI_CONFIG_ADDR, PCI_CONFIG_DATA, NONE); sysPciIntInit (); /* it does pciIntLibInit() */#ifdef INCLUDE_RTL_81X9_ENDsysRtl81x9PciInit ();#endif /* INCLUDE_RTL_81X9_END */#endif /* INCLUDE_PCI *//* initialize the PIC (Programmable Interrupt Controller) */sysIntInitPIC (); /* should be after the PCI init for IOAPIC */intEoiGet = sysIntEoiGet; /* function pointer used in intConnect () */ /* initialize PCI devices */#ifdef INCLUDE_PCI到此,RTL81X9的驱动程序就添加到你的BSP中去了。
应用RTL8019AS的嵌入式设备网络化软件实现
应用RTL8019AS的嵌入式设备网络化软件实现冯翠丽【摘要】嵌入式设备的网络化是当前研究的一个热点问题,其实现方式可以用微处理器直接驱动网卡芯片来接入Internet.详细分析了嵌入式系统中微处理器驱动RTL8019AS的设计思路,提出了一种实现方法,给出了总的程序流程图和关键函数的实现流程图,并作了测试试验.试验结果表明,该方法是可行的.【期刊名称】《长江大学学报(自然版)理工卷》【年(卷),期】2009(006)002【总页数】4页(P87-90)【关键词】嵌入式网络;驱动程序;RTL8019AS【作者】冯翠丽【作者单位】长江大学计算机科学学院,湖北,荆州,434023【正文语种】中文【中图分类】TP393嵌入式设备的网络化已是大势所趋[1~3],且嵌入式设备网络化有很多方案[4,5],其中最直接的方式就是采用微处理器直接驱动网卡芯片来实现[5,6]。
对于目前大量存在的嵌入式设备来说,选择这种方案有成本低的优势[6]。
然而,采用该方案的一个关键问题就是要研究驱动程序的设计思路和方法。
为此,笔者结合嵌入式Web服务器,给出了一种实现方法,为嵌入式设备低成本接入Internet打下了良好的基础。
RTL8019AS驱动设计原理图如图1所示。
RTL8019AS的内部有一个双端口的RAM[7](图1的“RTL8019AS片内RAM区”),该RAM和2条数据总线进行交互,它与内部总线(图1中“RTL8019AS内部总线”)的交互被称为Local DMA 通道,而与外部数据总线的交互被称为Remote DMA通道。
Local DMA完成RTL8019AS(以下简称“芯片”)与网络的数据交换,而Remote DMA负责芯片与微处理器的数据交换。
从应用程序的角度来看[5,8],当网络上有数据来临时,芯片会自动启动Local DMA写,来完成一系列操作:将收到物理信号还原成数据并过滤(不符合要求的数据包将被拒收)、将数据按照一定的格式存入事先设置好的接收缓存中、设置与接收数据相关的寄存器、产生中断等等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机RTL8019AS网卡驱动程序时间:2006-09-05 来源: 作者: 点击:3863 字体大小:【大中小】我的SNMP网管板使用了RTL8019AS 10M ISA网卡芯片接入以太网。
选它的好处是:NE2000兼容,软件移植性好;接口简单不用转换芯片如PCI-ISA 桥;价格便宜2.1$/片(我的购入价为22元RMB/片);带宽充裕(针对51);较长一段时间内不会停产。
8019有3种配置模式:跳线方式、即插即用P&P方式、串行Flash配置方式。
为了节省成本,我去掉了9346而使用X5045作为闪盘存储MAC地址和其他可配置信息。
P&P模式用在PC机中,这里用不上。
只剩下跳线配置模式可用,它的电路设计参考REALTEK提供的DEMO板图纸。
一天时间就可以完成,相对来说硬件设计比较简单。
与这部分硬件相对应的软件是网卡驱动。
所谓驱动程序是指一组子程序,它们屏蔽了底层硬件处理细节,同时向上层软件提供硬件无关接口。
驱动程序可以写成子程序嵌入到应用程序里(如DOS下的I/O端口操作和ISR),也可以放在动态链接库里,用到的时候再动态调入以便节省内存。
在WIN98中,为了使V86、WIN16、WIN32三种模式的应用程序共存,提出了虚拟机的概念,在CPU的配合下,系统工作在保护模式,OS接管了I/O、中断、内存访问,应用程序不能直接访问硬件。
这样提高了系统可靠性和兼容性,也带来了软件编程复杂的问题。
任何网卡驱动都要按VXD或WDM模式编写,对于硬件一侧要处理虚拟机操作、总线协议(如ISA、PCI)、即插即用、电源管理;上层软件一侧要实现NDIS规范。
因此在WIN98下实现网卡驱动是一件相当复杂的事情。
我这里说的驱动程序特指实模式下的一组硬件芯片驱动子程序。
从程序员的角度看,8019工作流程非常简单,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,8019会自动把数据包转换成物理帧格式在物理信道上传输。
反之,8019收到物理信号后将其还原成数据,按指定格式存放在芯片RA M中以便主机程序取用。
简言之就是8019完成数据包和电信号之间的相互转换:数据包<===>电信号。
以太网协议由芯片硬件自动完成,对程序员透明。
驱动程序有3种功能:芯片初始化、收包、发包。
以太网协议不止一种,我用的是802.3。
它的帧结构如图1所示。
物理信道上的收发操作均使用这个帧格式。
其中,前导序列、帧起始位、CRC校验由硬件自动添加/删除,与上层软件无关。
值得注意的是,收到的数据包格式并不是8 02.3帧的真子集,而是如图2所示。
明显地,8019自动添加了“接收状态、下一页指针、以太网帧长度(以字节为单位)”三个数据成员(共4字节)。
这些数据成员的引入方便了驱动程序的设计,体现了软硬件互相配合协同工作的设计思路。
当然,发送数据包的格式是802.3帧的真子集,如图3所示。
有了收发包的格式,如何发送和接收数据包呢?如图4所示,先将待发送的数据包存入芯片RAM,给出发送缓冲区首地址和数据包长度(写入TPSR、TBC R0,1),启动发送命令(CR=0x3E)即可实现8019发送功能。
8019会自动按以太网协议完成发送并将结果写入状态寄存器。
如图5所示,接收缓冲区构成一个循环FIFO队列,PSTART、PSTOP两个寄存器限定了循环队列的开始和结束页,CURR为写入指针,受芯片控制,BNRY为读出指针,由主机程序控制。
根据C URR==BNRY+1?可以判断是否收到新的数据包,新收到的数据包按图2格式存于以CURR指出的地址为首址的RAM中。
当CURR==BNRY时芯片停止接收数据包。
如果做过FPGA设计,用过VHDL,可以想象到硬件芯片的工作原理。
此处,设计2个8bit寄存器和一个2输入比较器,当收到数据包时,接收状态机根据当前状态和比较器结果决定下一个状态,如果CURR=BNRY,进入停收状态;反之,CURR按模增1。
8019数据手册没有给出硬件状态机实现方法,说明也很简略,往往要通过作实验的方法推理出工作过程。
比如,ISR寄存器不只和中断有关,当接收缓冲溢出时,如果不清ISR(写入FFH),芯片将一直停止接收。
在流量较大时溢出经常发生,此时不清ISR,就会导致网卡芯片死机。
明白了发送和接收数据包的原理,那么数据包又是怎样被主机写入芯片RAM 和从芯片RAM读出的呢?如图6所示,主机设置好远端DMA开始地址(RSAR 0,1)和远端DMA数据字节数(RBCR0,1),并在CR中设置读/写,就可以从远端DMA口寄存器里读出芯片RAM里的数据/把数据写入芯片RAM。
何谓本地/远端DMA呢?如图7所示,“远端”指CPU接口侧;“本地”指8019的硬件收发电路侧。
没有更深的意思,与远近无关,仅仅为了区分主机和芯片硬件两个接口端。
这里的DMA与平时所说的DMA有点不同。
RTL8019AS的loc al DMA操作是由控制器本身完成的,而其remote DMA并不是在无主处理器的参与下,数据能自动移到主处理器的内存中。
remote DMA指主机CPU给出起址和长度就可以读写芯片RAM,每操作一次RAM地址自动加1。
而普通RAM 操作每次要先发地址再处理数据,速度较慢。
在一些高档通信控制器上自带有MAC控制器,工作原理与8019的差不多,比如:Motorola 68360/MPC860T内部的CPM带有以太网处理器,通过设置B D表,使软件和硬件协同工作,它的缓冲区更大且可灵活配置。
这些通信控制器的设计,体现了软硬件互相融合协同工作的趋势:软件硬化(VHDL),硬件软化(D SP),希望大家关注!如图7所示,8019以太网控制器以存储器(16K双口RAM)为核心,本地和远端控制器并发操作。
这种体系结构满足了数据带宽的需要。
8019拥有控制、状态、数据寄存器,通过它们,51单片机可以与8019通信。
由于51资源紧张,在实现TCPIP协议栈时不要进行内存块拷贝,建议(1)使用全局结构体变量,在内存中只保存一个数据包拷贝,其他没有来得及处理的包保存在8019的16K RAM里;(2)使用查询方式而不用中断;(3)客户服务器模型中服务器工作于串行方式,并发模式不适合51单片机。
芯片内部地址空间的分配如图8所示,其中0x00-0x0B(工作于8位DMA模式)用于存放本节点MAC地址,奇偶地址内容是重复放置的。
如:MAC地址0 000 1234 5678存放在0x00-0x0B中为000000001212343456567878,单地址和双地址的内容是重复的.一般使用偶数地址的内容,这主要是为了同时适应8位和16位的dma。
Prom内容是网卡在上电复位的时候从93C46里读出来的。
如果你没有使用93C46,就不要使用Prom,那么使用了93C46后如何获得网卡的地址呢?有两种方法,一是直接读93C46,二是读Prom。
网卡MAC地址既不由93C46也不由Prom决定,而是由PAR0-PAR5寄存器决定。
Prom只保存上电时从9346中读出的MAC地址(如果有93C46的话),仅此而矣。
网卡MAC地址不是随便定义的,它的组成结构如图9所示。
以太网的地址为48位,由ieee统一分配给网卡制造商,每个网卡的地址都必须是全球唯一的。
共6个字节的长度。
FF:FF:FF:FF:FF:FF为广播地址,只能用在目的地址段,不能作为源地址段。
目的地址为广播地址的数据包,可以被一个局域网内的所有网卡接收到。
合法的以太网地址第32位组播标志必须为0。
例如:X0:XX:XX:XX:XX:XXX2:XX:XX:XX:XX:XXX4:XX:XX:XX:XX:XXX6:XX:XX:XX:XX:XXX8:XX:XX:XX:XX:XXXA:XX:XX:XX:XX:XXXC:XX:XX:XX:XX:XXXE:XX:XX:XX:XX:XX为合法以太网地址。
上面的X代表0-F中的任一个。
地址X1:XX:XX:XX:XX:XXX3:XX:XX:XX:XX:XXX5:XX:XX:XX:XX:XXX7:XX:XX:XX:XX:XXX9:XX:XX:XX:XX:XXXB:XX:XX:XX:XX:XXXD:XX:XX:XX:XX:XXXF:XX:XX:XX:XX:XX为组播地址,只能作为目的地址,不能作为源地址。
组播地址可以被支持该组播地址的一组网卡接收到。
组播地址主要用在视频广播,远程唤醒(通过发一个特殊的数据包使网卡产生一个中断信号,启动电脑),游戏(多个人在局域网里联机打游戏)里等。
以下是一些具体的组播地址:地址范围01:00:5E:00:00:00---01:00:5E:7F:FF:FF 用于ip地址的组播,其他组播地址跟tcp/ip无关,不做介绍。
网卡可以接收以下3种地址的数据包:第一种目的地址跟自己的网卡地址是一样的数据包;第二种目的地址为FF:FF:FF:FF:FF:FF广播地址的数据包;第三种目的地址为跟自己的组播地址范围相同的数据包。
在以太网的应用当中,如果你希望你的数据包只发给一个网卡,目的地址用对方的网卡地址;如果你想把数据包发给所有的网卡,目的地址用广播地址;如果你想把数据包发给一组网卡,目的地址用组播地址。
其他用到的寄存器:CR---命令寄存器TSR---发送状态寄存器ISR---中断状态寄存器RSR---接收状态寄存器RCR---接收配置寄存器TCR---发送配置寄存器DCR---数据配置寄存器IMR---中断屏蔽寄存器NCR---包发送期间碰撞次数FIFO---环回检测后,查看FIFO内容CNTR0---帧同步错总计数器CNTR1---CRC错总计数器CNTR2---丢包总计数器PAR0-5---本节点MAC地址MAR0-7---多播地址匹配建议:将图形中寄存器名称标注上页号和地址偏移(如:BNRY 0页0x03),打印出此图,看图编程,直观且不容易出错。
备注:收缓冲区、发缓冲区、数据存储区在16K双口RAM里的安排由用户自行决定,只要不引起冲突即可,以下源程序代码实现的只是其中的一种分配方案。
部分源程序清单:struct ethernet{unsigned char status; //接收状态unsigned char nextpage; //下一个页unsigned int length; //以太网长度,以字节为单位unsigned int destnodeid[3]; //目的网卡地址unsigned int sourcenodeid[3]; //源网卡地址unsigned int protocal; //下一层协议unsigned char packet[1500]; //包的内容};void ne2000init()//ne2000网卡初始化{rtl8019as_rst();reg00=0x21; //选择页0的寄存器,网卡停止运行,因为还没有初始化。