W5500-IoT回环接口代码分析

  • 东方青
  • LV4工程师
  • |      2015-11-06 12:51:14
  • 浏览量 7201
  • 回复:8

**************************************************************************

                                       东方青学W5500-IoT

                                        ———————转载请注明ICKey————————

**************************************************************************


W5500-IoT回环接口代码分析

-----东方青

上次移植好了有WIZnet提供的ioLibrary_Driver设备驱动库,并且以loopback作为移植成功的测试。那么为了更加清楚的了解W5500的特性和使用的配置,包括寄存器使用等等,将仔细对一个实例进行分析,已得到理解和应用结合的效果。所以在网络通信中,loopback是最佳的选择,因其简单和常常被用来进行网络通信测试的协议。

那么loopback是什么呢?其实他是一个回环接口的实现,这个接口是虚拟的网络接口。那么什么是回环接口呢?

Loopback回环接口是一个虚拟的网络接口,其在不同的应用领域,其含义和作用也有区别。下面分别介绍一下它的常用方式。

1.loopback测试网络通信

很多人可能有过这样的体验,比如在使用VMware虚拟机安装了Linux或者其他操作系统,又或者在一个局域网中的两台主机之间,为了测试它们组成了局域网,我们通常的方法是使用命令ping 192.168.xxx.xxxping IP地址)来测试是否通讯成功,是否在一个局域网内。还有就是有时为了测试自己本机的网卡是否成功启动,直接使用命令ping 127.0.0.1进行测试。

那么为何一定要使用这种方法来测试呢?其实呢,在通信领域中,loopback是指通过软件或硬件的方式,将接收到的信号或数据直接返回给发送者的测试方法。作为测试方法,很多通信设备都可以配置端口的数据为发送模式(all ones)来检测同一个端口上的信号接收。那么这种测试就叫回环测试。

还存在一种回环叫硬件loopback,调过单片机的人,有可能都干过将USART/UART接口的TxRx直接相连,由自己发送自己接收。这也是一种回环。所以通常硬件loopback一般是指在物理上将发送和对应的接收通道相连,所有的loopback设备发送的数据将被自己接收,这是不是有点ping 127.0.0.1的感觉呢?但是他们的实现完全是不同的方法哦!这种方法可以测试不同位置两点之间的电路连接。

2.TCP/IP协议栈的loopback

TCP/IP协议栈中,通过软件的方式来实现了虚拟网络接口来提供给回环设备。它不与任何硬件相关联,loopback接口一般被完整的集成在系统的内部网络架构中。

IP协议中的loopback地址:

RFC2606中明确指出了loopback地址的标准域名为localhost。在IPv4中,其对应的IP地址一直是127.0.0.1;理论上,整个127 IP段(127.0.0.0~127.255.255.255)的IP地址都为loopback地址,与localhost对应。在IPv6中,localhost对应的IP地址为0:0:0:0:0:0:0:1,一般写作::1

loopback接口的功能:

(1)用于网络服务测试,避免由于远程网络的接入带来的安全问题;一般用作client/Srver类的网络服务的测试,在测试时,clientserver运行在同一台主机上,client通过使用loopback地址访问server

(2)测试IP协议栈,通过ping loopback地址的方式来测试操作系统中IP协议栈是否正常。

(3) 在网络中,所有源地址属于loopback地址的数据包将会被丢弃。IP协议规定loopback数据包是不允许在网络中传输的。网络网络接口必须丢弃接收到的loopback数据包。

3.网络设备中的loopback

在网络设备中,loopback被用来代表某些用于管理目的的虚拟接口,其含义并没有"回环"的意思。

loopback虚拟接口会分配到一个IP地址,但是这个IP地址不会对应到实际的物理接口。网络设备中的loopback地址主要用于管理目的,例如设备发出的报警。网络设备中的应用程序(管理程序)使用loopback地址发送可接收数据流,而不是使用实际物理接口的地址。对外部来说,直接使用loopback地址来查看设备对应的信息(如报警信息),与网卡的物理地址无关。

以上内容来自:https://en.wikipedia.org/wiki/Loopback

