单芯片解决方案,开启全新体验——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 DHCP示例
本篇文章我们将详细讲解DHCP协议的基本信息、优势特点、工作原理、应用场景,并通过实战例程,为大家讲解如何使用W55MH32动态获取IP信息,帮助读者更好地了解并运用这一协议。
有关W55MH32的初始化过程,请参考相关章节,这里将不再详述。
1 DHCP协议简介
DHCP(Dynamic Host Configuration Protocol)即动态主机配置协议,是一个应用层协议。它主要用于在 IP网络中为客户端自动分配 IP地址及其他相关网络配置参数,如子网掩码、默认网关、DNS服务器地址等。这种动态分配的方式大大简化了网络管理员的工作,并且能够更有效地利用有限的 IP地址资源。
2 DHCP协议特点
便捷配置与管控:DHCP可自动分配IP地址、子网掩码、网关、DNS等网络参数,设备入网即自动获取,用户无需手动操作。管理员能通过服务器集中管理IP分配,网络架构调整时,修改服务器设置,客户端自动适配;静态IP则要逐台手动输入、调整,流程繁琐还易出错。
灵活资源利用:DHCP动态分配IP,设备离线后地址回池再利用,契合公共场所临时大量接入需求,提升地址利用率;还能按需灵活调配,为关键设备保留静态IP,其余动态分配。静态IP固定占用,闲置浪费资源,灵活性差。
高效维护与排障:DHCP自动分配,规避手动配置错误与IP地址冲突,服务器详细记录分配情况。网络故障时,管理员依服务器日志锁定故障设备排查;静态IP手动配置易冲突,故障排查缺少有效记录,难度大、耗时久。
适配移动与拓展:移动设备横跨网络时,DHCP让其自动获取IP配置,无需手动切换;网络规模扩大、新增设备时,DHCP自动分配地址,助力快速扩容。静态IP需提前规划,易现地址不足、分配不合理问题,还增加设备移动操作难度。
3 DHCP工作原理
DHCP工作原理如图所示:

