【使用W5500实现UDP、TCP通信】

一、W5500介绍

W5500是一个集成的以太网模块,这个模块上携带TCP/IP协议,控制器只需要通过SPI协议读写其寄存器便可以以网络的方式进行数据交互。
W5500模块自带10个引脚,但由于使用其官方库,只需使用六个引脚便可以进行数据交互,这六个引脚分别为:VCC、GND、MISO、MOSI、SCS、SCLK。其中:
MISO:SPI主机输入从机输出引脚;
MOSI:SPI主机输出从机输入引脚;
SCS:SPI SLAVE选择引脚(低电平有效);
SCLK:时钟信号引脚。
和单片机的连线为:MISOPA6,MOSIPA7,SCSPA4,SCLKPA5。
在程序中操作的几个重要寄存器:
Sn_SR(Socket n 状态寄存器):指示了Socket n的状态,并根据 Sn_CR 或者一些 TCP 模式下的特殊控制包,如 SYN,FIN 包而改变;
Sn_MR(Socket n 模式寄存器):该寄存器用于配置所有 Socket 的选项或协议类型;
Sn_IR (Socket n 中断寄存器):该寄存器用于提供给 Socket n 中断类型信息;
Sn_RXBUF_SIZE (Socket n 接收缓存大小寄存器):该寄存器配置了 Socket n 的接收缓存大小。Socket n 接收缓存区大小可以配置为 1,2,4,8 和 16Kbytes。

二、UDP、TCP介绍

UDP是基于IP的简单协议,是不可靠的协议,其优点是简单、轻量化和速度快,缺点是没有流控制,没有应答确认机制,不能解决丢包、重发和错序问题。UDP不是面向连接的,是不可靠的传输。
TCP是面向连接的协议,也就是说,在收发数据前,必须和对方建立一个可靠的连接。 一个TCP连接必须要经过三次握手才能建立起来,简单的描述下这三次握手的过程:
首先,我让信使运输一份信件给对方,对方收到了那么他就知道了我的发件能力和他的收件能力是可以的,这是第一次握手。
然后,他就给我回信,我若收到了,我便知道了我的发件能力和他的收件能力是可以的,并且他的发件能力和我的收件能力也是可以的,这是第二次握手。
然而此时他还不知道他的发件能力和我的收件能力到底可不可以,于是我最后反馈一次,他若收到了,他便清楚了他的发件能力和我的收件能力是可以的,这便是第三次握手。
三次握手结束便建立起了连接。以上是一种通俗化的理解,其实在三次握手过程中会发送数据包,并根据数据包进行判断二者的收发能力。

三、程序实现TCPS、TCPC、UDP的过程

1、TCPS,单片机作为TCP的服务器,在该程序的实现部分通过函数获取Sn_SR寄存器的值来判断Socket的状态,若Socket处于关闭状态则调用函数打开Socket;若Socket已处于初始化状态则建立监听;若Socket处于连接建立状态,则清除接收的中断标志位并进行回环测试,接收来自Client的数据,并将此数据再次发送给Client;若Socket处于等待关闭的状态则调用函数关闭Socket。
2、TCPC,单片机作为TCP的客户端,同样在程序的实现部分通过函数获取Sn_SR寄存器的值来判断Socket的状态,若Socket处于关闭状态则调用函数打开Socket;若Socket已处于初始化状态则建立连接;若Socket处于连接建立状态,则清除接收的中断标志位并进行回环测试,接收来自Server的数据,并将此数据再次发送给Server;若Socket处于等待关闭的状态则调用函数关闭Socket。
3、UDP,在程序的实现部分通过函数获取Sn_SR寄存器的值来判断Socket的状态,若Socket处于关闭状态则调用函数打开Socket;若Socket处于UDP模式,则清除接收的中断标志位并进行回环测试,接收来自上位机的数据,并将此数据先发送至单片机再次发送给上位机,在此模式中不再需要建立连接,只需将IP地址和端口设置好即可。

四、遇到的问题及解决

在实现UDP的时候出现了上位机发送数据但是返回值是-1的情况,刚开始我去网上查找原因,说是recvfrom函数的问题,但这是一个官方库且我不太相信UDP实现函数没有问题,所以我就对UDP相关标志位进行了修改,修改过后就可以实现UDP的功能。
在其功能都实现了之后就开始将其移植到UCOS中去,想都没想直接将相关文件进行移动,并替换掉原来UCOS项目的文件,刚开始觉得不是太难,但是移植过后尝试运行失败,然后就进行一步一步的调试,发现跳过UART函数初始化之后网络可以进行连接,这时候恍然大悟,UART的相关设置发生变化导致整个系统启动出错,最后将UART初始化换了回去,便可以进行网络连接和串口输出。
五、回环测试截图

