单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx

上传人:b****5 文档编号:20440330 上传时间:2023-01-23 格式:DOCX 页数:12 大小:223.35KB
下载 相关 举报
单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx_第1页
第1页 / 共12页
单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx_第2页
第2页 / 共12页
单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx_第3页
第3页 / 共12页
单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx_第4页
第4页 / 共12页
单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx

《单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx》由会员分享,可在线阅读,更多相关《单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx(12页珍藏版)》请在冰豆网上搜索。

单片机驱动DM9000网卡芯片详细调试过程下Word格式.docx

函数写好,保存文件,连接硬件,连接网线到电脑上或局域网上,运行结果如下图所示:

图4显示寄存器值

这里首先检查,各个控制寄存器是否是自己写进去的值,在检查状态寄存器是否正确,其中主要要

看NSR寄存器的bit[6]是否为“1”,该位表示是否连接成功。

本例中NSR的值为40H,括号里的数为对应

的十进制数。

下面我们将主函数改进一下,增加个中断接收函数,查看是否能接收到数据。

/********************************************************************************/

/*这一部分要根据自己的处理器情况,将DM9000的INT引脚连接到处理器的外部中断上,打开中断*/

sendpacket(60);

/*我事先已经在Buffer[]中存储了ARP请求数据包,这里就直接发送了,以便接收

ARP应答包。

大家可以先参考后面讲的ARP协议,根据自己机器的情况,将数据事先存到Buffer[]中*/

while

(1);

//等待中断

voidint_issue(void)//中断处理函数,需要根据自己的处理器进行设置

i=receivepacket(Buffer);

//将数据读取到Buffer中。

int_again:

if(i==0)

{

return;

}

else

print_buffer();

//将接收到的所有数据打印出来

//停止在这里等待观察,注意:

实际应用中是不允许停止在中断中的。

/************************************************************************************/

/*这里加上这一段,目的是判断中断期间是否接收到其它数据包。

有则加以处理。

不加也完全可以*/

/*根据自己的处理器,判断处理器是否还处在中断状态,若是则进行如下操作,不是则跳过该段。

*/

if(i!

=0)

gotoint_again;

编译调试,运行结果如下:

图5接收数据包中的数据

这是一个ARP应答包,包含了我电脑上的MAC地址和局域网内的IP地址。

反正我也不是啥重要人物,

这里就不保密了,呵呵。

如果一些顺利,到这里对DM9000网卡芯片的初始化工作就完成了。

如果出现问题,首先要

检查寄存器的值是否正确。

可以将DM9000中的寄存器打印出来,查看到底是哪里的问题。

如果打印出的

值很混乱,在确保串口程序无误的前提下,查看硬件连接,以及寄存器读写时序是否正确,重复调试几

次查找原因。

三、ARP协议的实现

1、ARP协议原理简述

ARP协议(AddressResolutionProtocol地址解析协议),在局域网中,网络中实际传输的是“

帧”,帧里面有目标主机的MAC地址。

在以太网中,一个注意要和另一个主机进行直接通信,必须要知

道目标主机的MAC地址。

这个MAC地址就是标识我们的网卡芯片唯一性的地址。

但这个目标MAC地址是如

何获得的呢?

这就用到了我们这里讲到的地址解析协议。

所有“地址解析”,就是主机在发送帧前将目

标IP地址转换成MAC地址的过程。

ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC

地址,以保证通信的顺利进行。

所以在第一次通信前,我们知道目标机的IP地址,想要获知目标机的

MAC地址,就要发送ARP报文(即ARP数据包)。

它的传输过程简单的说就是:

我知道目标机的IP地址,

那么我就向网络中所有的机器发送一个ARP请求,请求中有目标机的IP地址,请求的意思是目标机要是

收到了此请求,就把你的MAC地址告诉我。

如果目标机不存在,那么此请求自然不会有人回应。

若目标

机接收到了此请求,它就会发送一个ARP应答,这个应答是明确发给请求者的,应答中有MAC地址。

我接

到了这个应答,我就知道了目标机的MAC地址,就可以进行以后的通信了。

因为每次通信都要用到MAC地

址。

ARP报文被封装在以太网帧头部中传输,如图为ARP请求报文的头部格式。

图6用于以太网的ARP请求或应答分组格式

注意,以太网的传输存储是“大端格式”,即先发送高字节后发送低字节。

例如,两个字节的数据

,先发送高8位后发送低8位。

所以接收数据的时候要注意存储顺序。

整个报文分成两部分,以太网首部和ARP请求/应答。

下面挑重点讲述。

“以太网目的地址”字段:

若是发送ARP请求,应填写广播类型的MAC地址FF-FF-FF-FF-FF-FF,意思是

让网络上的所有机器接收到;

“帧类型”字段:

填写08-06表示次报文是ARP协议;

“硬件类型”字段:

填写00-01表示以太网地址,即MAC地址;

“协议类型”字段:

填写08-00表示IP,即通过IP地址查询MAC地址;

“硬件地址长度”字段:

MAC地址长度为6(以字节为单位);

“协议地址长度”字段:

IP地址长度为4(以字节为单位);