OK!基本上对回环接口有了一个比较全面的认识,那么,一切回归,以代码实现和W5500的手册说话!所以应该从loopback.c文件的实现开始。在loopback.c文件中,值存在3个实现函数,分别为loopback_tcps()loopback_tcpc()loopback_udps()。如下图:

W5500-IoT回环接口代码分析

如上图,基本上可以明确了,三个函数的功能分别是作为TCP 通信loopback服务器、作为TCP通信loopback客户端和作为UDP通信loopback服务器的测试代码。

下面就开始逐个分析了。

1.loopback_tcps()

W5500-IoT回环接口代码分析
W5500-IoT回环接口代码分析

如上两图即为loopback_tcps()函数的原型了!要弄清楚这个函数的实现思路,其实很简单,只需弄懂如上两图中我用红线标出的语句或等式的含义,基本上就能得出想要的答案了。下面逐个进行分析:

(1)int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)函数的三个参数的含义

先来看在主函数中的调用:

W5500-IoT回环接口代码分析

如上图,主要参数,定义如下:

W5500-IoT回环接口代码分析

从函数原型和调用可知,第三个参数port为端口号,第一个参数Sn取宏定义值0,有点疑惑!第二个直接使用一个数组,也比较疑惑。不过可以确定,gDATABUF数组的大小为2KB

W5500Datasheet可知,W5500为用户提供了32K的缓存空间,其中16KB作为发送数据缓存另外16KB为接收数据缓存。另外关于W5500内部寄存器的资源介绍如下图:

W5500-IoT回环接口代码分析

所以,凭此基本上可以猜测,gDATABUF数组的作用应该是存放从网络读取到的数据,因为此时的TCP作为服务端;而参数Sn的作用应该就是socket的通道编号了,取值0~7。不过这仅仅只是猜测,需要进一步分析。

(2)getSn_SR(sn)的含义

目测,才调用应该是操作寄存器的调用,并且应该是获取寄存器的状态值。那么跟进找到原型,如下图:

W5500-IoT回环接口代码分析

一切表述已经在上图中!但是很有必要查看此寄存器了解情况。

W5500-IoT回环接口代码分析
W5500-IoT回环接口代码分析

如上两图!基本上确认了一件事!寄存器Sn_SR是作为状态寄存器为MCU通过通信参考的信息,以便MCU判断该如何进行配置W5500与外部通过网络通信。并且如上图中,当在TCP模式下,只需要判别四种状态,分别为SOCK_ESTABLISHEDSOCK_CLOSE_WAITSOCK_INITSOCK_CLOSED命令。这是否就是在函数原型的switch语句的4case语句的参数呢?没错就是它。

(3)getSn_IR(sn)的含义

有了以上分析的经验,不难推出此函数作为读取Sn_IR寄存器的值,调用原型不再跟踪,现在来看此寄存器。

W5500-IoT回环接口代码分析

从上面描述可知,Sn_IR寄存器是作为为MCU通过Socket的中断类型,并且此寄存器对应于每一个通道的Socket,即存在8Sn_IR寄存器。

(4)Sn_IR_CON的含义

在调用中Sn_IR_CON是和getSn_IR(sn)做按位与运算作为判断条件的,那么其值应该与getSn_IR(sn)有关!其原型如下:

W5500-IoT回环接口代码分析

一切明白了!原型中的语句if(getSn_IR(sn) & Sn_IR_CON)检查的是Sn_IR寄存器的CON。即成功建立连接后,是否有中断产生。

(5)setSn_IR(sn,Sn_IR_CON)的含义

一样的道理,这里还是操作Sn_IR寄存器,不够这里是写。调用原型为setSn_IR(sn,Sn_IR_CON);貌似要将Sn_IR寄存器的CON置位哦。原型如下:

W5500-IoT回环接口代码分析

果然是向Sn_IR寄存器的CON1。上面的寄存器说明已经表述,当向此寄存器的某一位写1,即是将其清0。现在联系调用上下文:

W5500-IoT回环接口代码分析

如上图,如果产生中断,Sn_IR寄存器CON被置1,则干完一堆事之后,将其清0,即为清中断。

