W5100 연결 끊김 현상


#1

예를들면
W5100으로 만든 3개의 보드를 허브에 연결하여 서로 통신할 때 문제는 없습니다.
잘 됩니다.
그런데, 그 중 하나를 뽑아버리면 다른 두개끼리 통신이 되질 않습니다.

어제는 시간이 없어서 너무 간략하게 올렸습니다.
좀더 보완하자면…
UDP 통신으로 하나의 마스터가 두개의 slave를 폴링합니다.
IP 는 75.84.0.xxx로 하고 있습니다.
Wireshark으로 찍어보니 뽑아버린 IP를 계속 찾고 있었습니다.
65번이 97번과 156번을 폴링하는데, 97번을 뽑아버리면
계속 97번을 찾고 있습니다.
Wireshark도 익숙하지가 않아서인지, UDP통신은 되는데, UDP 통신에 대한 리스트가 없어요.
wiznet_01:02:03 Broadcast ARP 60 who has 75.84.0.97? Tell 75.84.0.65라는 메시지만 계속 되풀이되네요.

조언 부탁 드립니다.



#2

정말 이해가 안되는 현상이네요. :unamused:
만약 3개중 뽑아버린 하나가 반드시 있어야만 통신이 되는 상황이 아니라면, 남은 2개는 통신이 제대로 되야 합니다.
W5100으로 만든 보드 3개가 서로 어떻게 통신을 하고 있나요?
각각의 IP와 Mac 어드레스는 어떻게 되나요?


#3

처음 질문 초안에 질문 보완 했습니다.
빠른 검토 부탁 드립니다.


#4

안녕하세요 고객님.

97번에 지속적인 ARP 패킷을 보낸다는 것은 Master 에서 97번에 지속적으로 UDP send를 보낸다는 의미 같습니다.

펌웨어에서 97번에 지속적으로 UDP send를 하는 구간에서 멈춰있는 것 같은데 이 부분을 수정해 보시고
해결이 안된다면 다시 질문 부탁드립니다.

감사합니다.


#5

MCU에서는 97번과 156번을 3~4초 간격으로 폴링하고 있습니다.
wireshark에서 캡쳐한 것을 봐도 정상적일 때(모두 연결되어 있을 때)는 정상적인 주기로 폴링을 합니다.
따라서, 97번을 뽑았을 때 97번으로 계속 보내고 있는 것은 MCU는 아니고, W5100인 것 같습니다.
임시방편으로,
Timeout 발생시 하드웨어 적으로 리셋을 시키고, Init 후 다음 모듈(여기서는 156번)을 호출하는 방식으로 구현하였습니다.
이렇게 할 경우 문제없이 동작하는 것 처럼 보입니다만 이 방법은 비정상적인 방법 이고,
추정되는 오류를 한번 더 생각해 주세요.
기본적인 기능이라서 분명 어이없는 오류가 있을 듯 한데, 찾아내기가 쉽지가 않네요.
혹시… 참고될만한 코드 있으면 부탁 드립니다.


#6

폴링의 의미를 좀 더 구체적으로 설명해 주셨으면 합니다.

또한 w5100에서는 UDP send를 할 경우 ARP를 보낸 후 데이터를 보내게 됩니다. 그렇기 때문에 UDP 데이터를 지속적으로 보내는 곳이 없는지 확인 부탁 드린다고 말씀드린 겁니다.

그러므로 데이터를 97번으로 보내고 싶어하는 단말이 존재하므로 당연히 ARP패킷은 나가게 되는 겁니다.

TCP의 경우 connection을 맺는 과정에서 ARP패킷을 주고 받고 그 이후 connection이 맺어있는 동안은 ARP패킷을 주고 받지 않지만, UDP는 connection을 맺는 과정이 없으므로 설계하신 부분에서 UDP를 이용하여 지속적으로 데이터를 보낸다면 ARP패킷을 지속적으로 보내게 됩니다.

이것은 구현상의 방법이므로 오류는 아닙니다. UDP send를 언제 멈춰야 할지 결정하는 것 또한 설계상의 방법이므로
정답은 없다고 보는게 맞습니다.


#7

경험이 짧아서 헤메는 것 같습니다.

존재하지 않는 IP로 UDP data를 보냈을 때 time out interrupt를 감지하고, 적정 시간 이후에 send를 clear 하면 된다는 뜻인것 같네요.
그런데, send를 clear 할 수 있는 방법을 못 찾겠네요.
도움 부탁 드리겠습니다.

가지고 있는 pdf 문서에서 검색을 하면 다른 여느 파일과 다르게 정확한 위치에 검색이 되질 않습니다.
수정할 때 검색도 고려해 주시면 감사하겠습니다.


#8

패킷을 보니 65번 (마스터) 이 156, 97에 주기적으로 UDP패킷을 보내고, 156, 97은 응답을 하는 구조인것 같군요.
W5100이 UDP를 보내기전에 매번 ARP 패킷을 보냅니다.패킷을 받는 쪽에서는 ARP reply를 하는데 만약 랜선이 뽑혀 있으면 ARP에 대한 응답이 없으므로 time out이 납니다.
따라서 코드에서 주기적으로 156, 97에 UDP 패킷을 보내도록 하셨으면, 응답이 없거나, ARP timeout 이 나는 소켓은 close하고 더이상 보내지 않도록 하면 됩니다.


#9

안녕하세요 고객님.

데이터시트가 검색이 잘 안되신다면 1.2.4 버전을 받아보시기 바랍니다.

send명령을 끝내는 시점판단에 대해 추천드리는 방법은

먼저 RTR과 RCR을 세팅하시기 바랍니다. RTR에 세팅된 시간에 따라 ARP재전송이 일어나며 RCR값의 횟수 만큼 재전송 이후
Sn_IR의 timeout bit가 1로 변합니다. 이 interrupt값을 이용하여 clear시킨다면 될것 같습니다.

감사합니다.


#10

먼저 감사드립니다.

데이터 시트는 1.2.4를 보고 있는데도 다른 문서와 달리 검색이 잘 안되네요.
제 프로그램이 문제인가요? ㅠㅜ

RTR과 RCR을 세팅해서 200mS 간격으로 5번 설정되어 있고, timeout bit를 감지하여 send를 clear하려했으나,
적절한 방법을 못 찾았습니다.

Clear하는 구체적인 방법을 알려주시면 감사하겠습니다.

어떤 명령어를 어떻게 쓰면 send된 data가 지워지고, 보내고자 하는 다음 IP로 보낼 수 있다… 이런 식으로 부탁 드립니다.


#11

안녕하세요 고객님.

timeout interrupt가 발생하면 interrupt pin output이 low로 떨어 집니다.(interrupt관련 자세한 내용은 datasheet를 참조하시면 됩니다.) 그러면 MCU에서 이 신호를 받아 interrupt routine으로 가게 되며 이곳에 원하는 내용의 코드를 설계하시면 될겁니다.

감사합니다.


#12

너무 기본적인 것이라서 답변이 없으신 것인가요?
꽤 오랫동안 고민했고, 지금은 편법으로 통신을 하고 있습니다만,
제가 생각해도 기본적인 기능이라서 당연히 명령어가 있을 것이라 생각합니다.
방법을 알려 주시면 감사하겠습니다.


#13

안녕하세요 고객님.

단순히 명령어가 존재하지는 않습니다.

W5100에서 interrupt 신호를 보내면 MCU에서 이 신호를 물리적으로 받아 처리 할 수 있도록 되어 있습니다.
이는 MCU관련해서 찾아봐야 합니다. 저희가 모든 MCU에 대해 예제 코드를 가지고 있지 않습니다.

기본적으로 프로그램은 순차적으로 진행되나, 인터럽트는 수행중인 코드를 잠시 멈추고 새로운 함수를 호출하여 처리하게 됩니다.

이 방법을 사용하시거나 아니면 지속적으로 폴링 방식으로 interrupt register를 확인하여 별도의 함수를 호출 하거나 2가지 방식중 하나를 택하셔야 합니다.

또한 고객님의 어플리케이션이 어떤 식으로 동작하는지도 모르고 어떤방식으로 해결해야 하는지도 모르고 그렇다고 저희가 직접 설계를 해줄 수도 없기 때문에 최대한 자세히 설명 드린 겁니다.

감사합니다.


#14

지난 29일자 답변이 2페이지에 있었는데, 답변을 확인하지 못해서 답변이 없다고 투정을 부렸었네요.
죄송합니다.

MCU에서 인터럽트를 받고, 이런 저런 제어는 잘 하고 있습니다.
MCU 사용법에 대해서는 잘 알고 있습니다만, W5100의 제어는 쉽지가 않네요.
다시 한번 문의 드리기 위해 지금까지 당사에서 구현 하고 있는 것을 정리하면,

  1. Master 보드에서 A IP로 data send
  2. A IP가 없어서 timeout interrupt 발생
  3. Master 보드의 MCU에서 interrupt 확인
  4. interrupt clear + …
  5. B IP로 data send
  6. B IP에서 부터 data 수신
  7. C IP로 data send

    1~3, 5~7은 문제없이 잘 하고 있습니다만, 4번에 어떤 행위를 해야지 5번으로 넘어갈 수 있는지 알고 싶습니다.
    당사에서 4번 interrupt clear를 하고, B IP로 data를 send 하지만,
    Wireshark로 찍어보면 A IP를 찾는 ARP를 반복적으로 보내고 있습니다. B/C로 보내는 데이터는 보이질 않습니다.
    물론 A IP의 보드가 연결되어 있으면 A–>B–>C–>A…로 잘 동작합니다.
    4번에 어떤 추가적인 행위를 해야 하나요?

#15

안녕하세요 고객님.

clear하는 방법은 소켓을 close하는 방식이 가장 기본적으로 사용되는 방법입니다.

timeout이 발생하면 해당 소켓을 close한 후 일정 시간(약1ms) 후 재 open 하시거나

다음 번 데이터 전송때 open하거나 하시면 될것으로 생각됩니다.

좀 더 명확한 내용은 저희 회사의 reference code를 참조하시거나 데이터 시트의 ‘5.2.2 UDP’ 부분을 보시면 많은 도움이 될 것으로 생각 됩니다.

감사합니다.


#16

이 포스팅은 저희 회사에서 직접 방문을 해서 문제의 원인을 찾았기에, 관련 내용을 공유하고자 올립니다.
문제의 원인은 "동일한 MAC주소"를 여러 보드에 설정해서 일어난 결과입니다.
네트웍 환경에서 MAC주소는 유일한 값을 가지고 있어야 합니다.

만약 같은 MAC을 사용하는 보드가 여러개가 있을 경우,
UDP를 사용을 하면 보드에서는 송신은 되겠지만 수신은 되지 않을 겁니다.
그리고 TCP 서버의 경우에는 PC측에서 연결 자체가 안될 겁니다. 운 좋게 될 수도 있지만, PC에서는 같은 MAC을 가진 다른 보드에 접속할 확률이 있음.

참고하세요