DM9000_init(),sendpacket()和receivepacket(),保存并命名为dm9000.c。既然我们要进行调试,当
然要有结果输出,根据自己的处理器的情况写一个串口程序,这些函数是学某个单片机的基础,这里不
做详细介绍,用到是时候会在函数里注释一下。
void main(void)
{
}
图4 显示寄存器值
看NSR寄存器的bit[6]是否为“1”,该位表示是否连接成功。本例中NSR的值为40H,括号里的数为对应
的十进制数。
void main(void)
{
}
void int_issue(void) //中断处理函数,需要根据自己的处理器进行设置
{
int_again :
}
图5 接收数据包中的数据
这里就不保密了,呵呵。
检查寄存器的值是否正确。可以将DM9000中的寄存器打印出来,查看到底是哪里的问题。如果打印出的
值很混乱,在确保串口程序无误的前提下,查看硬件连接,以及寄存器读写时序是否正确,重复调试几
次查找原因。
帧”,帧里面有目标主机的MAC地址。在以太网中,一个注意要和另一个主机进行直接通信,必须要知
道目标主机的MAC地址。这个MAC地址就是标识我们的网卡芯片唯一性的地址。但这个目标MAC地址是如
何获得的呢?这就用到了我们这里讲到的地址解析协议。所有“地址解析”,就是主机在发送帧前将目
标IP地址转换成MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC
地址,以保证通信的顺利进行。所以在第一次通信前,我们知道目标机的IP地址,想要获知目标机的
MAC地址,就要发送ARP报文(即ARP数据包)。它的传输过程简单的说就是:我知道目标机的IP地址,
那么我就向网络中所有的机器发送一个ARP请求,请求中有目标机的IP地址,请求的意思是目标机要是
收到了此请求,就把你的MAC地址告诉我。如果目标机不存在,那么此请求自然不会有人回应。若目标
机接收到了此请求,它就会发送一个ARP应答,这个应答是明确发给请求者的,应答中有MAC地址。我接
到了这个应答,我就知道了目标机的MAC地址,就可以进行以后的通信了。因为每次通信都要用到MAC地
址。
图6 用于以太网的ARP请求或应答分组格式
,先发送高8位后发送低8位。所以接收数据的时候要注意存储顺序。
“以太网目的地址”字段:若是发送ARP请求,应填写广播类型的MAC地址FF-FF-FF-FF-FF-FF,意思是
让网络上的所有机器接收到;
“帧类型”字段:填写08-06表示次报文是ARP协议;
“硬件类型”字段:填写00-01表示以太网地址,即MAC地址;
“协议类型”字段:填写08-00表示IP,即通过IP地址查询MAC地址;
“硬件地址长度”字段:MAC地址长度为6(以字节为单位);
“协议地址长度”字段:IP地址长度为4(以字节为单位);
“操作类型”字段:ARP数据包类型,0表示ARP请求,1表示ARP应答;
“目的以太网地址”字段:若是发送ARP请求,这里是需要目标机填充的。[page]
:
unsigned char mac_addr[6] = {*,*,*,*,*,*};
unsigned char ip_addr[4] = { 192, 168, *, * };
unsigned char host_ip_addr[4] = { 192, 168, *, * };
unsigned char host_mac_addr[6]={ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
unsigned char Buffer[1000];
uint16 packet_len;
#define HON(n) ((((uint16)((n) & 0xff)) << 8) | (((n) & 0xff00) >> 8))
void arp_request(void) //发送ARP请求数据包
{
//以太网首部
memcpy(ARPBUF->ethhdr.d_mac, host_mac_addr, 6);
memcpy(ARPBUF->ethhdr.s_mac, mac_addr, 6);
ARPBUF->ethhdr.type = HON( 0x0806 );
//ARP首部
ARPBUF->hwtype = HON( 1 );
ARPBUF->protocol = HON( 0x0800 );
ARPBUF->hwlen = 6;
ARPBUF->protolen = 4;
ARPBUF->opcode = HON( 0 );
memcpy(ARPBUF->smac, mac_addr, 6);
memcpy(ARPBUF->sipaddr, ip_addr, 4);
memcpy(ARPBUF->dipaddr, host_ip_addr, 4);
packet_len = 42;//14+28=42
sendpacket( Buffer, packet_len );
}
注释:ARPBUF的宏定义和ARP首部结构,在前面已经讲过。同时注意执行该函数时中断的处理。这里没
作处理。
unsigned char arp_process(void)//ARP接收函数,成功返回1,否则返回0
{
//简单判断ARP数据包有无损坏,有损坏则丢弃,不予处理
if( packet_len < 28 )//ARP数据长度为28字节为无效数据
{
return 0;
}
switch ( HON( ARPBUF->opcode ) )
{
。
default
}
}
arp_process()。
void int_issue(void) //中断处理函数,需要根据自己的处理器进行设置
{
个字节
}
图7 主机MAC地址
处理了,这里就不介绍了。有兴趣的朋友可以参看《TCP/IP协议》第一卷,将会有很大帮助。希望这些
调试过程能为读者或多或少的提供些有用的信息,也欢迎大家和我一起讨论
上一篇:STC单片机EEPROM的应用和程序
下一篇:对ADC12模块的心得——msp430f5529
推荐阅读最新更新时间:2024-03-16 14:40