---
title: "[W5500] 소켓 생성 문의"
url: "https://maker.wiznet.io/forum/13579"
markdown_url: "https://maker.wiznet.io/forum/13579/md"
type: "Forum topic"
category: "Ethernet Chips"
author: "Member 1113"
created: "2019-11-20T23:21:47+09:00"
last_activity: "2024-08-29T07:01:05+09:00"
language: "ko"
views: 1468
replies: 8
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

# [W5500] 소켓 생성 문의

## Question

Asked by Member 1113 on 2019-11-20 in Ethernet Chips.

안녕하세요
W5500을 이용하여 TCP 통신을 하고자 합니다.

우선 ioLibrary를 DSP28335에 포팅하여 ping 테스트까지 확인 하였습니다.

제공한 loopback_tcps or loopback_tcpc를 실행하면 socket함수의 while 구문에서 빠져나오지 못하고 있습니다. socket.c의 socket함수 "while(getSn_SR(sn) == SOCK_CLOSED); "

wiz_NetInfo WIZNETINFO = { .mac = {0x00, 0x08, 0xdc,0x00, 0xab, 0xcd},
.ip = {192, 168, 1, 200},
.sn = {255,255,255,0},
.gw = {192, 168, 1, 1},
.dns = {8,8,8,8},
.dhcp = NETINFO_STATIC };

wiz_NetInfo getINFO = { .mac = {0x00, 0x00, 0x00,0x00, 0x00, 0x00},
.ip = {0x00, 0x00, 0x00, 0x00},
.sn = {0x00,0x00,0x00,0},
.gw = {0x00, 0x00, 0x00, 0x00},
.dns = {0,0,0,0},
.dhcp = NETINFO_STATIC };

ctlnetwork(CN_SET_NETINFO, (void*)&WIZNETINFO);
ctlnetwork(CN_GET_NETINFO, (void*)&getINFO);

getINFO 구조체를 확인하면 WIZNETINFO의 값과 같습니다.

이상태에서 PC에서 ping 수행시 정상 동작합니다.

아래 코드 실행
setSn_MR(0, Sn_MR_TCP);
setSn_PORT(0,3000);
setSn_CR(0,Sn_CR_OPEN);
while(getSn_CR(0));
while(getSn_SR(0) == SOCK_CLOSED); ==>> 여기 루프에서 빠져나오지 못함

참고로 아래 코드는 정상 동작함
Data1 = getVERSIONR(); // Data1 값 : 0x04
Data2 = getSn_TTL(0); // Data2 값 : 0x80
Data3 = getRTR(); // Data3 값 : 2000

소스 포트가 3000으로 설정된 상태에서
getSn_PORT(0) 실행 후 5 BYTE 수신됨
[0] 0x01, [1] 0x02, [2] 0x03, [3] 0x0B, [4] 0xB8 로 수신됨
더미 데이터(0~2), 결과(3~4) 값이 0x0BB8 (d 3000)

setSn_CR(0, Sn_CR_OPEN) 으로 설정 후 getSn_SR(0) 값 확인 시 0x13 이 아닌 0x00로 수신됨
getSn_SR(0) 실행 후 4 BYTE 수신됨
현재 - [0] 0x01, [1] 0x00, [2] 0x06, [3] 0x00
예상 - [0] 0x01, [1] 0x02, [2] 0x03, [3] 0x13(SOCK_INIT)

소켓생성에 필요한 다른 절차가 필요한가요??

## Replies

### Reply 1 by becky, 2019-11-21

필요한 다른 절차는 없습니다.
우선 ioLibrary를 업데이트하여 한번더 테스트 해보시길 바랍니다.
이전에 이와 비슷한 증상이 있었던 고객은 자삽 불량으로 확인되었습니다.
해당 고객도 PING은 전송되었지만 SOCKET 상태가 CLOSED에서 변하지 않았습니다.
한번 더 확인해보시길 바랍니다.

### Reply 2 by Member 1113, 2019-11-21 (in reply to reply 1)

"자삽 불량"이 뭔가요?

getSn_SR(0) 실행 후 4 BYTE 수신됨
현재 - [0] 0x01, [1] 0x00, [2] 0x06, [3] 0x00
예상 - [0] 0x01, [1] 0x02, [2] 0x03, [3] 0x13(SOCK_INIT)

getSn_SR 만 실행하면 왜 수신되는 더미 값이 [1][2][3][xx] 아니고 [1][0][6][xx] 인가요?
이전에도 이런 문의가 있었나요?

다른 모든 get 함수 실행 후 수신되는 더미값은 [1][2][3][xx] 형태입니다.

### Reply 3 by becky, 2019-11-21

자삽은 PCB 생산과정에서 기계를이용하여 부품을 삽입하는것을 말합니다.
PCB불량으로 추측됩니다.

