W5500以太网模块使用socket0做服务器模式有个RST报文的问题:
用中断查询的方式,查到Sn_IR寄存器有DISCON标志位时认为断开连接,此时在closewait半关断状态向CR寄存器写入DISCON之后紧接着执行了向CR寄存器写入close函数,所以出现挥手时一个RST报文;
解决办法:
W5500的状态查询流程不使用中断标志作为判断依据,使用Sn_SR寄存器的状态作为判断依据,W5500总体逻辑如下;
①、初始化SPI
②、硬件复位W5500
③、装载W5500网络参数,如ip地址,网关等;
④、执行状态机:
在状态机里的ESTABLISHED状态做查询Sn_IR中断的RECV标志,如果置位则有数据到达,进行处理;
如果客户端断开连接,会在CLOSE_WAIT状态,W5500向Sn_CR寄存器写入DISCON之后SR寄存器进入CLOSED状态,在CLOSED状态内先关掉socket,然后设置端口号,设置为TCP模式,设置keepalive时间,打开socket,当打开socket成功且MR处于TCP模式时,进入INIT状态,此时服务器可打开监听,打开监听后如果客户端连接请求被成功接收,则进入ESTABLISHED状态;