PING 是DOS 命令,它是用来检查网络是否通畅或者网络连接速度的命令。
利用的原理是:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包, 根据返回的数据包我们可以确定目标主机的存在。
而最新推出的W5100S,则将PING功能通过硬件实现,并固化在芯片内,方便客户使用。无需编写PING功能的相关程序代码,只需简单的寄存器配置即可使用PING功能。
一、使用Scoket-less命令流程
从上图我们可以看出,Socket - less 命令的使用,整体流程还是十分明了的。
开始,配置相关寄存器的数值,完成后启动Socket - less 命令,启动后则判断对端的回应与超时的判断。
而在这个整体流程中,最主要的难点在于寄存器配置部分。
二、关于Socket - less PING 功能的寄存器
我们在使用Socket - less 命令时,只需要配置以下寄存器即可完成PING功能的调用。
1.SLRTR(SOCKET - less 重传超时时间寄存器)
配置PING的超时重传时间基本单位是100us,当过了时间则会启动重传机制。
2.SLRCR(SOCKET - less 重传次数寄存器)
设定重传次数,若当前重传次数 >= 重传次数 + 1时,则判定为TIMEOUT。
3.SLPIPR(SOCKET - less 目标IP地址寄存器)
硬件PING的目标IP。
4.PINGSEQR(PING序列号寄存器)
PING请求数据包的报头序列号。
5.PINGIDR(PING ID寄存器)
PING请求数据包的报头数据包ID。
6.SLIMR(SOCKET - less 中断屏蔽寄存器)
选择开启/关闭PING与TIMEOUT中断。
7.SLCR(SOCKET-less控制寄存器)
发送相关请求的使能寄存器。
三、相关寄存器的配置及Socket - less 命令调用
使用硬件PING时仅需要设置这几个相关寄存器即可。具体配置流程如下代码:
void hw_ping_init(void) { setSLRTR(0x03E8); // 重传超时时间设置:1000 * 100us setSLRCR(3); // 重传次数设置:3次 /* 使用中断时可开启该配置 */ setSLIMR(0x05); // 中断开启 PING & TIMEOUT setPINGSEQR(0x03E8); // 请求数据包序列号设置:1000 setPINGIDR(0x0100); // 请求数据包ID:100 }
上述代码使用硬件PING功能时,无特殊要求那么设置一次即可。设置先后顺序不作要求。
void hw_ping(uint8* ip) { setSLPIPR(ip); // 目标IP设置:PING对象IP setSLCR(0x01); // 发送PING请求 }
这部分代码在需要使用一次硬件PING功能时,进行一次调用。
而判断PING的结果,则可使用中断进行判断,超时还是响应都会发生次中断,具体如下:
switch(getSLIR()) { case 0x01: // PING回应标志 setSLIR(0x01); getSLPHAR(remote_mac); printf(" 已收到来自 %d.%d.%d.%d 的PING回应。", hw_ping_ip[0],hw_ping_ip[1],hw_ping_ip[2],hw_ping_ip[3]); break; case 0x04: setSLIR(0x04); printf(" 来自 %d.%d.%d.%d 的回复:无法访问目标主机。",hw_ping_ip[0], hw_ping_ip[1],hw_ping_ip[2],hw_ping_ip[3]); break; default:break; }
中断发生后,根据PING的SLIR寄存器的数值,判断对方是给予反馈,还是已经超时。
四、代码运行结果
电脑IP:192.168.1.100
W5100S 与电脑连接在同一路由器下。
W5100S 硬件PING IP:192.168.1.100
当电脑网线接入时:
当电脑网线拔掉时: