ti dsp 28377에서 w5300을 TCP서버로 설정 시 접속 문제

ti dsp 28377 에다가 w5300칩을 16bit bus 붙였습니다.

​W5300칩을 UDP와 TCP 슬레이브로 설정하면 접속 및 송수신이 잘 됩니다.

그런데, W5300칩을 TCP 서버로 설정하면 접속이 되지않고 10061에러가 발생합니다.

소켓 오픈하고, 리슨상태로 되었는데, 접속 거부가 되는 이유가 무었이 있을까요?

아이피 세팅은 잘 되어서 ping은 잘 옵니다. tcping 결과는 포트가 열려있지 않다고 나옵니다.

아래는 설정입니다.

wiz_NetInfo gWIZNETINFO = {
.mac = {0x00, 0x08, 0xdc, 0, 0, 0},
.ip = {192, 168, 0, 55},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 0, 1},
.dns = {0, 0, 0, 0},
.dhcp = NETINFO_STATIC
};

uint32_t MR_addr;
uint16_t wiznetErr = 0;
uint16_t wiznet_memsize[2][8] = {{8,8,8,8,8,8,8,8}, {8,8,8,8,8,8,8,8}};

void tcp_Init(void)
{

reg_wizchip_bus_cbfunc(W5300_read, W5300_write);

MR_addr = getMR();

wiznetErr = ctlwizchip(CW_INIT_WIZCHIP, (void*)wiznet_memsize);

ctlnetwork(CN_SET_NETINFO, (void *)&gWIZNETINFO);

wizchip_getnetinfo(&gWIZNETINFO_CHK);

}

int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret;
uint16_t size = 0, sentsize=0;
char txBuf[100];

#ifdef LOOPBACK_DEBUG
uint8_t destip[4];
uint16_t destport;
#endif
retSR = getSn_SR(sn);

switch(retSR)
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
#ifdef LOOPBACK_DEBUG
getSn_DIPR(sn, destip);
destport = getSn_DPORT(sn);

        sprintf(txBuf, "%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
        print485_1(txBuf,strlen(txBuf));

#endif
setSn_IR(sn,Sn_IR_CON);
}
if((size = getSn_RX_RSR(sn)) > 0) // Don’t need to check SOCKERR_BUSY because it doesn’t not occur.
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
ret = recv(sn, buf, size);

        if(ret <= 0) return ret;      // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
        size = (uint16_t) ret;
        sentsize = 0;

        while(size != sentsize)
        {
            ret = send(sn, buf+sentsize, size-sentsize);
            if(ret < 0)
            {
                _close(sn);
                return ret;
            }
            sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
        }
     }
     break;
  case SOCK_CLOSE_WAIT :

#ifdef LOOPBACK_DEBUG
sprintf(txBuf, “%d:CloseWait\r\n”,sn);
print485_1(txBuf,strlen(txBuf));
#endif
if((ret = disconnect(sn)) != SOCK_OK) return ret;
#ifdef LOOPBACK_DEBUG
sprintf(txBuf,“%d:Socket Closed\r\n”, sn);
print485_1(txBuf,strlen(txBuf));
#endif
break;
case SOCK_INIT :
if( (ret = listen(sn)) != SOCK_OK) return ret;
#ifdef LOOPBACK_DEBUG
sprintf(txBuf, “%d:Listen, TCP server loopback, port [%d]\r\n”, sn, port);
print485_1(txBuf,strlen(txBuf));
#endif
break;
case SOCK_CLOSED:
if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
#ifdef LOOPBACK_DEBUG
sprintf(txBuf, “%d:Socket opened\r\n”,sn);
print485_1(txBuf,strlen(txBuf));
#endif
break;
default:
break;
}
return 1;
}
image
image

자체적으로 해결했습니다.
초기화 함수에서 라이브러리 함수를 이용해서 포트를 열어주니 되네요.
초기화 함수에 아래 코드를 추가했습니다. 원래 loopback 루틴에서 열어줘야 하는데… 뭔가가 빠져있는 것 같습니다.
setSn_MR(0, Sn_MR_TCP);
IINCHIP_WRITE(Sn_PORTR(0), recvPort);
setSn_CR(0, Sn_CR_OPEN);

잘 해결되어 다행입니다.