Receive from Lan Length fail. *** 인쇄됨
Length 21086adea
LOOPBACK_TCPS(5000) Started.
==============================================
전원이 켜지면 초기화 후에 상기와 같이 인쇄 됩니다.
W5300 16bit Source를 기반으로 DSP에 포팅해서 사용 중입니다.
43장의 Board를 생산하였는데 34장에서는 문제가 발생되지 않고
9장에서 상기와 같은 문제가 발생됩니다.
SOCK_OPEN후에 큰값으로 Receive Data가 있는 것으로 나타납니다.
Board 불량을 생각해서 여러차례 검사와 재납땜으로도 해결이 안되고 있습니다.
이와 같은 현상은 칩이 제대로 동작했다면 발생할 수 없습니다. 상기 코드를 분석한 결과 Socket이 접속이 되지 않을 경우 Receive를 수행하지 않도록 구현되어 있는데, Listen 전에 Socket 접속상태로 인식하여 Receive를 수행한 경우로, W5300 Control에 문제가 있는 것으로 판단됩니다.
제일 의심스러운 것은 Reset 관련 부분입니다.
Reset signal은 최소 2us Low를 유지해야 하며, 또한 Reset High이후 PLL Locking이 될때까지 최대 10ms 동안 기다린 후 W5300을 Access하셔야 합니다.
이를 방지하기 위해서
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
}