WIZnet Developer Forum

W5500에서 FSR 0문제.

W5500에서 len 10 만틈 send() 하고 있습니다.

소켓 sock_io_mode는 nonblock으로 설정하였습니다.

정상적으로 통신중에 FSR이 2048에서 점점 줄어들어 0으로 떨어지면 통신이 되지 않습니다.

FSR이 증가하려면 어떻게 해야 합니까?

int32_t send(uint8_t sn, uint8_t * buf, uint16_t len)
{
uint8_t tmp=0;
uint16_t freesize=0;

uint32_t printCnt=0;
printf("Sn %d, Len %d, ",sn, len);

CHECK_SOCKNUM();
CHECK_SOCKMODE(Sn_MR_TCP);
CHECK_SOCKDATA();
tmp = getSn_SR(sn);
printf("SR 0x%02X, ",tmp);
if(tmp != SOCK_ESTABLISHED && tmp != SOCK_CLOSE_WAIT) return SOCKERR_SOCKSTATUS;
if( sock_is_sending & (1<<sn) )
{
	printf("sending, ");
	tmp = getSn_IR(sn);
	printf("IR 0x%02X, ",tmp);
	if(tmp & Sn_IR_SENDOK)
	{
		setSn_IR(sn, Sn_IR_SENDOK);
		#if _WZICHIP_ == 5200
		if(getSn_TX_RD(sn) != sock_next_rd[sn])
		{
		setSn_CR(sn,Sn_CR_SEND);
		while(getSn_CR(sn));
		return SOCKERR_BUSY;
	}
		#endif
		sock_is_sending &= ~(1<<sn);         
	}
	else if(tmp & Sn_IR_TIMEOUT)
	{
		close(sn);
		return SOCKERR_TIMEOUT;
	}
	else return SOCK_BUSY;
}

freesize = getSn_TxMAX(sn);
printf("TxMAX %d\n",freesize);
if (len > freesize) len = freesize; // check size not to exceed MAX size.

printf("while\n{\n"); 
while(1)
{
	freesize = getSn_TX_FSR(sn);   -> 이부분이 최종적으로 0이되며 Busy로 리턴 됩니다.
	tmp = getSn_SR(sn);
	
	if(++printCnt<=10) {
		printf("	Len %d, FSR %d, SR 0x%02X\n",len, freesize, tmp);
	}
 
	if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT))
	{
		 close(sn);
		 return SOCKERR_SOCKSTATUS;
	}
	if( (sock_io_mode & (1<<sn)) && (len > freesize) ) return SOCK_BUSY;
	if(len <= freesize) break;
}
printf("}\n");
wiz_send_data(sn, buf, len);
#if _WIZCHIP_ == 5200
	sock_next_rd[sn] = getSn_TX_RD(sn) + len;
#endif
setSn_CR(sn,Sn_CR_SEND);
/* wait to process the command... */
while(getSn_CR(sn));
sock_is_sending |= (1 << sn);
return len;

}

Packet 전송이 정상적으로 이루어진 경우 상대방으로 부터 전송패킷에 대한 ack packet을 수신합니다.
ack packet을 정상적으로 수신하였다면, Sn_TX_FSR은 자동으로 증가합니다.

Sn_TX_FSR이 증가하지 않는 경우는 상대방이 ACK를 보내주지 않기 때문입니다.
wireshark 프로그램으로 packet을 모니터링 해보세요.

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