WIZnet Developer Forum

W5300 pc와의 연결 문의

안녕하세요
현재 TI사의 28346과 Wiznet사의 W5300을 이용하려고 합니다.

Data bus 간의 연결은 확인 하였으며,(설정 ip와 Read한 데이터가 동일)
PC->W5300 으로의 PING 테스트도 확인 하였습니다.

이후 AX1 프로그램을 사용하여 Loopback 시험을 하려고 하는데
PC를 Client로 하면 "Connetc Fail"이 나옵니다.

다른 글들을 보니 방화벽 관련 내용이 나오기는 하는데…
방화벽을 어떻게 건드려야하는지… 혹은 다른 문제가 있을 수 있는지…
확인 부탁 드립니다.

안녕하세요 :slight_smile:

TCP 연결을 하시는지 UDP 연결을 하시는지는 잘모르겠습니다만 해당 연결을 하실때 TCP/UDP 해당 소켓을 오픈하지 않고 연결 시도를 하신게 아닐까 생각이 듭니다.

방화벽 문제 이전에 확인해 보시기 바랍니다.

Loopback TEST를 하시려면 MCU에 Loopback Firmware가 올라가있어야 테스트가 가능합니다.
IP 세팅만 하신 후 테스트시 ping TEST밖에 되지 않습니다.

감사합니다.

답변 감사합니다.
현재 TCP 연결이며,PC:Client, W5300:Sever로 먼저 진행중입니다.

몇가지 질문이 있습니다.

  1. SOCKET OPEN은 loopback함수를 부를때 마다 해주어야 하는 것인가요?
    아래와 같이 코드를 구성하였으며, (타이머 인터럽트로 loopback_tcps()를 매 주기마다 호출함)
    PC와 W5300간의 Connect는 확인 하였습니다.
  2. PC(Clilent) --> W5300(Server)로 데이터 전송을 하였는데 “invalid data” 경고창이 나왔습니다.
    디버깅 포인트를 알고 계시다면 확인 부탁 드립니다.

void main()
{

START:
setSn_MR(0, Sn_MR_TCP); //Sn_MR(0) = 0x0001;
IINCHIP_WRITE(Sn_PORTR(0), 5001); //Sn_PORTR(0) = 0x1388; //decimal = 5000
setSn_CR(0, Sn_CR_OPEN); //Sn_CR(0) = Sn_CR_OPEN;
kkk = getSn_SSR(0);
if(getSn_SSR(0) != SOCK_INIT)//if(Sn_SSR(0) != SOCK_INIT)
{
setSn_CR(0, Sn_CR_CLOSE); //Sn_CR(0) = Sn_CR_CLOSE;
goto START;
}

}

void loopback_tcps(SOCKET s, uint16 port, uint8* buf, uint16 mode)
{
uint32 len;
printf("%d : \n",timer_cnt);
vvv = getSn_SSR(s);
switch(getSn_SSR(s)) // check SOCKET status
{ // ------------
case SOCK_ESTABLISHED: // ESTABLISHED?
printf(“esta\r\n”);
if(getSn_IR(s) & Sn_IR_CON) // check Sn_IR_CON bit
{
printf("%d : Connect OK\r\n",s);
setSn_IR(s,Sn_IR_CON); // clear Sn_IR_CON
}
if((len=getSn_RX_RSR(s)) > 0) // check the size of received data
{
len = recv(s,buf,len); // recv
if(len !=send(s,buf,len)) // send
{
printf("%d : Send Fail.len=%d\r\n",s,len);
}
}
break;
// ---------------
case SOCK_CLOSE_WAIT: // PASSIVE CLOSED
disconnect(s); // disconnect
printf(“wait\r\n”);
break;
// --------------
case SOCK_CLOSED: // CLOSED
printf(“closed\r\n”);
_close(s); // close the SOCKET
socket(s,Sn_MR_TCP,port,mode); // open the SOCKET
break;
// ------------------------------
case SOCK_INIT: // The SOCKET opened with TCP mode
printf(“init\r\n”);
listen(s); // listen to any connection request from “TCP CLIENT"
printf(”%d : LOOPBACK_TCPS(%d) Started.\r\n",s,port);
break;
default:
printf(“default\r\n”);
break;
}
}

Server를 타이머 인터럽트로 매주기마다 호출는 방식이면 타임아웃이 발생하여 Connection 및 데이터 전송이 안될 수 있습니다. 해당 타이머 주기가 Timeout 주기보다 더 길어서 발생하는 문제로 예상됩니다. 물론 그렇게 사용한다면 통신속도에도 영향을 미칠거구요.
꼭 그렇게 사용하셔야되는게 아니라면 While문으로 loopback함수를 잡아주시던지 아니면 W5300의 인터럽트 레지스터를 이용해 Loopback 함수를 호출하시던지하는 방식으로 코드를 짜시면 될 것 같습니다.

답변 감사합니다.

말쓰하신대로 main while문으로 loopback 함수 호출하여 data invalid 문제 해결하였습니다.

위의 1번 질문에 연장선으로 다시 문의 드립니다.
Socket open은 한번만 해주면 되는지…
Datasheet의 "5.Functional Description"에 보면 Socket Initialization, Listen, Establich…에 관한 코드들이 있는데요…
이것들을 모두 사용하는 것인가요?
다시 한번 답변 부탁 드립니다.

Open, Listen, Established, Closed는 소켓의 상태를 말합니다.

Sn_CR 레지스터로 소켓을 열고 상태를 변경하고 할 수 있습니다. 모든 Command(Sn_CR)는 한번만 하셔도됩니다.

DataSheet에는 칩의 Register 사용법이 기재되어있고 제공되는 io드라이버는 그 레지스터를 사용하여 API를 만들어 놓은 겁니다.
Loopback 함수 내부를 보시면 C언어를 아시는 분이면 어떻게 동작하는지 Flow가 보이실겁니다.

다시 한번 코드를 보세요~ ^^

포럼 답변 덕분에 W5300-TI DSP 연결하여 Loopback 시험을 완료하였습니다.

Recv(), Send() 함수의 수행 시간이 약 80usec 정도 나오는데 이정도 속도가 맞는 건지 확인 부탁 드립니다.
데이터는 "111"을 주고 받았습니다.

자답입니다.

recv(), send()시간이 길었던 것은 큰 용량을 Loopback 시켜서 발생한 것으로 보입니다.
AX1 프로그램에서 TCP-Send를 통해 1byte data만 Loopback 하니 3us 정도로 측정이 되었습니다.

이 외에 추가적인 질문입니다.

loopback 함수를 100usec 타이머 주기로 동작 시키고자 하는데 data invalid 경고창이 떴습니다.
지난번 답변에서는 Timeout 문제를 말씀해주셨었는데…
Timeout 주기가 변경가능한 것인지 확인 요청 드립니다.

안녕하세요 :slight_smile:

무사히 테스트를 하셨다니 다행입니다.
timeout 시간 조정 가능합니다.
데이터 시트에서 RTR 레지스터 참조하시면 됩니다!!

연휴 잘보내세요~!

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