#W5500以太网控制芯片相关文章链接#

上一篇文章:
W5500以太网控制器芯片(二):ioLibrary库实现TCP客户端

如果要W5500的IP动态分配,则要实现DHCP功能,实现流程如下:

准备工具(和上篇一致):

a、电脑上装一个网络调试工具,做TCP服务器用

b、一个路由器,后面电脑和W5500都要接到路由器上

c、W5500+支持SPI接口的MCU或者SOC

d、官方的ioLibrary库文件

1、移植驱动

除了之前引入的文件,还要将固件库里Internet文件夹下的DHCP文件夹的文件引入你的项目工程中,分别是dhcp.c和dhcp.h

 2、初始化DHCP

(1)此处从NETINFO_STATIC改为NETINFO_DHCP

//Default Network Configuration
wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc,0x00, 0xab, 0xcd},.ip = {192, 168, 1, 123},.sn = {255,255,255,0},.gw = {192, 168, 1, 1},.dns = {114,114,114,114},.dhcp = NETINFO_DHCP,
};

(2)新增、更改几个函数

/******************************************************** @ brief Call back for ip assing & ip update from DHCP*******************************************************/
void my_ip_assign(void)
{getIPfromDHCP(gWIZNETINFO.ip);getGWfromDHCP(gWIZNETINFO.gw);getSNfromDHCP(gWIZNETINFO.sn);getDNSfromDHCP(gWIZNETINFO.dns);gWIZNETINFO.dhcp = NETINFO_DHCP;/* Network initialization */network_init();      // apply from dhcpprintf("DHCP LEASED TIME : %ld Sec.\r\n", getDHCPLeasetime());
}/************************************* @ brief Call back for ip Conflict************************************/
void my_ip_conflict(void)
{printf("CONFLICT IP from DHCP\r\n");//halt or reset or any...while(1); // this example is halt.
}//网络初始化(DHCP)
void network_init(void)
{uint8_t tmpstr[6] = {0,};wiz_NetInfo netinfo;// Set Network information from netinfo structurectlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);// Get Network informationctlnetwork(CN_GET_NETINFO, (void*)&netinfo);// Display Network Informationctlwizchip(CW_GET_ID,(void*)tmpstr);if(netinfo.dhcp == NETINFO_DHCP) printf("\r\n=== %s NET CONF : DHCP ===\r\n",(char*)tmpstr);else printf("\r\n=== %s NET CONF : Static ===\r\n",(char*)tmpstr);printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",netinfo.mac[0],netinfo.mac[1],netinfo.mac[2],netinfo.mac[3],netinfo.mac[4],netinfo.mac[5]);printf("SIP: %d.%d.%d.%d\r\n", netinfo.ip[0],netinfo.ip[1],netinfo.ip[2],netinfo.ip[3]);printf("GAR: %d.%d.%d.%d\r\n", netinfo.gw[0],netinfo.gw[1],netinfo.gw[2],netinfo.gw[3]);printf("SUB: %d.%d.%d.%d\r\n", netinfo.sn[0],netinfo.sn[1],netinfo.sn[2],netinfo.sn[3]);printf("DNS: %d.%d.%d.%d\r\n", netinfo.dns[0],netinfo.dns[1],netinfo.dns[2],netinfo.dns[3]);printf("===========================\r\n");
}

(3)主函数更改:初始化DHCP服务,分配IP,随后连接远程的TCP服务器

#include "socket.h"    // Just include one header for WIZCHIP
#include "dhcp.h"#define SOCK_TCPC       0
#define SOCK_TCPS       1
#define SOCK_DHCP       2#define MY_MAX_DHCP_RETRY  3
#define DATA_BUF_SIZE   2048int main(void)
{delay_init();              //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2uart_init(115200);     //串口初始化LED_Init();SPI2_Init();/* Critical section callback *///reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit);    //注册临界区函数reg_wizchip_cris_cbfunc(NULL, NULL); // 注册临界区函数reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);// 注册片选函数/* SPI Read & Write callback function */reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注册读写函数/* WIZCHIP SOCKET Buffer initialize */if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){printf("WIZCHIP Initialized fail.\r\n");while(1);}/* PHY link status check */do{if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){printf("Unknown PHY Link stauts.\r\n");}}while(tmp == PHY_LINK_OFF);/* Network initialization */
//  network_init();      //使用DHCP屏蔽此处// must be set the default mac before DHCP started.setSHAR(gWIZNETINFO.mac);DHCP_init(SOCK_DHCP, gDATABUF);// if you want defiffent action instead defalut ip assign,update, conflict,// if cbfunc == 0, act as default.reg_dhcp_cbfunc(my_ip_assign, my_ip_assign, my_ip_conflict);/* Main loop */while(1){dhcp_test();delay_ms(100);LED1 = 0;delay_ms(100);LED1 = 1;} // end of Main loop
}uint8_t my_dhcp_retry = 0;//dhcp测试
void dhcp_test(void)
{uint8_t res= 0;switch(DHCP_run()){case DHCP_IP_ASSIGN:case DHCP_IP_CHANGED:/* If this block empty, act with default_ip_assign & default_ip_update *///// This example calls my_ip_assign in the two case.//// Add to ...//break;case DHCP_IP_LEASED://// TO DO YOUR NETWORK APPs.loopback_tcpc(SOCK_TCPS, gDATABUF, dest_ip, dest_port);break;case DHCP_FAILED:/* ===== Example pseudo code =====  */// The below code can be replaced your code or omitted.// if omitted, retry to process DHCPmy_dhcp_retry++;if(my_dhcp_retry > MY_MAX_DHCP_RETRY){printf(">> DHCP %d Failed\r\n", my_dhcp_retry);my_dhcp_retry = 0;DHCP_stop();      // if restart, recall DHCP_init()network_init();   // apply the default static network and print out netinfo to serial}break;default:break;}
}

4、更改完成,上电验证结果

我们原先程序里的 ip是这样的:

//Default Network Configuration
wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc,0x00, 0xab, 0xcd},.ip = {192, 168, 1, 123},.sn = {255,255,255,0},.gw = {192, 168, 1, 1},.dns = {114,114,114,114},.dhcp = NETINFO_DHCP,
};

