W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。支持多路socket独立通信,通信效率互不影响。本教程将介绍W5100S/W5500以太网多路socket应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。
多路socket的优点主要体现在以下几个方面:
服务器建立多路socket的流程可以按照以下步骤进行:
多路socket应用是指使用socket接口进行网络通信,并允许多个客户端或服务器同时建立连接的应用程序。以下是一些常见的多路socket应用:
WIZnet 主流硬件协议栈以太网芯片参数对比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8bit BUS, SPI | 16KB | 4 | Max.25Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8bit BUS, Fast SPI | 32KB | 8 | Max.25Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32KB | 8 | Max 15Mbps |
程序的运行框图如下所示:
软件
硬件
通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
通过TTL串口转USB,连接UART0 的默认引脚:
使用模块连接RP2040 进行接线时
通过PC和设备都通过网线连接路由器LAN口
我们使用的是WIZnet官方的ioLibrary_Driver库。该库支持的协议丰富,操作简单,芯片在硬件上集成了TCP/IP协议栈,该库又封装好了TCP/IP层之上的协议,我们只需简单调用相应函数即可完成协议的应用。
第一步:tcp_server_multi_socket.c文件中加入对应的.h文件。
第二步:定义DHCP配置需要的宏。
第三步:网络信息的配置,开启DHCP模式。
第四步:编写定时器回调处理函数,用于 DHCP 1秒嘀嗒定时器处理函数。
第五步:主函数先是定义了一个定时器结构体参数用来触发定时器回调函数,对串口和SPI进行初始化,然后写入W5100S的网络配置参数,初始化DHCP后开始DHCP获取IP,获取到就打印获取到的IP,获取次数超过最大获取次数时就使用静态IP,主循环进行服务器运行函数中。
第六步:我们看到服务器的函数的运行函数,先是打开socket,创建服务器,然后开始监听,如果有客户连接socket号会进行加一操作,W5100S最多支持4路socket,W5500最多支持8路socket。循环检测客户端发来的消息,并打印出对应连接客户端的信息。
void do_tcp_server(void)
{
static uint8_t sock_cof = 0;
uint16_t len = 0;
uint8_t destip[4];
uint16_t destport;
switch (getSn_SR(sock_cof)) /*Get the socket status*/
{
case SOCK_CLOSED: /*The socket is closed*/
socket(sock_cof, Sn_MR_TCP, local_port, Sn_MR_ND); // Open socket
break;
case SOCK_INIT: /*The socket is in the initialization state*/
listen(sock_cof); /*socket starts listening*/
break;
case SOCK_ESTABLISHED: /*The socket is in the connection establishment state*/
if (getSn_IR(sock_cof) & Sn_IR_CON) /*Receive interrupt flags clearly*/
{
setSn_IR(sock_cof, Sn_IR_CON);
}
len = getSn_RX_RSR(sock_cof);
if (len > 0)
{
recv(sock_cof, buff, len); /*print the receive data.*/
buff[len] = 0x00;
getSn_DIPR(sock_cof, destip);
destport = getSn_DPORT(sock_cof);
printf("socket%d form:%d.%d.%d.%d port: %d message:%s\r\n", sock_cof, destip[0], destip[1], destip[2], destip[3], destport, buff);
send(sock_cof, buff, len);
}
break;
case SOCK_CLOSE_WAIT: /*The socket is waiting to be closed*/
close(sock_cof);
break;
}
#if (_WIZCHIP_ == W5100S)
if (sock_cof < 4)
{
sock_cof++;
}
else
{
sock_cof = 0;
}
#elif (_WIZCHIP_ == W5500)
if (sock_cof < 8)
{
sock_cof++;
}
else
{
sock_cof = 0;
}
#endif
}
(1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。
(2)在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。
想了解更多,评论留言哦!