W5300 Server관련 문의

#1

void Check_tcps(SOCKET s, uint16 port, uint8* buf, uint16 mode)
{
uint32 len;
#ifdef SIMULATION
len = recv(s,buf,len); // recv
CommandCheck(len);// for test
return;
#endif

switch(getSn_SSR(s)) // check SOCKET status
{ // ------------

case SOCK_ESTABLISHED: // ESTABLISHED?
if(Net.SendFlag != 1)
{
if(getSn_IR(s) & Sn_IR_CON) // check Sn_IR_CON bit
{
PrintString("%d : Connect OK\r\n",s);
setSn_IR(s,Sn_IR_CON); // clear Sn_IR_CON
}

	   if((len=getSn_RX_RSR(s)) > 0) // check the size of received data
	   {
		   len = recv(s,buf,len);     // recv
		   Net.Rx_Length = len;
		   Net.ReceivedFlag = 1;

==> 여기서 *** CommandCheck(len,Net.Rx_Data);// yskim Add
}
}
else
{
Net.SendFlag = 0;
if(Net.Tx_Length != send(s,Net.Tx_Data,Net.Tx_Length)) // send
{
PrintString("%d : Send Fail.len=%d\r\n",s,Net.Tx_Length);
}
}
break;
// ---------------
case SOCK_CLOSE_WAIT: // PASSIVE CLOSED
disconnect(s); // disconnect
PrintString(“SOCK_CLOSE_WAIT\r\n”);
break;
// --------------
case SOCK_CLOSED: // CLOSED
close(s); // close the SOCKET
PrintString(“SOCK_CLOSED\r\n”);
socket(s,Sn_MR_TCP,port,mode); // open the SOCKET
PrintString(“SOCK_OPEN\r\n”);
break;
// ------------------------------
case SOCK_INIT: // The SOCKET opened with TCP mode
listen(s); // listen to any connection request from “TCP CLIENT"
PrintString(”%d : LOOPBACK_TCPS(%d) Started.\r\n",s,port);
break;
default:
break;
}
}

======================
SHAR : 00:08:dc:00:b7:d9
GWR : 192.168.001.001
SUBR : 255.255.255.000
SIPR : 192.168.001.100

SOCK_CLOSED
SOCK_OPEN

Receive from Lan Length fail. *** 인쇄됨
Length 21086adea
LOOPBACK_TCPS(5000) Started.

==============================================
전원이 켜지면 초기화 후에 상기와 같이 인쇄 됩니다.
W5300 16bit Source를 기반으로 DSP에 포팅해서 사용 중입니다.
43장의 Board를 생산하였는데 34장에서는 문제가 발생되지 않고
9장에서 상기와 같은 문제가 발생됩니다.

SOCK_OPEN후에 큰값으로 Receive Data가 있는 것으로 나타납니다.
Board 불량을 생각해서 여러차례 검사와 재납땜으로도 해결이 안되고 있습니다.

프로그램 부분에서 잘못될 여지가 없을까요?[list][/list]

#2

43장 중 9장이 그런 경우라면 펌웨어 문제보단 하드웨어 문제일 가능성이 큽니다.

우선 질문하신 내용중

이와 같은 현상은 칩이 제대로 동작했다면 발생할 수 없습니다. 상기 코드를 분석한 결과 Socket이 접속이 되지 않을 경우 Receive를 수행하지 않도록 구현되어 있는데, Listen 전에 Socket 접속상태로 인식하여 Receive를 수행한 경우로, W5300 Control에 문제가 있는 것으로 판단됩니다.
제일 의심스러운 것은 Reset 관련 부분입니다.
Reset signal은 최소 2us Low를 유지해야 하며, 또한 Reset High이후 PLL Locking이 될때까지 최대 10ms 동안 기다린 후 W5300을 Access하셔야 합니다.

이부분 다시 확인 바랍니다.

#3

불량 Board 9장중

Case1
Case1
1장은 무한 루프 반복
void setSn_CR(SOCKET s, uint16 com)
{
IINCHIP_WRITE(Sn_CR(s),com);
while(IINCHIP_READ(Sn_CR(s))); // wait until Sn_CR is cleared. <===여기서 무한 루프를 반복하는
}

======================
SHAR : 00:08:dc:00:b7:d9
GWR : 192.168.001.001
SUBR : 255.255.255.000
SIPR : 192.168.001.100

인쇄후에 무한 루프를 반복하고 있음

Case2 – 2장
void Check_tcps(SOCKET s, uint16 port, uint8* buf, uint16 mode)
{
uint32 len;

switch(getSn_SSR(s)) // check SOCKET status
{ // ------------

case SOCK_ESTABLISHED: // ESTABLISHED?
if(Net.SendFlag != 1)
{
if(getSn_IR(s) & Sn_IR_CON) // check Sn_IR_CON bit
{
PrintString("%d : Connect OK\r\n",s);
setSn_IR(s,Sn_IR_CON); // clear Sn_IR_CON
}

	   if((len=getSn_RX_RSR(s)) > 0) // check the size of received data
	   {
		   len = recv(s,buf,len);     // recv
		   Net.Rx_Length = len;
		   Net.ReceivedFlag = 1;

// CommandCheck(len,Net.Rx_Data);// yskim Add
}
}
else
{
Net.SendFlag = 0;
if(Net.Tx_Length != send(s,Net.Tx_Data,Net.Tx_Length)) // send
{
PrintString("%d : Send Fail.len=%d\r\n",s,Net.Tx_Length);
}
}
break;
// ---------------
case SOCK_CLOSE_WAIT: // PASSIVE CLOSED
disconnect(s); // disconnect
PrintString(“SOCK_CLOSE_WAIT\r\n”);
break;
// --------------
case SOCK_CLOSED: // CLOSED
close(s); // close the SOCKET
PrintString(“SOCK_CLOSED\r\n”);
socket(s,Sn_MR_TCP,port,mode); // open the SOCKET
PrintString(“SOCK_OPEN\r\n”);
break;
// ------------------------------
case SOCK_INIT: // The SOCKET opened with TCP mode
listen(s); // listen to any connection request from “TCP CLIENT"
PrintString(”%d : LOOPBACK_TCPS(%d) Started.\r\n",s,port);
break;
default:
break;
}
}

getSn_SSR(s)의 Return 값이 0x14가 나타남 - 다수의 경우

getSn_SSR(s)가 0x14가 나올수 있나요?

아직 전체적인 파악을 못하고 있습니다.

#4

W5300 Pin66 /RESET가 정상적으로 Reset되지않아서 발생한 문제들이었습니다.

RESET이 잘되는줄 알았는데 codeing중에 오류가 있었습니다.

답변 감사드립니다.

#5

getSn_SSR(s) 값이 예상치 못한 값이 나오는 경우가 발생할 수 있습니다.
이는 이전 통신 상태가 완전히 Release되지 못하고 즉 재전송 패킷이 남아 있는 경우 간혹 0x10이나 0x11와 같은 Status가 관찰될 수 있습니다. 자세한 내용은 W5300 errata sheet를 참조하세요.(Erratum 1)
http://www.wiznet.co.kr/UpLoad_Files/BoardFiles/W5300_ET_V122K.pdf

이를 방지하기 위해서
close() 함수 내에 UDP socket을 이용한 강제 Timeout routine이 적용되어 있습니다.

void     close(SOCKET s)
{
   // M_08082008 : It is fixed the problem that Sn_SSR cannot be changed a undefined value to the defined value.
   //              Refer to Errata of W5300
   //Check if the transmit data is remained or not.
   if( ((getSn_MR(s)& 0x0F) == Sn_MR_TCP) && (getSn_TX_FSR(s) != getIINCHIP_TxMAX(s)) ) 
   { 
      uint16 loop_cnt =0;
      while(getSn_TX_FSR(s) != getIINCHIP_TxMAX(s))
      {
         if(loop_cnt++ > 10)
         {
            uint8 destip[4];
            // M_11252008 : modify dest ip address
            //getSIPR(destip);
            destip[0] = 0;destip[1] = 0;destip[2] = 0;destip[3] = 1;
            socket(s,Sn_MR_UDP,0x3000,0);
            sendto(s,(uint8*)"x",1,destip,0x3000); // send the dummy data to an unknown destination(0.0.0.1).
            break; // M_11252008 : added break statement
         }
         wait_10ms(10);
      }
   };
   ////////////////////////////////   
   setSn_IR(s ,0x00FF);          // Clear the remained interrupt bits.
   setSn_CR(s ,Sn_CR_CLOSE);     // Close s-th SOCKET     
}