WIZnet Developer Forum

W5200 disconnect 관련 질의

수고 많습니다.
w5200 을 Client Mode로 최신 Driver Program으로 Porting 하여 Testing 하고 있습니다.
SOCK_ESTABLISHED 상태에서 Client에서 먼저 disconnect 를 할 경우

disconnect Module

while(getSn_SR(sn) != SOCK_CLOSED)
{
   if(getSn_IR(sn) & Sn_IR_TIMEOUT)
   {
      close(sn);
      return SOCKERR_TIMEOUT;
   }
}

여기서 빠져 나오지 않는데 어떻게 해야 하나요?
close(sn) 는 정장적으로 되나 disconnect(sn)을 해야 서버 단의 연결을 끊을 수 있기 때문에
방법을 구합니다
socket Version
/! \version 1.0.3
//! \date 2013/10/21
w5200 Version
//! \version 1.0.0
//! \date 2013/10/21

int8_t disconnect(uint8_t sn)
{
CHECK_SOCKNUM();
CHECK_SOCKMODE(Sn_MR_TCP);
setSn_CR(sn,Sn_CR_DISCON);
/* wait to process the command… */
while(getSn_CR(sn));
sock_is_sending &= ~(1<<sn);
if(sock_io_mode & (1<<sn)) return SOCK_BUSY;
while(getSn_SR(sn) != SOCK_CLOSED)
{
if(getSn_IR(sn) & Sn_IR_TIMEOUT)
{
close(sn);
return SOCKERR_TIMEOUT;
}
}
return SOCK_OK;
}

안녕하세요

현재상황만 봐서는 Interrupt가 발생하지 않는것 같은데, 다른 요인도 있는것인지 확인해봐야할것 같습니다.
우선, IR값을 확인해보세요.

추가적으로 Sn_IR_TIMEOUT의 값이 0x08로 정상적으로 define이 되어있는지
Sn_IMR레지스터의 값이 0xFF로 설정되어있는지 확인부탁드립니다.
default값으로 따로변경하지 않으셨다면, 위의 값대로 설정되어있어야 합니다.

감사합니다.

안녕하세요
확인해 보았는데 Timeout 08, SnMR은 0xff 정상적으로 초기화 되어 있습니다.
참고로 Loop Back 예제에서는 Interrupt 방식을 사용하지 않은것 같아서 그것과 유사하게 Hardware를 만들었습니다.
반드시 Interrupt 방식을 사용해야 하는가요?

안녕하세요

제 설명에 오해가 있었나보네요
Interrupt 방식을 사용하는것이 아니라,
Timeout 발생시 Socket IR레지스터의 값이 바뀌게 되어있습니다.
IR레지스터값이 update되지않아 close 명령이 send 되지않고, 상태가 close되지 못하기 때문에 while문을 빠져나오지 못하는것같습니다.

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