---
title: "W5500에서 FSR 0문제."
url: "https://maker.wiznet.io/forum/13945"
markdown_url: "https://maker.wiznet.io/forum/13945/md"
type: "Forum topic"
category: "Ethernet Chips"
author: "hd96ksh"
created: "2020-07-17T06:50:10+09:00"
last_activity: "2020-07-17T08:59:19+09:00"
language: "ko"
views: 574
replies: 1
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

# W5500에서 FSR 0문제.

## Question

Asked by hd96ksh on 2020-07-17 in Ethernet Chips.

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

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

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

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

## Replies

### Reply 1 by hd96ksh, 2020-07-17

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;
```

}

---

Source: https://maker.wiznet.io/forum/13945