“操作类型”字段:

ARP数据包类型,1表示ARP请求,2表示ARP应答;

“目的以太网地址”字段:

若是发送ARP请求,这里是需要目标机填充的。

2、ARP的处理程序

ARP协议原理很简单,下面我们来编写ARP协议的处理函数。

新建文件命名为arp.c,填写如下函数

unsignedcharmac_addr[6]={*,*,*,*,*,*};

unsignedcharip_addr[4]={192,168,*,*};

unsignedcharhost_ip_addr[4]={192,168,*,*};

unsignedcharhost_mac_addr[6]={0xff,0xff,0xff,0xff,0xff,0xff};

unsignedcharBuffer[1000];

uint16packet_len;

/*这些全局变量,在前面将的文件中有些已经有过定义,这里要注意在前面加上“extern”关键字。

*”应该根据自己的机器修改*/

#defineHON(n)((((uint16)((n)&

0xff))<

<

8)|(((n)&

0xff00)>

>

8))

/*此宏定义是将小端格式存储的字(两个字节)转换成大端格式存储*/

voidarp_request(void)//发送ARP请求数据包

//以太网首部

memcpy(ARPBUF->

ethhdr.d_mac,host_mac_addr,6);

/*字符串拷贝函数,文件要包含<

string.h>

头文件。

参数依次是,拷贝目标指针,拷贝数据源指针,拷

贝字符数*/

ethhdr.s_mac,mac_addr,6);

ARPBUF->

ethhdr.type=HON(0x0806);

/*小端格式的编译器,可以用HON()宏来转换成大端格式,如果你的编译器是大端格式,直接填写

0x0806即可*/

/*就是简单的按照协议格式填充,以下同*/

//ARP首部

hwtype=HON

(1);

protocol=HON(0x0800);

hwlen=6;

protolen=4;

opcode=HON

(1);

smac,mac_addr,6);

sipaddr,ip_addr,4);

dipaddr,host_ip_addr,4);

packet_len=42;

//14+28=42

sendpacket(Buffer,packet_len);

注释:

ARPBUF的宏定义和ARP首部结构,在前面已经讲过。

同时注意执行该函数时中断的处理。

这里没

作处理。

看上去很easy吧,下面函数实现接收ARP请求或接收ARP应答的处理。

unsignedchararp_process(void)//ARP接收函数,成功返回1,否则返回0

//简单判断ARP数据包有无损坏,有损坏则丢弃,不予处理

if(packet_len<

28)//ARP数据长度为28字节为无效数据

return0;

switch(HON(ARPBUF->

opcode))

case1 

:

//处理ARP请求

if(ARPBUF->

dipaddr[0]==ip_addr[0]&

&

ARPBUF->

dipaddr[1]==ip_addr[1]&

dipaddr[2]==ip_addr[2]&

dipaddr[3]==ip_addr[3])//判断是否是自己的IP,是否向自己询问MAC地址

{

opcode=HON

(2);

//设置为ARP应答

memcpy(ARPBUF->

dmac,ARPBUF->

smac,6);

ethhdr.d_mac,ARPBUF->

dipaddr,ARPBUF->

sipaddr,4);

packet_len=42;

sendpacket(Buffer,packet_len);

//发送ARP数据包

return1;

else

return0;

break;

case2 

//处理ARP应答

dipaddr[3]==ip_addr[3])//再次判断IP,是否是给自己的应答

memcpy(host_mac_addr,ARPBUF->

//保存服务器MAC地址

default 

//不是ARP协议

根据ARP协议格式看这两个函数并不困难。

于是我们又得到两个函数:

arp_request()和

arp_process()。

3、ARP程序调试

下面我们修改主函数和中断处理函数。

将mian()函数中的“sendpacket(60);

”语句换成“arp_request();

”语句。

i=arp_process();

if(i==1)//判断是否是ARP协议

print_hostmacaddr();

//打印目标机的MAC地址,就是用串口打印host_mac_addr[]中的6

个字节

保存运行调试。

图7主机MAC地址

至此,关于DM9000的调试过程就完成了。

之后我还调试了UDP通讯、TCP通讯等,主要是关于协议的

处理了,这里就不介绍了。

有兴趣的朋友可以参看《TCP/IP协议》第一卷,将会有很大帮助。

希望这些

调试过程能为读者或多或少的提供些有用的信息,也欢迎大家和我一起讨论。

我的Email:

mengqx25@

补充:

增加了udp实现

【全文完】

类别:

默认分类|

|添加到搜藏|分享到i贴吧|浏览(2101)|评论 

(9)

上一篇:

单片机驱动DM9000网卡芯片(详细... 

下一篇:

google的秘密入口

已有1人分享了这篇文章:

dianzi0702

Ta的转贴

相关文章:

单片机驱动DM9000网卡芯片(详细...         

写DM9000网卡芯片驱动的预备知识

linux-2.6.22内核下dm9000网卡         

嵌入式系统中常见的网卡芯片比较...

移植dm9000驱动(支持四网卡)s3c2...         

嵌入式系统中常见的网卡(CS8900A...

最近读者:

登录后,您就出现在这里。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1