W5300 Sn_SSR 값 0x10 관련 문의 입니다


#1

w5300은 16bit 모드, 클라이언드로 사용하고 있습니다.
w5300의 상대편에서 send ok를 하지 않고 비정상 종료 시 Sn_SSR 값이 0x10 나오며, 해결 방법은 errata에 나와있는데요
errata를 보고 그대로 하였는데 계속 0x10 값이 나와서 문의 드립니다.
Sn_SSR 값이 0x10인것을 확인하고 errata의 내용대로 수행을하고 Sn_SSR 값을 읽어보면 0x00 입니다.
그래서 다시 TCP 클라이언트 모드로 재설정을하고 대기하여도 접속이 되지않아서 Sn_SSR 값을 읽어보면 0x10으로 나옵니다.
동작이 되지않아서 errata 내용을 수행하는곳에 MR을 통해서 w5300칩을 리셋하도록 하면 정상 동작합니다.
이것으로 봐서 제가 errata와 다른게 했거나 또는 errata대로 해도 해결이 되지 않은것 같습니다.
아래 errata를 보고 소스에 적용한 것을 그대로 긁어왔습니다.

S[ch].MR = W5300_Sn_MR_UDP; // 0x02
S[ch].PORTR = 5000;
S[ch].CR = W5300_Sn_CR_OPEN; // 0x01

S[ch].DIPR0 = 0x0000;
S[ch].DIPR2 = 0x0001;
S[ch].DPORTR = 5000;

S[ch].TX_FIFOR = 0x0000;
S[ch].TX_WRSR0 = 0;
S[ch].TX_WRSR2 = 1;
S[ch].CR = W5300_Sn_CR_SEND; // 0x20

TSK_sleep(tick);  // os sleep

S[ch].IR = 0x00FF;
S[ch].CR = W5300_Sn_CR_CLOSE; // 0x10

추가로 칩 전체가 아닌 소캣 1채널에 대해서만 리셋 할 수 있는방법는 없는지 문의 드립니다.


#2

안녕하세요.

먼저,

send_ok는 상대편에서 보내주는 메시지가 아닙니다. send_ok는 칩 내부에서 send 명령어를 제대로 인식했다고 알려주는 인터럽트 신호 입니다. 즉, 앞으로도 send명령 후 send_ok 인터럽트가 뜰때까지 while 문으로 잡아주시는 것을 추천드립니다.

또한 이 erratum을 해결하기 위해서 UDP로 send를 해야 하는데 올려주신 함수가 pseudo 코드인지 실제 코드인지는 확실치 않지만, reference 코드로 설계하는 것을 추천드립니다.

특히 CR레지스터를 이용하는 커맨드 명령을 내릴때 while문으로 clear를 기다리시길 바라며 send 명령어의 경우 반드시 send_ok를 기다리시길 바랍니다.

위 방식대로 한번더 테스트 부탁드리며 그래도 해결이 되지 않는다면 다시한번 문의 주세요

감사합니다~


#3

Send OK를 기다리는 동안 Timeout이 발생하는지 또한 확인하셔야 합니다.
errata에 나와 있는 IP로 전송할 경우 ARP Timeout이 발생합니다.
이를 확인하셔야 합니다.
자세한 것은 sendto() 함수를 참고하세요.


#4

TSK_sleep(tick); 부분을 아래와 같이 수정하여 해결 하였습니다.

while(1)
{
sock_status = S[ch].SSR;
sock_status = sock_status & 0x00ff;
TSK_sleep(tick);
if (sock_status == 0x22)
{
break;
}
}

감사합니다.