(6)SOCK_ESTABLISHEDSOCK_CLOSE_WAITSOCK_INITSOCK_CLOSED的含义

其实关于这四个命令,在上述的Sn_SR寄存器上就已经表述了。在整个函数功能的实现中,通过读取Sn_SR寄存器的返回命令,来执行相关的操作,并且与之通信。而且在寄存器中也明确的说明,与TCP通信模式相关的即为如上4个命令。所以MCU听命令行事即可。

基本上loopback_tcps()函数的框架就已经分析清楚了。通过此框架就简单的实现了TCP通信回环接口的服务器端功能。再一次看看主函数调用:

W5500-IoT回环接口代码分析

如上图,首先是使用Socket 0通道作为TCP Server的通信通道,通过读取Socket 0通道的Sn_SR寄存器和SN_IR寄存器的状态来判断要执行的操作,正常实现通信。

2.loopback_tcpc()

W5500-IoT回环接口代码分析
W5500-IoT回环接口代码分析

如上两图即为TCP客户端回环的实现代码了!其实从函数原型基本上可以看出,它和TCP服务器算回环的实现框架是一模一样的,只是具体的实现有差别而,因为服务需要一直监听,等等客户端来访问,而作为客户端它是有主动访问服务器端的能力的。所以对于loopback_tcpc()函数参数的含义解释如下图:

W5500-IoT回环接口代码分析

就这样结束了!具体的实现也很简单!在此只分析框架。

3.loopback_udps()

W5500-IoT回环接口代码分析

上图即为UDP通信服务器端的程序设计了。从原型实现源码来看,貌似比TCP的实现要简单很多啊!只对Sn_SR寄存器返回的SOCK_UDP命令和SOCK_CLOSED命令进行判断,然后实现通信。

W5500-IoT回环接口代码分析

如上图即为Sn_SR寄存器的命令值的介绍了。注意哈,当OPEN命令生效时,就会工作在SOCK_UDP命令模式下,此时就可以进行面向无连接的进行数据包的传输了。啥意思呢?因为UDP通信是面向无连接的不可靠的通信协议,它不需要保证数据包是否能够到达目的地。

在函数loopback_udps()的实现中,有一个getSn_RX_RSR(sn)关于寄存器的操作,应该是获取Sn_RX_RSR寄存器的值。

W5500-IoT回环接口代码分析

如上图即为Sn_RX_RSR寄存器的说明了,读取它的原因是,它的值反馈了Socket n通道的接收缓存中已经接收和保存的数据的大小。注意哈!默认的每个Socket通道的缓存空间是2K哦。

函数实现的最后无非就是从通道中读取收到的数据,然后原样的将其发送出去。就是如此的简单。

那么现在来看看其在主函数的调用,如下图:

W5500-IoT回环接口代码分析

采用了Socket 1通道作为UDP服务器端的回环实现,gDATABUF数组提供了缓存。剩下的就是端口号了。

总结:之所以会对loopback的实现进行分析,究其原因是因为初次使用W5500,通过对一个简单的原型实现进行分析来了解W5500的硬件配置方式、寄存器和内存的配置使用等等,还有就是对WIZnet官方对其的源码架构进行熟悉和理解,从而便于后面的学习和开发!

通过对loopback实现源码架构的分析,基本上对W5500的寄存器和配置方法有一个详细的理解,再就是通过代码的跟踪,也清楚的了解了源码实现的架构,通过对这些的理解,更容易的将自己的代码融合到架构中去。

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:7
海豚湾312 2019-04-10
学习一下,mark
0   回复
举报
发布
liupk 2018-03-02
可以,正在接触这个
0   回复
举报
发布
WISIOE2016 2017-05-11
提供技术支持18924587312,W5500代理商 深圳炜世科技
0   回复
举报
发布
slotg 2015-11-06
很好的分享,顶一个。
0   回复
举报
发布
东方青 2015-11-06
0   回复
举报
发布
东方青 2015-11-06
只有一楼!哈哈!
0   回复
举报
发布
gjianw217 2015-11-06
抢占最高峰!
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子