UDP回环测试: ![UDP回环测试](https://img-blog.csdnimg.cn/27292915146246f7a4cccfdecaf8eb07.png#pic_center)
TCPS回环测试: ![TCPS回环测试](https://img-blog.csdnimg.cn/4db4884664444dd982ee4939ddafb61d.png#pic_center)
TCPC回环测试: ![TCPC回环测试](https://img-blog.csdnimg.cn/70a7e41acb954559ac98621550dac3e4.png#pic_center)
### 回答1: 使用STM32W5500实现UDP通信可以通过以下步骤进行: 1. 初始化STM32W5500:在STM32中设置串口通信,配置GPIO引脚,使其与W5500的引脚相连接。通过SPI或者其他通信接口与W5500进行通信。 2. 配置W5500:通过SPI将配置信息发送给W5500。配置信息包括IP地址、子网掩码、默认网关和端口号等。 3. 创建UDP套接字:在STM32中调用相关函数创建一个UDP套接字。为套接字分配一个本地端口。 4. 绑定本地端口:将本地端口与套接字绑定,指定本地IP地址和端口号。 5. 监听端口:通过调用监听函数,使套接字开始监听从指定端口接收到的数据包。 6. 发送UDP数据:使用套接字发送UDP数据包。将发送的数据放入数据包中,指定目标IP地址和端口号,然后通过套接字将数据发送出去。 7. 接收UDP数据:使用套接字接收UDP数据包。通过监听函数检查是否有新的数据包到达,若有则从套接字中读取数据。 8. 处理接收到的数据:对接收到的数据进行处理,根据需要进行解析、处理或者展示。 9. 关闭套接字:在通信结束后,关闭UDP套接字,释放资源。 这样就完成了STM32W5500之间通过UDP协议进行通信实现。注意,以上只是大致步骤,具体的实现可能需要参考W5500STM32的相关文档和例程以获得更多的细节和指导。 ### 回答2: STM32是一款常用的嵌入式微控制器,而W5500是一款高性能的以太网控制器芯片。要实现STM32W5500之间的UDP通信,首先需要将W5500STM32连接,并对W5500进行初始化和配置。 首先,我们需要在STM32的开发环境中导入W5500的驱动库,这样可以简化与W5500通信操作。然后,我们需要在STM32中配置GPIO引脚与W5500相连的引脚,并将其配置为相应的功能,例如SPI或者I2C。 接下来,我们需要初始化W5500。这包括设置W5500的IP地址、子网掩码、网关等网络参数,以及配置通信端口和通信模式。同时,我们还需要设置数据缓冲区大小和相关中断功能。 一旦W5500被初始化,我们就可以在STM32使用相应的UDP库函数来实现UDP通信。我们需要设置目标IP地址和端口号,并发送数据。同时,我们需要设置STM32的中断服务程序,以接收来自W5500的数据。 最后,我们需要进行错误处理和调试。这包括检查返回值,确认数据是否已被发送或接收,并在必要时重新发送数据或重新连接。 综上所述,通过设置W5500的网络参数和配置STM32的相关引脚,并使用相应的UDP库函数进行数据的发送和接收,我们可以实现STM32W5500之间的UDP通信。这种通信方式可以应用于各种网络控制和数据传输的场景,为嵌入式应用提供了更强大的网络功能。 ### 回答3: 在STM32微控制器上使用W5500芯片实现UDP通信可以通过以下步骤实现。 首先,需要配置STM32的GPIO引脚和SPI总线,以使其与W5500芯片之间进行通信。针对W5500的SOCKET0进行配置,包括设置IP地址、端口号、传输模式等参数。在此之前,需要确定本地IP地址以及目标IP地址和端口号。 其次,需要初始化W5500芯片并设置其寄存器,包括在TCP/IP协议栈上启用UDP传输模式,并选择适当的传输模式和端口号。 接下来,可以使用STM32的SPI接口通过读写寄存器的方式与W5500芯片进行通信。通过SPI接口将数据包发送到W5500的TX缓冲区,并通过SOCKET0发送UDP数据包。 当数据成功发送后,W5500会将数据包从TX缓冲区发送到目标IP地址和端口。在接收数据时,W5500会将接收到的UDP数据包存储在RX缓冲区中,可以通过STM32的SPI接口读取这些数据。 最后,可以通过适当的处理和解析来处理接收到的UDP数据包,例如提取其中的数据内容并进行相应的操作。 以上就是在STM32微控制器上使用W5500实现UDP通信的基本步骤。通过合理地配置和操作W5500芯片,与目标设备之间可以实现可靠的UDP数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值