从图示中我们可以直观明了地看出DHCP地工作原理,一般为四个阶段:
发现阶段:客户端接入网络时以广播形式发送DHCP Discover报文(目的IP是255.255.255.255,源IP是0.0.0.0)寻找DHCP服务器,报文中含客户端MAC地址。若服务器和客户端不在同一子网,会通过中继代理(如路由器)转发。
提供阶段:DHCP服务器收到Discover报文后,从IP地址池选一个未分配的IP地址,将其和子网掩码、默认网关、DNS服务器地址等信息封装进DHCP Offer报文,以广播或单播方式发给客户端,可能会有多个Offer报文。
请求阶段:客户端收到多个Offer后选择一个,以广播形式发送DHCP Request报文请求分配该IP地址等配置信息,且发送ARP请求检查IP地址唯一性。
确认阶段:服务器收到Request报文后,检查IP地址是否可用。若可用,将以广播或单播的形式发送DHCP Ack报文,客户端收到后完成网络配置正常上网。若不可用,发送DHCP Nak报文,客户端收到后重新发起Discover流程。
4 DHCP协议报文
DHCP的报文格式如下:
| 0~7 bit | 8~15 bit | 16~23 bit | 24~31 bit |
| op(1) | htype(1) | hlen(1) | hops(1) |
| Xid(4) | |||
| secs(2) | flags(2) | ||
| ciaddr(4) | |||
| yiaddr(4) | |||
| siaddr(4) | |||
| giaddr(4) | |||
| chaddr(16) | |||
| sname(64) | |||
| file(128) | |||
| options(variable) | |||
DHCP报文各字段的说明如下表所示:
| 字段 | 长度 | 含义 |
| op(op code) | 1字节 |
表示报文的类型,取值为1或2,含义如下: 1:客户端请求报文。 2:服务器响应报文。 |
| htype(hardware type) | 1字节 | 表示硬件类型。不同的硬件类型取值不同,常见值为1,表示以太网(10Mb)。 |
| hlen(hardware length) | 1字节 | 表示硬件地址长度,以太网的值为6。 |
| hops | 1字节 | 表示DHCP报文经过的DHCP中继数目。客户端或服务器初始设为0,每经过一个中继则加1,用于限制DHCP报文经过的中继数量,且服务器与客户端间中继数目不能超16个(Hops值不能大于16),否则报文将被丢弃。 |
| xid | 4字节 | 表示DHCP客户端选取的随机数,使DHCP服务器的回复与DHCP客户端的报文相关联。 |
| secs(seconds) | 2字节 | 表示客户端从开始获取地址或地址续租更新后所用的时间,单位是秒。 |
| flags | 2字节 |
表示标志字段。只有标志字段的最高位才有意义,其余的15位均被置为0。最高位被解释为单播或者广播响应标志位,内容如下所示: 0:客户端请求服务器以单播形式发送响应报文。 1:客户端请求服务器以广播形式发送响应报文。 |
| ciaddr(client ip address) | 4字节 |
表示客户端的IP地址。可以是服务器分配给客户端的IP地址或者客户端已有的IP地址。客户端在初始化状态时没有IP地址,此字段为0.0.0.0。 IP地址0.0.0.0仅在采用DHCP方式的系统启动时允许本主机利用它进行临时的通信,不是有效目的地址。 |
| yiaddr(your client ip address) | 4字节 | 表示服务器分配给客户端的IP地址。当服务器进行DHCP响应时,将分配给客户端的IP地址填入此字段。 |
| siaddr(server ip address) | 4字节 | DHCP客户端获得启动配置信息的服务器的IP地址。 |
| giaddr(gateway ip address) | 4字节 | 表示首个DHCP中继的IP地址。客户端发DHCP请求,若服务器与客户端不在同一网段,首个中继转发请求报文给服务器时填入自身IP地址,服务器据此判断客户端网段地址,选地址池分配对应IP地址,再按此地址回发响应报文给该中继,由中继转发给客户端。若存在多个中继,此字段作为客户端网段标记,填好首个中继IP地址后不再变更,每经过一个中继,hops字段数值加1。 |
| chaddr(client hardware address) | 16字节 | 表示客户端的MAC地址,此字段与前面的“hardware type”和“hardware length”保持一致。当客户端发出DHCP请求时,将自己的硬件地址填入此字段。对于以太网,当“hardware type”和“hardware length”分别为“1”和“6”时,此字段必须填入6字节的以太网MAC地址。 |
| sname(server host name) | 64字节 | 表示客户端获取配置信息的服务器名字。此字段由DHCP服务器填写,是可选的。如果填写,必须是一个以0结尾的字符串。 |
| file(file name) | 128字节 | 表示客户端需获取的启动配置文件名。由DHCP服务器填写,随DHCP地址分配下发至客户端。该字段可选,若填写则须是以0结尾的字符串。 |
| options | 可变 | 表示DHCP的选项字段,最多1200字节,包含DHCP报文类型、服务器分配给终端的配置信息(如网关IP地址、DNS服务器IP地址、客户端IP地址有效租期等)。详情参见IETF官网“DHCP Options”部分的描述。 |
Discover报文实例:客户端通过UDP广播的方式发送DHCP发现报文,报文中包含了客户端MAC地址、主机名和请求的IP地址等信息
|报文解析| Message type: Boot Request (1)(op code为1,客户端请求报文) Hardware type: Ethernet (0x01) Hardware address length: 6 Hops: 0 Transaction ID: 0xbf600589 Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) Client IP address: 0.0.0.0 Your (client) IP address: 0.0.0.0 Next server IP address: 0.0.0.0 Relay agent IP address: 0.0.0.0 Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11) Client hardware address padding: 00000000000000000000 Server host name not given Boot file name not given Magic cookie: DHCP Option: (53) DHCP Message Type (Discover) Option: (61) Client identifier Option: (50) Requested IP Address (192.168.1.115) Option: (12) Host Name Option: (60) Vendor class identifier Option: (55) Parameter Request List Option: (255) End Padding: 0000000000000000 |报文原文| 01 01 06 00 bf 60 05 89 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 3d 07 01 64 4e d7 b1 37 11 32 04 c0 a8 01 73 0c 05 46 41 45 5f 33 3c 08 4d 53 46 54 20 35 2e 30 37 0e 01 03 06 0f 1f 21 2b 2c 2e 2f 77 79 f9 fc ff 00 00 00 00 00 00 00 00
Offer报文实例:DHCP服务器收到Discover报文后,从IP地址池选一个未分配的IP地址,将其和子网掩码、默认网关等信息封装进Offer报文以广播或单播(这里为广播的方式)方式发给客户端
|报文解析| Message type: Boot Reply (2)(op code为2,服务器响应报文) Hardware type: Ethernet (0x01) Hardware address length: 6 Hops: 0 Transaction ID: 0xbf600589 Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) Client IP address: 0.0.0.0 Your (client) IP address: 192.168.1.115 Next server IP address: 0.0.0.0 Relay agent IP address: 0.0.0.0 Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11) Client hardware address padding: 00000000000000000000 Server host name not given Boot file name not given Magic cookie: DHCP Option: (53) DHCP Message Type (Offer) Option: (54) DHCP Server Identifier (192.168.1.1) Option: (51) IP Address Lease Time Option: (6) Domain Name Server Option: (1) Subnet Mask (255.255.255.0) Option: (3) Router Option: (255) End |报文原文| 02 01 06 00 bf 60 05 89 00 00 00 00 00 00 00 00 c0 a8 01 73 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 02 36 04 c0 a8 01 01 33 04 00 00 1c 20 06 08 ca 60 86 21 ca 60 80 56 01 04 ff ff ff 00 03 04 c0 a8 01 01 ff
其他报文信息这里就不一一展示了,感兴趣的朋友可以自行抓取查看。
5 DHCP应用场景
DHCP的应用场景通常集中在需要动态分配IP地址的局域网环境中。例如,在大型的办公环境或者学校中,由于有大量的网络设备需要连接到网络,手动为每个设备分配和管理IP地址会非常繁琐且容易出错。使用DHCP可以集中管理IP地址的分配,提高网络管理员的工作效率,减少错误的发生,且可以适应网络变化。
6实现过程
接下来,我们一起来看看如何在W55MH32上实现DHCP动态获取网络地址信息。
注意:使用DHCP动态获取IP时,必需将网络结构体配置中dhcp的值改为NETINFO_DHCP,这样才能运行DHCP模式。
步骤一:注册DHCP定时器中断到1s定时器中:
/**
* @brief 1ms timer IRQ Handler
* @param none
* @return none
*/
void TIM3_IRQHandler(void)
{
static uint32_t tim3_1ms_count = 0;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
tim3_1ms_count++;
if (tim3_1ms_count >= 1000)
{
DHCP_time_handler();
tim3_1ms_count = 0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
注册DHCP定时器中断主要为了DHCP超时处理。
在dhcp.h文件中,定义了DHCP超时时间、重试次数、端口号和主机名等内容:
/* Retry to processing DHCP */ #define MAX_DHCP_RETRY 2 ///< Maximum retry count #define DHCP_WAIT_TIME 10 ///< Wait Time 10s /* UDP port numbers for DHCP */ #define DHCP_SERVER_PORT 67 ///< DHCP server port number #define DHCP_CLIENT_PORT 68 ///< DHCP client port number #define MAGIC_COOKIE 0x63825363 ///< You should not modify it number. #define DCHP_HOST_NAME "WIZnet"
步骤二:启用DHCP动态获取:
首先需要将默认网络地址信息结构体中的模式改为DHCP模式
/* network information */
wiz_NetInfo default_net_info = {
.mac = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12},
.ip = {192, 168, 1, 30},
.gw = {192, 168, 1, 1},
.sn = {255, 255, 255, 0},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_DHCP
};
步骤三:DHCP获取网络地址信息
首先是在初始化完硬件和TOE之后调用network_init进行网络地址信息配置
network_init(ethernet_buf, &default_net_info);
这个函数需要将DHCP处理用到的缓存数组以及默认网络地址信息传入,函数具体内容如下:
/** * @brief set network information * * First determine whether to use DHCP. If DHCP is used, first obtain the Internet Protocol Address through DHCP. * When DHCP fails, use static IP to configure network information. If static IP is used, configure network information directly * * @param sn: socketid * @param ethernet_buff: * @param net_info: network information struct * @return none */ void network_init(uint8_t *ethernet_buff, wiz_NetInfo *conf_info) { int ret; wizchip_setnetinfo(conf_info); // Configuring Network Information if (conf_info->dhcp == NETINFO_DHCP) { ret = wiz_dhcp_process(0, ethernet_buff); if (ret == 0) { conf_info->dhcp = NETINFO_STATIC; wizchip_setnetinfo(conf_info); } } print_network_information(); }
在这个函数中,会先设置一遍网络地址到W55MH32中,然后判断模式是否为DHCP模式,如果为DHCP模式,则使用wiz_dhcp_process函数来执行DHCP进程,在通过DHCP方式成功获取到网络地址后更新到W55MH32中,最后将网络地址信息打印出来。wiz_dhcp_process函数内容如下:
/**
* @brief DHCP process
* @param sn :socket number
* @param buffer :socket buffer
*/
static uint8_t wiz_dhcp_process(uint8_t sn, uint8_t *buffer)
{
wiz_NetInfo conf_info;
uint8_t dhcp_run_flag = 1;
uint8_t dhcp_ok_flag = 0;
/* Registration DHCP_time_handler to 1 second timer */
DHCP_init(sn, buffer);
printf("DHCP runningrn");
while (1)
{
switch (DHCP_run()) // Do the DHCP client
{
case DHCP_IP_LEASED: // DHCP Acquiring network information successfully
if (dhcp_ok_flag == 0)
{
dhcp_ok_flag = 1;
dhcp_run_flag = 0;
}
break;
case DHCP_FAILED:
dhcp_run_flag = 0;
break;
}
if (dhcp_run_flag == 0)
{
printf("DHCP %s!rn", dhcp_ok_flag ? "success" : "fail");
DHCP_stop();
if (dhcp_ok_flag)
{
getIPfromDHCP(conf_info.ip);
getGWfromDHCP(conf_info.gw);
getSNfromDHCP(conf_info.sn);
getDNSfromDHCP(conf_info.dns);
conf_info.dhcp = NETINFO_DHCP;
getSHAR(conf_info.mac);
wizchip_setnetinfo(&conf_info); // Update network information to network information obtained by DHCP
return 1;
}
return 0;
}
}
}
在该函数体中,首先会调用DHCP_init函数进行初始化DHCP配置:
void DHCP_init(uint8_t s, uint8_t * buf)
{
uint8_t zeroip[4] = {0,0,0,0};
getSHAR(DHCP_CHADDR);
if((DHCP_CHADDR[0] | DHCP_CHADDR[1] | DHCP_CHADDR[2] | DHCP_CHADDR[3] | DHCP_CHADDR[4] | DHCP_CHADDR[5]) == 0x00)
{
// assigning temporary mac address, you should be set SHAR before call this function.
DHCP_CHADDR[0] = 0x00;
DHCP_CHADDR[1] = 0x08;
DHCP_CHADDR[2] = 0xdc;
DHCP_CHADDR[3] = 0x00;
DHCP_CHADDR[4] = 0x00;
DHCP_CHADDR[5] = 0x00;
setSHAR(DHCP_CHADDR);
}
DHCP_SOCKET = s; // SOCK_DHCP
pDHCPMSG = (RIP_MSG*)buf;
DHCP_XID = 0x12345678;
{
DHCP_XID += DHCP_CHADDR[3];
DHCP_XID += DHCP_CHADDR[4];
DHCP_XID += DHCP_CHADDR[5];
DHCP_XID += (DHCP_CHADDR[3] ^ DHCP_CHADDR[4] ^ DHCP_CHADDR[5]);
}
// WIZchip Netinfo Clear
setSIPR(zeroip);
setGAR(zeroip);
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_INIT;
}
然后是在DHCP主循环中运行DHCP_run函数,它的主要作用是进行DHCP组包,发送发现、请求等报文,对服务器的提供、响应等内容进行解析以及超时处理,这里只需要根据DHCP_run函数的返回值进行相应处理即可。DHCP_run函数内容如下:
uint8_t DHCP_run(void)
{
uint8_t type;
uint8_t ret;
if(dhcp_state == STATE_DHCP_STOP) return DHCP_STOPPED;
if(getSn_SR(DHCP_SOCKET) != SOCK_UDP)
socket(DHCP_SOCKET, Sn_MR_UDP, DHCP_CLIENT_PORT, 0x00);
ret = DHCP_RUNNING;
type = parseDHCPMSG();
switch ( dhcp_state ) {
case STATE_DHCP_INIT :
DHCP_allocated_ip[0] = 0;
DHCP_allocated_ip[1] = 0;
DHCP_allocated_ip[2] = 0;
DHCP_allocated_ip[3] = 0;
send_DHCP_DISCOVER();
dhcp_state = STATE_DHCP_DISCOVER;
break;
case STATE_DHCP_DISCOVER :
if (type == DHCP_OFFER){
#ifdef _DHCP_DEBUG_
printf("> Receive DHCP_OFFERrn");
#endif
DHCP_allocated_ip[0] = pDHCPMSG->yiaddr[0];
DHCP_allocated_ip[1] = pDHCPMSG->yiaddr[1];
DHCP_allocated_ip[2] = pDHCPMSG->yiaddr[2];
DHCP_allocated_ip[3] = pDHCPMSG->yiaddr[3];
send_DHCP_REQUEST();
dhcp_state = STATE_DHCP_REQUEST;
} else ret = check_DHCP_timeout();
break;
case STATE_DHCP_REQUEST :
if (type == DHCP_ACK) {
#ifdef _DHCP_DEBUG_
printf("> Receive DHCP_ACKrn");
#endif
if (check_DHCP_leasedIP()) {
// Network info assignment from DHCP
dhcp_ip_assign();
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_LEASED;
} else {
// IP address conflict occurred
reset_DHCP_timeout();
dhcp_ip_conflict();
dhcp_state = STATE_DHCP_INIT;
}
} else if (type == DHCP_NAK) {
#ifdef _DHCP_DEBUG_
printf("> Receive DHCP_NACKrn");
#endif
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_DISCOVER;
} else ret = check_DHCP_timeout();
break;
case STATE_DHCP_LEASED :
ret = DHCP_IP_LEASED;
if ((dhcp_lease_time != INFINITE_LEASETIME) && ((dhcp_lease_time/2) < dhcp_tick_1s)) {
#ifdef _DHCP_DEBUG_
printf(" > Maintains the IP address rn");
#endif
type = 0;
OLD_allocated_ip[0] = DHCP_allocated_ip[0];
OLD_allocated_ip[1] = DHCP_allocated_ip[1];
OLD_allocated_ip[2] = DHCP_allocated_ip[2];
OLD_allocated_ip[3] = DHCP_allocated_ip[3];
DHCP_XID++;
send_DHCP_REQUEST();
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_REREQUEST;
}
break;
case STATE_DHCP_REREQUEST :
ret = DHCP_IP_LEASED;
if (type == DHCP_ACK) {
dhcp_retry_count = 0;
if (OLD_allocated_ip[0] != DHCP_allocated_ip[0] ||
OLD_allocated_ip[1] != DHCP_allocated_ip[1] ||
OLD_allocated_ip[2] != DHCP_allocated_ip[2] ||
OLD_allocated_ip[3] != DHCP_allocated_ip[3])
{
ret = DHCP_IP_CHANGED;
dhcp_ip_update();
#ifdef _DHCP_DEBUG_
printf(">IP changed.rn");
#endif
}
#ifdef _DHCP_DEBUG_
else printf(">IP is continued.rn");
#endif
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_LEASED;
} else if (type == DHCP_NAK) {
#ifdef _DHCP_DEBUG_
printf("> Receive DHCP_NACK, Failed to maintain iprn");
#endif
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_DISCOVER;
} else ret = check_DHCP_timeout();
break;
default :
break;
}
return ret;
}
8运行结果
烧录例程运行后,首先打印了PHY链路检测的结果以及DHCP日志信息,然后打印了网络地址信息,这里可以看到配置方式为DHCP,IP地址为192.168.1.117,最后是PING提示消息。
接着在PC端打开CMD,PING W55MH32的IP地址,可以正常PING通。

7总结
本文介绍 DHCP协议,包括其在 IP网络自动分配参数的功能、便捷配置等特点、工作原理、报文格式和应用场景。通过 W55MH32实战例程展示动态获取网络地址信息过程,含注册定时器中断、启用模式和获取信息等步骤,烧录后可完成检测与信息打印,PC端能 PING通设备。
下一篇文章将讲解如何在 W55MH32芯片上实现 TCP客户端模式,解析 TCP客户端连接服务器进行回环测试的核心原理及应用,同时通过实战例程讲解具体实现步骤与要点,敬请期待!
WIZnet是一家无晶圆厂半导体公司,成立于 1998年。产品包括互联网处理器 iMCU™,它采用 TOE(TCP/IP卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU™面向各种应用中的嵌入式互联网设备。
WIZnet在全球拥有 70多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。
香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。
审核编辑 黄宇
-
以太网
+关注
关注
41文章
5923浏览量
179471 -
物联网
+关注
关注
2939文章
47312浏览量
407570
发布评论请先 登录
第二章 开发板与芯片介绍 详解W55MH32芯片及开发板
第三章 W55MH32 TCP Client示例
第五章 W55MH32 UDP示例
第六章 W55MH32 UDP Multicast示例
第九章 W55MH32 HTTP Server示例
第十章 W55MH32 SNTP示例
第十二章 W55MH32 NetBIOS示例
第十四章 W55MH32 TFTP示例
第十五章 W55MH32 SNMP示例
第十六章 W55MH32 PING示例
第十七章 W55MH32 ARP示例
第十八章 W55MH32 FTP_Server示例
第二十六章 W55MH32 上位机搜索和配置示例
第二十七章 W55MH32 Interrupt示例
第三十章 W55MH32 HTTP_Server&NetBIOS示例

第二章 W55MH32 DHCP示例
评论