W5500 Ping问题解决
W5500 再ping结束后需要执行代码 IINCHIP_WRITE(Sn_PROTO(socket), 0);清空ICMP协议这样才能恢复硬件自动恢复pingintRyanxW5500Ping(structnetdev*netdev,constchar*host,size_tdata_len,uint32_ttimes,structnetdev_ping_resp*ping_resp){intresult0,socket0;structhostent*hostentNULL;hostentryanx_gethostbyname(host);if(NULLhostent||NULLhostent-h_addr_list[0]){rlog_w(hostent is NULL.);return-RT_FALSE;}structin_addrserviceAddr*(structin_addr*)hostent-h_addr_list[0];// SOCK_RAW Sn_MR_IPRAW 3socketryanx_socket(AF_WIZ,SOCK_RAW,0);if(socket0){rlog_w(create ping socket(%d) failed.,socket);return-1;}// 设置套接字ICMP协议IINCHIP_WRITE(Sn_PROTO(socket),IPPROTO_ICMP);structtimevaltimeout{.tv_sectimes/RT_TICK_PER_SECOND,.tv_usectimes%RT_TICK_PER_SECOND*1000000/RT_TICK_PER_SECOND};// 设置接收和发送超时选项ryanx_setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(void*)timeout,sizeof(timeout));ryanx_setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(void*)timeout,sizeof(timeout));structsockaddr_inserver_addr{.sin_familyAF_WIZ,.sin_porthtons(WIZ_PING_PORT),.sin_addrserviceAddr};if(ryanx_connect(socket,(structsockaddr*)server_addr,sizeof(server_addr))0){ryanx_closesocket(socket);return-1;}resultryanx_ping_request(socket);platformTimer_tpingTimer{0};platformTimerCutdown(pingTimer,0xffff);if(result0){resultryanx_ping_reply(socket,(structsockaddr*)server_addr);ping_resp-ip_addr.addrserviceAddr.s_addr;ping_resp-ticks0xffff-platformTimerRemain(pingTimer);ping_resp-data_lendata_len;intoptlensizeof(ping_resp-ttl);ryanx_getsockopt(socket,IPPROTO_IP,IP_TTL,ping_resp-ttl,(socklen_t*)optlen);}ryanx_closesocket(socket);// 清除协议和模式 否则回影响到W5500 ping操作IINCHIP_WRITE(Sn_PROTO(socket),0);returnresult;}