공유기로부터 DHCP IP address는 잘 읽어오고 있습니다.
PING에 대한 응답도 잘 하고 있는데…
(구성은 공유기 라인 중에 하나를 HUB로 분기시켜 PC와 저희 보드를 함께 연결시키고, PC에 TCP 서버 프로그램으로 Listen 하고 있습니다.)
Loopback 함수의 case문 맨 끝에
if((ret=socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn) return ret; // TCP socket open with ‘any_port’ port number
이것이 수행되고 나면 SR이 0x22로 계속 유지되므로 connect 시도조차 못하고 있습니다.
아래는 사용 중인 Loopback 함수입니다.
// this is a kind of LOOPBACK_MAIN_NOBLCOK
int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport)
{
int32_t ret; // return value for SOCK_ERRORs
uint16_t size = 0, sentsize=0;
uint8_t sr;
static uint8_t ssr = 0;
// Port number for TCP client (will be increased)
static uint16_t any_port = 50000;
// Socket Status Transitions
// Check the W5500 Socket n status register (Sn_SR, The ‘Sn_SR’ controlled by Sn_CR command or Packet send/recv status)
sr = getSn_SR(sn);
if (sr!=ssr)
{
ssr = sr;
PrintF(“%d:SR=%02x\n”, sn, sr);
}
switch(sr)
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON) // Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
{
PrintF(“%d:Connected to - %d.%d.%d.%d : %d\r\n”,sn, destip[0], destip[1], destip[2], destip[3], destport);
setSn_IR(sn, Sn_IR_CON); // this interrupt should be write the bit cleared to '1'
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Data Transaction Parts; Handle the [data receive and send] process
//////////////////////////////////////////////////////////////////////////////////////////////
if((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
{
if(size > ETH_DATA_BUF_SIZE) size = ETH_DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
ret = recv(sn, buf, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
PrintF("%d:recv count: %d\r\n", sn, ret);
sentsize = 0;
// Data sentsize control
while(size != sentsize)
{
ret = send(sn, buf+sentsize, size-sentsize); // Data send process (User's buffer -> Destination through H/W Tx socket buffer)
if(ret < 0) // Send Error occurred (sent data length < 0)
{
close(sn); // socket close
return ret;
}
PrintF("%d:send back count: %d\r\n", sn, ret);
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
break;
case SOCK_CLOSE_WAIT :
if((ret=disconnect(sn)) != SOCK_OK) return ret;
PrintF("%d:Socket Closed\r\n", sn);
break;
case SOCK_INIT :
PrintF("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, destip[0], destip[1], destip[2], destip[3], destport);
if( (ret = connect(sn, destip, destport)) != SOCK_OK) return ret; // Try to TCP connect to the TCP server (destination)
break;
case SOCK_CLOSED:
close(sn);
if((ret=socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn) return ret; // TCP socket open with 'any_port' port number
PrintF("%d:TCP client loopback start\r\n",sn);
PrintF("%d:Socket opened\r\n",sn);
break;
default:
break;
}
return 1;
}