![](https://avatars.discourse-cdn.com/v4/letter/s/a698b9/48.png) [W5100 접속문제 - PING은 잘됩니다.](https://forum.wiznet.io/t/topic/6620/6) [W5100](https://maker.wiznet.io/c/tcp-ip-chip/w5100/15)

> [\[2\]](https://maker.wiznet.io/forum_uploads/wiznet/original/2X/2/2dbd09e0c5635fc372b82b912525bb101f6333cf.png) 이전 인터페이스입니다. 현재는 TMS320F28379D 이며 이전은 TMS320F28335 입니다.

비슷한 증상을 겪으신 고객 문의글입니다.

### Reply 4 by Member 1113, 2019-11-21

getSn_SR 만 실행하면 왜 수신되는 값이 [1][2][3][xx] 아니고 [1][0][6][xx] 인가요?

다른 모든 get 함수 실행 후 수신되는 값은 [1][2][3][xx] 형태입니다.

### Reply 5 by Member 1113, 2019-11-21 (in reply to reply 4)

DGND 연결이 잘못되어 발생한 문제입니다.

### Reply 6 by becky, 2019-11-22

네 해결하셨다니 다행입니다.
감사합니다

### Reply 7 by kkumuk1, 2024-07-04

혹시 어느 DGND를 어떻게 잘못 연결하셨는지 알 수 있을까요?
w5300이긴한데, 같은 증상으로 고생하고 있습니다.
회로도상으로 GND연결에 특별히 문제가 보이지 않아서요.

### Reply 8 by kkumuk1, 2024-08-28

저의 경우에는 결국 두가지 문제였습니다.

1. write timing

2. TI DSP에서 외부 메모리접근 인터페이스 EMIF 설정문제

---

1. timing
   뭔가 common register와 socket register의 타이밍이 약간다른지도 모르겠습니다. 아니면 뭔가 모르는 아슬아슬한 경계에 있었던가요.
   (모든 register들을 확인한 것은 아니었지만) 주로 확인할만한 register들 write/read에 문제가 없었습니다.
   하지만 write timing을 바꾼뒤 socket 상태가 변경되었습니다.
   write timing을 좀 더 여유있게 바꿨습니다.

제가 바꾼 설정은 아래와 같습니다.

- 변경전
  Emif1Regs.ASYNC_CS4_CR.bit.R_SETUP = 4;
  Emif1Regs.ASYNC_CS4_CR.bit.R_STROBE = 36;
  Emif1Regs.ASYNC_CS4_CR.bit.R_HOLD = 0;

Emif1Regs.ASYNC_CS4_CR.bit.TA = 0;

Emif1Regs.ASYNC_CS4_CR.bit.W_SETUP = 0;
Emif1Regs.ASYNC_CS4_CR.bit.W_STROBE = 10;
Emif1Regs.ASYNC_CS4_CR.bit.W_HOLD = 0;

- 변경후
  Emif1Regs.ASYNC_CS4_CR.bit.R_SETUP = 0;
  Emif1Regs.ASYNC_CS4_CR.bit.R_STROBE = 63;
  Emif1Regs.ASYNC_CS4_CR.bit.R_HOLD = 0;

Emif1Regs.ASYNC_CS4_CR.bit.TA = 0;

Emif1Regs.ASYNC_CS4_CR.bit.W_SETUP = 100;
Emif1Regs.ASYNC_CS4_CR.bit.W_STROBE = 100;
Emif1Regs.ASYNC_CS4_CR.bit.W_HOLD = 0;

1. EMIF설정
   16bit설정을 32bit로 바꿨습니다.
   기본적으로 EMIF 는 memory interface라 w5300같은 외부장치에는 딱 맞는게 아닌 것 같습니다.
   16bit로 설정하면 DSP는 외부메모리에서 읽을 때 EMIF가 address도 알아서 바꿔가며 두번!을 읽고 내부적으로 32bit만들어 값을 전달해줍니다.
   일반 16bit메모리면 딱 좋은데 w5300 에서는 좀 안맞는 부분이 있습니다. (FIFOR같은 걸 읽는다든가)
   32bit로 설정하니 잘 되더군요.
   저는 16bit도 써야해서(다른 장치도 물려있어서) w5300 사용할 만 32bit로 바꿔서 처리했습니다.
   읽을 때 아래처럼 읽었습니다.
   Xinf_set_ASYNC_CS4_CR_ASIZE(0x02); // for w5300, EMIF 32bit
   enableAddrDecoder();
   ui32val = (*(volatile uint32_t *)(shell_addr));
   disableAddrDecoder();
   Xinf_set_ASYNC_CS4_CR_ASIZE(0x01); // for w5300, EMIF 16bit

오랜시간 도움주신 wiznet 기술지원에도 감사드립니다.

---

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