使用DHCP服务后,发生了变更:

可以看到,网关10.1.1.1给W5500分配了10.1.1.237作为IP,DHCP服务生效,随后连接上了远程服务器。

现在只要将设备连接到提供DHCP服务的网口上,无论区域网实际的网段是什么,W5500都会分配到一个在该网段下的IP,连接上远程服务器。程序里的IP、网关随便填一个即可,DHCP服务会将其分配好。

需要注意的是:分配IP是根据设备MAC地址的,所以MAC在同一个网段里应是唯一的,否则分配IP可能会出现问题。

下一篇:​​​​​​​
W5500以太网控制器芯片(四):实现DNS功能

W5500以太网控制器芯片(三):实现DHCP服务相关推荐

  1. W5500以太网控制器芯片(四):实现DNS功能

    #W5500以太网控制芯片相关文章链接# 上一篇: W5500以太网控制器芯片(三):实现DHCP服务 使用W5500时,如果要连接的是域名,则连接TCP服务器前将要域名转成IP再进行连接,这时候就要 ...

  2. Wiznet W5500以太网控制器应用笔记

    引用数据手册的芯片介绍:"W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案.W5500 集成了TCP/IP 协议栈,10/100M 以太 ...

  3. Linux DHCP 服务

    一.概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局 域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网 ...

  4. RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信

    目录 1.介绍 1.1 WIZnet 1.2 W5500 2.RT-Thread Studio 配置及相关代码 2.1 添加WIZnet软件包 2.2 配置 WIZnet 软件包 2.3 配置 spi ...

  5. W5500全硬件 TCP/IP 嵌入式以太网控制器WIZNET

    概述 W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案. W5500 集成了 TCP/IP 协议栈,10/100M 以太网数据链路层(MAC)及物 ...

  6. 【硬件】以太网PHY芯片有三个时钟说明

    硬件以太网PHY芯片有三个时钟,对此进行了梳理: PHY芯片时钟的选择: PHY芯片中有3个时钟, Gtx_clk,Rx_clk ,Tx_clk. 1) GTX_CLK仅使用在GMII模式下,时钟频率 ...

  7. 从零开始 verilog 以太网交换机(三)MAC发送控制器的设计与实现

    从零开始 verilog 以太网交换机(三)MAC发送控制器的设计与实现

  8. DHCP服务和NIS服务

    <本章目标> ■ 掌握Linux系统网络配置 ■ 掌握DHCP和NIS的服务器配置和客户端使用 ■ 使用DHCP中继代理实现跨网段的网络地址自动分配 ■ 使用NIS服务实现主机和用户帐户的 ...

  9. 基于stm32之w5500以太网应用

    基于stm32之w5500以太网应用 强调一下前半段为基础知识普及(这段还是很重要的.不管用什么工具开发精通协议才是王道),后半段为实战代码干货. 如上图所示,最底下的一层叫做"物理层&qu ...

最新文章

  1. 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)
  2. 7-28 猴子选大王 (C语言)
  3. java - 第一阶段总结
  4. golang语言学习第三课 条件语句
  5. poj3784 Running Median查找中位数
  6. Linq怎么支持Monad
  7. 超图桌面版新建一个简单三维数据集并发布
  8. 数据库的硬迁移和mysql 5.5.38源码安装
  9. immutable.js笔记
  10. 中国科学院大学计算机金智,金智-中国科学院大学-UCAS
  11. Register DLL and OCX
  12. day25-静态、组合、继承
  13. 免费下载百度文库的几款在线工具推荐
  14. 8086CPU 的寻址方式(重点)
  15. Linux服务端rpm包安装Jenkins
  16. java中后台的跳转_java后台跳转
  17. 使用node加密excel文件
  18. android app防止锁屏_设置Android系统永不锁屏永不休眠的方法
  19. 三星a5100多少钱_请问三星A5100现在啥价格?
  20. real time robust malicious traffic detection via frequency domain analysis记录一下

热门文章

  1. Angular8通过npm引入Mapbox GL 和 Ant L7
  2. 银行理财、货币基金和理财型基金的区别
  3. C# 窗口最小化到托盘及右键图标显示菜单
  4. php能不能实现网页截图,关于php:PHP实现网页截图
  5. 夏敏捷第29本著作《Python课程设计》(微课视频版)
  6. 2022-2027年中国麻类种植行业市场全景评估及发展战略规划报告
  7. Qt编写安防视频监控系统44-视频上传
  8. 优动漫PAINT基础系列之拾色器教学
  9. 如何使用Hadoop读写数据库
  10. springboot学习记录--Maven setting配置