单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机
W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm® Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。
在封装规格上,W55MH32提供了两种选择:QFN100和QFN68。
W55MH32L采用QFN100封装版本,尺寸为12x12mm,其资源丰富,专为各种复杂工控场景设计。它拥有66个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、5个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN、1个USB2.0以及1个SDIO接口。如此丰富的外设资源,能够轻松应对工业控制中多样化的连接需求,无论是与各类传感器、执行器的通信,还是对复杂工业协议的支持,都能游刃有余,成为复杂工控领域的理想选择。同系列还有QFN68封装的W55MH32Q版本,该版本体积更小,仅为8x8mm,成本低,适合集成度高的网关模组等场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。
此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及 MQTT SSL等,为网络通信安全再添保障。
为助力开发者快速上手与深入开发,基于W55MH32L这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。
若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。

第十七章 W55MH32 ARP示例
本篇文章,我们将详细介绍如何在W55MH32芯片上面实现MAC RAW模式。并通过实战例程,为大家讲解如何使用MAC RAW模式实现ARP解析IP地址为MAC地址。
该例程用到的其他网络协议,例如 DHCP,请参考相关章节。有关 W55MH32的初始化过程,请参考Network Install章节,这里将不再赘述。
1 MACRAW模式简介
MACRAW模式是W55MH32 TOE提供的一种底层通信模式,芯片会直接接收和发送以太网帧,而无需解析 TCP/IP层的协议。通过这种模式,用户可以直接操作以太网帧的头部(如目的 MAC地址、源 MAC地址、以太类型等)和有效负载数据。
注意:仅Socket0能设置为MACRAW模式。
2 ARP协议简介
ARP(Address Resolution Protocol,地址解析协议)是一个网络协议,用于通过已知的IP地址解析对应的MAC地址,工作于OSI模型的第二层(数据链路层),它是IPv4网络中局域网通信的重要组成部分。
3 ARP协议特点
协议工作范围:ARP协议仅在同一个局域网(LAN)内工作,因为广播请求无法跨越路由器。
缓存机制:为了减少频繁的广播,设备会将IP-MAC的对应关系缓存一段时间。
协议类型:ARP请求(Opcode = 1):用于查询目标设备的MAC地址。
ARP响应(Opcode = 2):用于回复请求方的ARP消息。
4 ARP协议请求的工作流程
当发送方主机A需要与目标主机B通信,但只知道目标主机的IP地址,而不知道目标主机的MAC地址,并且自己的ARP缓存表中也无对应关系,此时会触发ARP请求流程:
构建ARP请求:发送方需要构建一个ARP请求数据包。
广播ARP请求:发送方将构建好的ARP请求封装为以太网帧,使用广播方式发送到局域网。
目标主机接收并处理:网络中的所有主机都会收到广播帧,但只有目标主机(IP地址匹配)会响应。
发送方接收ARP响应,并更新自己的ARP缓存表。
5 ARP协议应用场景
地址解析:当设备需要进行链路层通信时,可以使用ARP协议获取对方MAC地址。
网络调试与诊断:在调试嵌入式设备时,通过发送 ARP请求验证设备的网络连通性。
6 ARP协议的安全风险及防护措施
尽管ARP协议在局域网通信中非常重要,但它也存在安全风险。例如,ARP欺骗是一种常见的攻击手段,攻击者可以通过伪造ARP回复来误导其他设备,从而窃取敏感信息或中断网络通信。为了防范ARP欺骗攻击,可以采取以下措施:
1.使用静态ARP表:通过配置静态ARP表项,可以限制和指定IP地址的设备通信时只使用指定的MAC地址。这样,即使攻击者发送了伪造的ARP报文,也无法修改此表项的IP地址和MAC地址的映射关系。
2.端口安全和静态IP/MAC绑定:在接入交换机上启用端口安全功能,并将用户IP/MAC地址进行静态绑定。这种方法可以防止用户发出假冒网关的ARP信息。
3.动态ARP检查(DAI)与DHCP侦听:结合使用动态ARP检查和DHCP侦听功能,可以对用户发出的ARP报文进行合法性检测,并过滤掉不符合规则的ARP报文。
4.加密通信协议:通过使用加密通信协议,可以防止网络流量被窃听和篡改。
5.防火墙和交换机配置:在防火墙和交换机上设置相应的安全策略,例如启用特殊的ARP报文过滤功能。
6客户端管理:确保所有终端设备都遵循安全策略,并定期更新和打补丁。
7 ARP协议的工作原理
发送ARP请求:
当设备A需要与设备B通信时,首先检查ARP缓存是否存有设备B的MAC地址。如果ARP缓存中没有设备B的MAC地址,设备A会发送一条广播ARP请求消息,格式为:“谁是IP地址 X.X.X.X?请告诉我(设备A的IP地址和MAC地址)。”
接收ARP响应:
设备B收到广播请求后,检查请求中的IP地址是否与自身匹配。如果匹配,设备B发送一条单播ARP响应消息给设备A,告知设备B的MAC地址。设备A收到响应后,将设备B的MAC地址缓存起来,用于后续通信。
8 ARP报文格式
一个标准的ARP报文由以下字段组成,总长度为28字节(不包含链路层帧头):
| 字段名 | 长度(字节) | 描述 |
| Hardware Type | 2 | 表示硬件类型,常见值为1(以太网)。 |
| Protocol Type | 2 | 表示需要解析的协议类型,常见值为0x0800(IPv4)。 |
| Hardware Address Length | 1 | 硬件地址(MAC地址)的长度,通常为6字节。 |
| Protocol Address Length | 1 | 协议地址(IP地址)的长度,通常为4字节(IPv4)。 |
| Operation Code | 2 | 指示操作类型:1(请求),2(响应)。 |
| Sender Hardware Address | 6 | 请求方的MAC地址。 |
| Sender Protocol Address | 4 | 请求方的IP地址。 |
| Target Hardware Address | 6 | 目标设备的MAC地址。请求中此字段为0。 |
| Target Protocol Address | 4 | 目标设备的IP地址。 |
报文字段详解
硬件类型 (Hardware Type):说明所使用的网络类型,例如:
1:以太网。
6:IEEE 802网络。
对于以太网的ARP报文,该值始终为0x0001。
协议类型 (Protocol Type):表示要解析的协议类型,例如:
0x0800:表示IPv4地址解析。
0x86DD:表示IPv6(通常由ND协议替代ARP)。
硬件地址长度 (Hardware Address Length):定义硬件地址(MAC地址)的长度,通常为6字节(以太网)。
协议地址长度 (Protocol Address Length):定义协议地址(IP地址)的长度,通常为4字节(IPv4)。
操作码 (Operation Code):说明ARP的操作类型:
1:ARP请求。
2:ARP响应。
发送方硬件地址 (Sender Hardware Address):包含请求方设备的MAC地址。
发送方协议地址 (Sender Protocol Address):包含请求方设备的IP地址。
目标硬件地址 (Target Hardware Address):在ARP请求中,这一字段为空(全0)。在ARP响应中,包含目标设备的MAC地址。
目标协议地址 (Target Protocol Address):包含目标设备的IP地址。
报文内容:
ARP Probe请求报文:
|报文解析| Address Resolution Protocol (ARP Probe) (ARP Probe请求报文,用于检测目标IP地址是否冲突) Hardware type: Ethernet (1) (硬件类型:1表示以太网) Protocol type: IPv4 (0x0800) (协议类型:0x0800表示IPv4) Hardware size: 6 (硬件地址长度:6字节) Protocol size: 4 (协议地址长度:4字节) Opcode: request (1) (操作码:1表示ARP请求) [Is probe: True] (是否为探测:是,用于检测IP冲突) Sender MAC address: Wiznet_12:22:12 (00:08:dc:12:22:12) (发送方MAC地址:00:08:dc:12:22:12) Sender IP address: 0.0.0.0 (发送方IP地址:未分配,用于探测) Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00) (目标MAC地址:全0,未指定) Target IP address: 192.168.1.105 (目标IP地址:192.168.1.105,探测对象) |报文原文| 00 01 08 00 06 04 00 01 00 08 dc 12 22 12 00 00 00 00 00 00 00 00 00 00 c0 a8 01 69
ARP请求报文:
|报文解析| Address Resolution Protocol (request) (请求报文) Hardware type: Ethernet (1) (硬件类型:1表示以太网) Protocol type: IPv4 (0x0800) (协议类型:0x0800表示IPv4) Hardware size: 6 (硬件地址长度:6字节) Protocol size: 4 (协议地址长度:4字节) Opcode: request (1) (操作码:1表示ARP请求) Sender MAC address: Wiznet_12:22:12 (00:08:dc:12:22:12) (发送方MAC地址) Sender IP address: 192.168.1.105 (发送方IP地址:192.168.1.105) Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00) (未知目标设备的物理地址) Target IP address: 192.168.1.138 (目标IP地址:192.168.1.138,目标设备的IPv4地址) |报文原文| 00 01 08 00 06 04 00 01 00 08 dc 12 22 12 c0 a8 01 69 00 00 00 00 00 00 c0 a8 01 8a
ARP响应报文:
|报文解析| Address Resolution Protocol (reply) (响应报文) Hardware type: Ethernet (1) (硬件类型:1表示以太网) Protocol type: IPv4 (0x0800) (协议类型:0x0800表示IPv4) Hardware size: 6 (硬件地址长度:6字节) Protocol size: 4 (协议地址长度:4字节) Opcode: reply (2) (操作码:2表示ARP响应) Sender MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11) (发送方MAC地址:64:4e:d7:b1:37:11) Sender IP address: 192.168.1.138 (发送方IP地址:192.168.1.138) Target MAC address: Wiznet_12:22:12 (00:08:dc:12:22:12) (目标MAC地址,ARP请求者的物理地址) Target IP address: 192.168.1.105 (目标IP地址:192.168.1.105,ARP请求者的IPv4地址) |报文原文| 00 01 08 00 06 04 00 02 64 4e d7 b1 37 11 c0 a8 01 8a 00 08 dc 12 22 12 c0 a8 01 69
9实现过程
接下来,我们看看如何在W55MH32上实现ARP请求。
注意:测试实例需要PC端和W55MH32处于同一网段。
步骤1:在主循环中调用do_arp()函数,执行ARP请求流程
while (1)
{
do_arp(SOCKET_ID, ethernet_buf, dest_ip);
}
do_arp()函数如下所示:
void do_arp(uint8_t sn, uint8_t *buf, uint8_t *dest_ip)
{
uint16_t rlen = 0;
uint16_t local_port = 5000;
uint16_t cnt = 0;
switch (getSn_SR(sn))
{
case SOCK_CLOSED:
close(sn);
socket(sn, Sn_MR_MACRAW, local_port, 0x00);
break;
case SOCK_MACRAW:
arp_request(sn, local_port, dest_ip);
while (1)
{
if ((rlen = getSn_RX_RSR(sn)) > 0)
{
arp_reply(sn, buf, rlen);
break;
}
if (cnt > 1000)
{
printf("Request Time out.rn");
cnt = 0;
break;
}
else
{
cnt++;
delay_ms(5);
}
}
break;
}
if (arp_succ_flag)
while (1);
}
进入该函数后,程序会执行一个状态机,当socket状态为关闭状态时开启一个MACRAW模式的socket。当socket成功打开为MAC RAW模式后,执行arp_request()函数发送ARP请求,然后进入一个循环,当成功接收到响应时,执行arp_reply()函数解析请求。当超过5秒未能得到响应时,则ARP请求失败。当arp_succ_flag标志位为1时,说明ARP请求成功。
arp_request()函数如下所示:
void arp_request(uint8_t sn, uint16_t port, uint8_t *dest_ip)
{
uint16_t i;
uint8_t broadcast_addr[4] = {0xff, 0xff, 0xff, 0xff};
for (i = 0; i < 6; i++)
{
pARPMSG.dst_mac[i] = 0xff; // Broadcast address in an Ethernet frame
pARPMSG.tgt_mac[i] = 0x00;
if (i < 4)
{
pARPMSG.tgt_ip[i] = dest_ip[i];
}
}
getSHAR(pARPMSG.src_mac); // Fill in the source MAC address of the link layer
getSHAR(pARPMSG.sender_mac); // Fill in the MAC address of the sender in ARP
getSIPR(pARPMSG.sender_ip); // Enter the IP address of the sender in ARP
pARPMSG.msg_type = htons(ARP_TYPE); // ARP type
pARPMSG.hw_type = htons(ETHER_TYPE); // Ethernet type
pARPMSG.pro_type = htons(PRO_TYPE); // IP
pARPMSG.hw_size = HW_SIZE; // 6
pARPMSG.pro_size = PRO_SIZE; // 4
pARPMSG.opcode = htons(ARP_REQUEST); // request: 0x0001; reply: 0x0002
if (sendto(sn, (uint8_t *)&pARPMSG, sizeof(pARPMSG), broadcast_addr, port) != sizeof(pARPMSG))
{
printf("Fail to send arp request packet.rn");
}
else
{
if (pARPMSG.opcode == htons(ARP_REQUEST))
{
printf("Who has %d.%d.%d.%d ? Tell %d.%d.%d.%drn", pARPMSG.tgt_ip[0], pARPMSG.tgt_ip[1],pARPMSG.tgt_ip[2], pARPMSG.tgt_ip[3],
pARPMSG.sender_ip[0], pARPMSG.sender_ip[1], pARPMSG.sender_ip[2], pARPMSG.sender_ip[3]);
}
else
{
printf("Opcode has wrong value. check opcode!rn");
}
}
}
在这个函数中,进行了ARP报文的组包以及发送。
arp_reply()函数如下所示:
void arp_reply(uint8_t sn, uint8_t *buff, uint16_t rlen)
{
uint8_t destip[4];
uint16_t destport;
uint8_t ret_arp_reply[128];
uint8_t i;
recvfrom(sn, (uint8_t *)buff, rlen, destip, &destport);
if (buff[12] == ARP_TYPE_HI && buff[13] == ARP_TYPE_LO)
{
aAPRMSG = (ARPMSG *)buff;
if ((aAPRMSG->opcode) == htons(ARP_REPLY))
{
for (i = 0; i < 4; i++)
{
if (aAPRMSG- >tgt_ip[i] != pARPMSG.tgt_ip[i])
{
break;
}
arp_succ_flag = 1;
}
memset(ret_arp_reply, 0x00, 128);
sprintf((char *)ret_arp_reply, "%d.%d.%d.%d is at %.2x.%.2x.%.2x.%.2x.%.2x.%.2xrn",
aAPRMSG->sender_ip[0], aAPRMSG->sender_ip[1], aAPRMSG->sender_ip[2], aAPRMSG>sender_ip[3],
aAPRMSG->sender_mac[0], aAPRMSG->sender_mac[1], aAPRMSG->sender_mac[2], aAPRMSG->sender_mac[3],
aAPRMSG->sender_mac[4], aAPRMSG->sender_mac[5]);
printf("%d.%d.%d.%d is at %.2x.%.2x.%.2x.%.2x.%.2x.%.2xrn",
aAPRMSG->sender_ip[0], aAPRMSG->sender_ip[1], aAPRMSG->sender_ip[2], aAPRMSG->sender_ip[3],
aAPRMSG->sender_mac[0], aAPRMSG->sender_mac[1], aAPRMSG->sender_mac[2], aAPRMSG->sender_mac[3],
aAPRMSG->sender_mac[4], aAPRMSG->sender_mac[5]);
}
else if ((aAPRMSG->opcode) == htons(ARP_REQUEST))
{
printf("Who has %d.%d.%d.%d ? Tell %.2x.%.2x.%.2x.%.2x.%.2x.%.2xrn",
aAPRMSG->tgt_ip[0], aAPRMSG->tgt_ip[1], aAPRMSG->tgt_ip[2], aAPRMSG->tgt_ip[3],
aAPRMSG->sender_mac[0], aAPRMSG->sender_mac[1], aAPRMSG->sender_mac[2], aAPRMSG->sender_mac[3],
aAPRMSG->sender_mac[4], aAPRMSG->sender_mac[5]);
}
}
else
{
// printf("This message is not ARP reply: opcode is not 0x02!rn");
}
}
在这个函数中,我们会将接收到的ARP报文进行校验,如果ARP报文为回复报文,并且回复的IP地址与我们请求的IP地址匹配时,将arp_succ_flag标志位置一,表示ARP请求成功。
10运行结果
烧录例程运行后,首先可以看到进行了PHY链路检测,然后打印了设置的网络地址信息,然后是执行ARP请求以及请求结果,如下图所示:

