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的工作原理比较简单,主要思路就是单片机接收用户键盘输入的字符存入命令缓冲区,并回显到屏幕,当用户按下回车键,触发软件状态机状态变迁,从输入态转移到命令解释态,然后根据用户命令调用相关子程序执行相应操作,执行完毕后重新回到输入态。
- 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的寄存器,网卡停止运行,因为还没有初始化。