WIZnet Developer Forum

w5500 에서 클라이언트로 접속시 불안정

안녕하세요,

저는 w5500 을 사용하여 귀사의 예제인 loopback 예제를 이용해서 소켓 4개를 열어서 서버로 잘 사용하고 있습니다
이때 시험용 클라이어트는 hercules_3-2-8.exe 를 이용해서 크라이언트 대용으로 사용하고 있습니다.
이것은 매우 안정되게 잘 됩니다.

그런데 w5500 을 클라이언트 모드로 사용시 connect 에서 에러가 발생합니다. 주로 타임아웃 관련,
그래서 connect API 함수를 살펴보니 connect 함수내에서 아래의 while 에서 못 빠져 나오고 있거나 한참 있다가 빠져 나옵니다.

     setSn_DIPR(sn,addr);
setSn_DPORT(sn,port);
setSn_CR(sn,Sn_CR_CONNECT);
            while(getSn_CR(sn));                 

데이터 시트에 따르면 getSn_CR(sn) 은 w5500 이 컴맨드를 정상으로 accept 했을때 자동으로 0으로 되어 위 while 문을 빠져 나오는
것으로 설명되어 있습니다.

근데, 이게 간혹 위 while 문을 빠져 나와 connect 가 될 때도 있습니다. 즉, connect 가 되어 tcp 연결이 되는 경우도 있습니다.

궁금한 것은 다음 2가지 입니다.

  1. w5500 을 서버로 돌릴시는 너무나 잘되는데 클라이언트롤 돌릴때는 왜 이런 현상이 있는지요
    (참고로, 두경우 모두 서버나 클라이언트 시험시 hercules_3-2-8.exe 를 이용하여 역활 변경하여 시험 합니다.
  2. 이런 경우, 즉 클라이언트로 접속시 connect 가 되었다 안되었다 하는 불안정한 모습을 보일시 어떤 부분을 좀더 보면 되는지
    도움 요청 드립니다.

감사합니다.

안녕하세요.

말씀하신 코드 부분의 설명을 간단히 드리자면,

setSn_DIPR(sn,addr); // Set the destination IP address. @ref Sn_DIPR
setSn_DPORT(sn,port); // Set the destination Port number. @ref Sn_DPORT
setSn_CR(sn,Sn_CR_CONNECT); // command register
while(getSn_CR(sn));

위 DIPR과 DPORT는 단순 접속할 대상의 IP와 PORT를 설정하는 부분입니다.

그리고 중요한 것은 setSn_CR부분인데요.

데이터시트를 보시면 아시겠지만 W5500칩은 마지막에 Command Register를 사용해서 Transition을 하게 됩니다.

이 말이 무슨말이냐면, Connect함수에서 실제 Server와 연결이 되려면 이 command register가 정상적으로 동작되야 연결이 이루어집니다.

말씀하신 “데이터 시트에 따르면 getSn_CR(sn) 은 w5500 이 컴맨드를 정상으로 accept 했을때 자동으로 0으로 되어 위 while 문을 빠져 나오는
것으로 설명되어 있습니다.”

위 말은 Command register로 명령하여 connect를 시도하고 연결이 될 때까지 while문으로 계속 확인하고 있는 겁니다.

처음 socket을 생성하고 listen상태로 돌입하는 것 모두 소켓 코드를 보시면 아시겠지만, 전부 마지막엔 setSn_CR을 이용하여 Transition을 합니다.

그렇다면, 생각해봐야 할 점은, 왜 연결이 잘 되지 않느냐인데, 혹시 w5500을 서버와 클라이언트를 병행하면서 구동하시는건가요??

병행하면서 구동하신다면 서버를 사용하고 disconnect를 시도한 뒤 다시 클라이언트로 사용하는 절차가 필요합니다.

그리고 만약 connect를 시도하였는데 연결이 잘 되지 않는 다는 것은 연결하려는 서버쪽이 listen상태로 정상적으로 돌입하였는지도 확인이 필요합니다.

만약 서버쪽에서도 정상적으로 listen상태로 돌입하였는데도 불구하고 connect가 되지않는다면, 코드상에 문제가 있을수도 있으며,

어쩌면, 하드웨어적인 문제가 있을 수도 있습니다.

W5500 칩을 사용하여 따로 모듈을 제작하여 사용하신건가요??

아니면 저희 모듈을 구매해서 사용하시는건가요??

확인부탁드리겠습니다.

감사합니다.

신속한 응답 감사합니다.

조언 주신대로 몇가지 유형에 대해 살펴 보겠습니다.

그리고 우리는 w5500 췹을 사용해서 on board 화 하여 사용중에 있습니다.
또한 참조 코드는 서버쪽은 귀사의 예제코드인 loopback 코드를 참조로 하였고
클라이언트쪽은 귀사의 엔지니어가 블로깅하여 설명한 코드를 참조하였습니다.
아마도 8051쪽 포팅부분에서 나온 것으로 기억합니다.

조언주신 사항 시험후 필요시 다시 문의 드리겠습니다.

감사합니다.

안녕하세요.

우선 모든 이더넷 통신의 기반은 loopback 코드입니다.

따라서 loopback 코드를 사용해서 구동하시면 큰 문제는 없을 것으로 보입니다.

그리고 회로는 저희 wiki site에 reference schematic이 있으니 참고해주세요.

감사합니다.

안녕하세요

조언해주신 케이스를 기반으로 시험 결과 문제 해결을 하였습니다.

우리는 w7100a 예제 코드중에 ARP 기능을 이용하여 목적지 MAC 을 얻는 과정후에 클라이언트와 서버를 순차적으로 오픈하여 사용하는
어프리케이션을 구현중이었는데 ARP 동작후에 클라이언트 접속시 connect 가 불안정하게 됬다 안됬다 하는 문제가 발생한 것 이었습니다.

답변주신 내용중에 아래와 같은 것이 있었고 이에 힌트를 얻어 의심되는 부분을 시험 결과 문제 해결에 이르렀습니다.

" 혹시 w5500을 서버와 클라이언트를 병행하면서 구동하시는건가요??

병행하면서 구동하신다면 서버를 사용하고 disconnect를 시도한 뒤 다시 클라이언트로 사용하는 절차가 필요합니다."

우리는 위 조언을 기반으로 우리의 문제 해결을 위해 ARP 에서 SUCCESS 후에 해당 소켓클리어를 하여 위 문제를 해결하였습니다.

신속한 응답과 예상되는 문제점을 나열하여 힌트를 얻을 수 있도록 조언 주심에 대해 깊은 감사 드립니다.

새해 복 많이 받으세요

안녕하세요.

문제가 해결되셨다니 다행입니다.

새해 복 많이 받으세요.

감사합니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.