11总结
文讲解了如何在 W55MH32芯片上通过 MAC RAW模式实现 ARP协议,将 IP地址解析为 MAC地址,通过实战例程展示了从发送 ARP请求到接收并处理响应的完整过程。文章详细介绍了 MAC RAW模式和 ARP协议的概念、特点、工作流程、应用场景、安全风险及防护措施和报文格式,帮助读者理解其在局域网通信中的实际应用价值。
下一篇文章将聚焦 FTP协议服务器模式,解析其核心原理及在文件传输中的应用,同时讲解如何在相关设备上搭建 FTP服务器,敬请期待!
WIZnet是一家无晶圆厂半导体公司,成立于 1998年。产品包括互联网处理器 iMCU™,它采用 TOE(TCP/IP卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU™面向各种应用中的嵌入式互联网设备。
WIZnet在全球拥有 70多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。
香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。
审核编辑 黄宇
-
单片机
+关注
关注
6074文章
45340浏览量
663434 -
ARP
+关注
关注
0文章
51浏览量
15275
发布评论请先 登录
第十七章 SPI
"STM32H7学习继续(STM32H7系列5)第十七章比较实用,以后写程序的时候会用到"
第二章 W55MH32 DHCP示例
第五章 W55MH32 UDP示例
第九章 W55MH32 HTTP Server示例
第十章 W55MH32 SNTP示例
第十一章 W55MH32 SMTP示例
第十二章 W55MH32 NetBIOS示例
第十四章 W55MH32 TFTP示例
第十五章 W55MH32 SNMP示例
第十六章 W55MH32 PING示例
第十八章 W55MH32 FTP_Server示例
第二十六章 W55MH32 上位机搜索和配置示例
第二十七章 W55MH32 Interrupt示例

第十七章 W55MH32 ARP示例
评论