[W5500] 소켓 생성 문의

안녕하세요
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)

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

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

"자삽 불량"이 뭔가요?

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] 형태입니다.

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

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

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

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

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

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

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

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

  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 기술지원에도 감사드립니다.