W5500에서 len 10 만틈 send() 하고 있습니다.
소켓 sock_io_mode는 nonblock으로 설정하였습니다.
정상적으로 통신중에 FSR이 2048에서 점점 줄어들어 0으로 떨어지면 통신이 되지 않습니다.
FSR이 증가하려면 어떻게 해야 합니까?
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.