STM32F4 + Wiznet W5100 -> 几分钟后 TCP 连接超时
STM32F4 + Wiznet W5100 -> TCP connection timeout after some minutes
我已经为 Wiznet W5100 以太网芯片(目前位于 WIZ812MJ 分线板上)编写了一个驱动程序。它通过 SPI1 连接。
一切正常 - ping、tcp 客户端模式、接收和发送数据 - 但是,在随机时间(从 1 分钟到 10 分钟)后连接突然关闭! 我试图调试发生的所有步骤,但我找不到任何有用的东西。有没有人遇到过类似的问题?
由于驱动程序是为我的公司编写的,所以我不能将所有代码都放在这里,但我会尝试粘贴(对我来说)最重要的部分。 其中大部分是伪代码,但您可以假设 SPI 通信正常并且所有寄存器都设置为给定值!
流程图:
W5100_Init - 通过 SPI 引脚配置并进行 W5100 初始化
Pass SPI configuration
Write reset-cmd to MR register
Write retry time-value to RTR register (0x07D0 = 2000ms)
Write retry count to RCR register (0x05)
Write socket memory information to TMSR/RMSR register (0x55)
W5100_NetworkInit - 写入 GW,MAC,子网掩码和 IP 地址
Write Gateway to GAR register
Write MAC to SHAR register
Write Subnet to SUBR register
Write IP to SIPR register
W5100_SocketInit - 将重要的套接字寄存器映射到给定套接字并初始化套接字
/*This maps all important/required ports to the socketConfig struct*/
if(socketX == SOCKET0)
{
socketConfig.PORT0 = W5100_ADDR_S0_PORT0;
socketConfig.PORT1 = W5100_ADDR_S0_PORT1;
socketConfig.MR = W5100_ADDR_S0_MR;
socketConfig.CR = W5100_ADDR_S0_CR;
socketConfig.SR = W5100_ADDR_S0_SR;
//...
}
Write protocol type to MR register
write Port to PORT register
Write CMD_OPEN to CR register
使用客户端模式:
Write server IP to DIPR register
Write server Port to DPORT register
现在我们已经在客户端模式下建立了 tcp 连接,开始循环。
Check socket status from SR register
If there's any data on the line, call W5100_Socket_ReceiveData method
这在一段时间内工作正常(最近 运行:10 分钟),但突然套接字状态 returns 0x00 并且连接关闭。还有什么重要的事情我可能忘记了吗?为什么套接字关闭?
非常感谢您提供任何提示!
最终,我自己找到了答案。问题不是基于我的代码,而是关于 EMC:Wiznet 芯片重置。但重置本身与时间无关,但总是在我从椅子上站起来时出现。重置引脚非常敏感,所以站立时切换重置引脚;
我已经为 Wiznet W5100 以太网芯片(目前位于 WIZ812MJ 分线板上)编写了一个驱动程序。它通过 SPI1 连接。
一切正常 - ping、tcp 客户端模式、接收和发送数据 - 但是,在随机时间(从 1 分钟到 10 分钟)后连接突然关闭! 我试图调试发生的所有步骤,但我找不到任何有用的东西。有没有人遇到过类似的问题?
由于驱动程序是为我的公司编写的,所以我不能将所有代码都放在这里,但我会尝试粘贴(对我来说)最重要的部分。 其中大部分是伪代码,但您可以假设 SPI 通信正常并且所有寄存器都设置为给定值!
流程图:
W5100_Init - 通过 SPI 引脚配置并进行 W5100 初始化
Pass SPI configuration
Write reset-cmd to MR register
Write retry time-value to RTR register (0x07D0 = 2000ms)
Write retry count to RCR register (0x05)
Write socket memory information to TMSR/RMSR register (0x55)
W5100_NetworkInit - 写入 GW,MAC,子网掩码和 IP 地址
Write Gateway to GAR register
Write MAC to SHAR register
Write Subnet to SUBR register
Write IP to SIPR register
W5100_SocketInit - 将重要的套接字寄存器映射到给定套接字并初始化套接字
/*This maps all important/required ports to the socketConfig struct*/
if(socketX == SOCKET0)
{
socketConfig.PORT0 = W5100_ADDR_S0_PORT0;
socketConfig.PORT1 = W5100_ADDR_S0_PORT1;
socketConfig.MR = W5100_ADDR_S0_MR;
socketConfig.CR = W5100_ADDR_S0_CR;
socketConfig.SR = W5100_ADDR_S0_SR;
//...
}
Write protocol type to MR register
write Port to PORT register
Write CMD_OPEN to CR register
使用客户端模式:
Write server IP to DIPR register
Write server Port to DPORT register
现在我们已经在客户端模式下建立了 tcp 连接,开始循环。
Check socket status from SR register
If there's any data on the line, call W5100_Socket_ReceiveData method
这在一段时间内工作正常(最近 运行:10 分钟),但突然套接字状态 returns 0x00 并且连接关闭。还有什么重要的事情我可能忘记了吗?为什么套接字关闭?
非常感谢您提供任何提示!
最终,我自己找到了答案。问题不是基于我的代码,而是关于 EMC:Wiznet 芯片重置。但重置本身与时间无关,但总是在我从椅子上站起来时出现。重置引脚非常敏感,所以站立时切换重置引脚;