基于51单片机RTL8019AS的网卡驱动程序
网卡MAC地址不是随便定义的,它的组成结构如图9所示。以太网的地址为48位,由ieee统一分配给网卡制造商,每个网卡的地址都必须是全球唯一的。共6个字节的长度。FF:FF:FF:FF:FF:FF为广播地址,只能用在目的地址段,不能作为源地址段。目的地址为广播地址的数据包,可以被一个局域网内的所有网卡接收到。合法的以太网地址第32位组播标志必须为0。例如:本文引用地址:https://www.eepw.com.cn/article/172229.htm
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; //下一层协议
unsigned char packet[1500]; //包的内容
};
void ne2000init()//ne2000网卡初始化
{
rtl8019as_rst();
reg00=0x21; //选择页0的寄存器,网卡停止运行,因为还没有初始化。
delay_ms(10); //延时10毫秒,确保芯片进入停止模式
//使芯片处于mon和loopback模式,跟外部网络断开
评论