微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于51单片机RTL8019AS的网卡驱动程序

基于51单片机RTL8019AS的网卡驱动程序

时间:01-20 来源:互联网 点击:

te DMA指主机CPU给出起址和长度就可以读写芯片RAM,每操作一次RAM地址自动加1。而普通RAM操作每次要先发地址再处理数据,速度较慢。

在一些高档通信控制器上自带有MAC控制器,工作原理与8019的差不多,比如:Motorola 68360/MPC860T内部的CPM带有以太网处理器,通过设置BD表,使软件和硬件协同工作,它的缓冲区更大且可灵活配置。这些通信控制器的设计,体现了软硬件互相融合协同工作的趋势:软件硬化(VHDL),硬件软化(DSP),希望大家关注!

如图7所示,8019以太网控制器以存储器(16K双口RAM)为核心,本地和远端控制器并发操作。这种体系结构满足了数据带宽的需要。8019拥有控制、状态、数据寄存器,通过它们,51单片机可以与8019通信。由于51资源紧张,在实现TCPIP协议栈时不要进行内存块拷贝,建议(1)使用全局结构体变量,在内存中只保存一个数据包拷贝,其他没有来得及处理的包保存在8019的16K RAM里;(2)使用查询方式而不用中断;(3)客户服务器模型中服务器工作于串行方式,并发模式不适合51单片机。

芯片内部地址空间的分配如图8所示,其中0x00-0x0B(工作于8位DMA模式)用于存放本节点MAC地址,奇偶地址内容是重复放置的。如:MAC地址0000 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:XX

X2:XX:XX:XX:XX:XX

X4:XX:XX:XX:XX:XX

X6:XX:XX:XX:XX:XX

X8:XX:XX:XX:XX:XX

XA:XX:XX:XX:XX:XX

XC:XX:XX:XX:XX:XX

XE:XX:XX:XX:XX:XX

为合法以太网地址。上面的X代表0-F中的任一个。

地址

X1:XX:XX:XX:XX:XX

X3:XX:XX:XX:XX:XX

X5:XX:XX:XX:XX:XX

X7:XX:XX:XX:XX:XX

X9:XX:XX:XX:XX:XX

XB:XX:XX:XX:XX:XX

XD:XX:XX:XX:XX:XX

XF: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; //下一

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top