单片机驱动DM9000网卡芯片
:
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协议》第一卷,将会有很大帮助。希望这些
调试过程能为读者或多或少的提供些有用的信息,也欢迎大家和我一起讨论
关键词: 单片机驱动DM9000网卡芯

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码