嵌入式技术william hill官网
直播中

siyugege

8年用户 763经验值
擅长:可编程逻辑
私信 关注
[问答]

W5500发送超时中断响应却未清除中断标志咋办?

主要是用于 电脑端网线 掉线检测

测试条件:

使用的时tcp server 非阻塞的方式进行收发 和 主动发送 的
参考的文章:多线程非阻塞网络编程

只不过我改成了tcp server 模式

设置超时时间

W5500即使不设置,也存在一个初始的超时时间,手册里写的200ms,但我读取测试发现是2s
(本来想用 setsockopt 进行设置,发现没有效果,应该是没适配W5500,所以这里采用直接设置 W5500里的超时寄存器)

2.jpg

3.jpg

设置一个单独线程,用于主动发送数据到客户端

static void tcpserv_send(void arg)
{
RT_ASSERT(arg);
rt_netfd_t
thiz = arg;
rt_uint16_t len;
char send_buf[256];
while(1)
{
rt_sprintf(send_buf, "RTR:%d, RCT:%d", getRTR(), getRCR());
len = rt_strlen(send_buf);
write(thiz->pipe_send_fd[1], send_buf, len);
rt_thread_mdelay(1000);
}
}

bug情景再现:

第一阶段,测试的是手动关闭socket,重连后连接正常,通讯都正常
第二阶段,测试的是电脑端网线拔掉后2s内接回,结果同上
第三阶段,测试的是电脑端网线拔掉后 直到W5500 自动关闭

socket,结果发现重连后 W5500能往外发送数据,却无法接收数据,且任何中断不响应了。

2.jpg

手册中断说明:

2.jpg

这里结果很明显了,应该是响应了发送超时中断,却未进行清除,导致所有中断都无法响应了

解决办法:

在发送的过程中如果检测到了 socket关闭,还需增加:判断一下是否是发送超时,是的话清零

2.jpg

再次实验: 所有情况都正常,且能实现电脑端的网线 掉线检测

回帖(2)

王波

2023-2-2 13:57:46
IR和Sn_IR是两个寄存器。
1 举报
  • jf_93230807: 想向您请教一下问题。
    在初始化W5500时,会对芯片设置超时重试时间和重试次数,一般重试时间为200ms,重试次数为8次。
    现在我遇到的问题是:当设备网口不进行连接时,会导致主芯片每一次顺序执行时都会死等1600ms,当设备与网络设备网口连接后(不管有没有连接上其他设备)都能正常运行。应该是我的初始化还是那里存在问题。我在网上查找了一下,没有遇到过我这种情况。

jf_93230807

2024-6-27 14:52:06
想向您请教一下问题。
在初始化W5500时,会对芯片设置超时重试时间和重试次数,一般重试时间为200ms,重试次数为8次。
现在我遇到的问题是:当设备网口不进行连接时,会导致主芯片每一次顺序执行时都会死等1600ms,当设备与网络设备网口连接后(不管有没有连接上其他设备)都能正常运行。我在网上查找了一下,没有遇到过我这种情况,
举报

更多回帖

发帖
×
20
完善资料,
赚取积分