WIZnet Developer Forum

W5100 설정질문드립니다

Datasheet를 보고 아래와 같이 설정 시퀀스를 거쳐서 설정 중입니다
문제는 아래 컴퓨터(Destination)IP 및 PORT설정시 저장이 안되는 부분입니다

연결정보는 아래와 같습니다

W5100(클라이언트) <==> 컴퓨터(서버)
LAN케이블 : 크로스트

----------------------------------구현된 W5100 클라이언트모드 설정 절차----------------------------

  1. Mode(MR) : 0x80 RESET
  2. Gateway Addr 셋팅(W5100) : 정상 저장됨
  3. Subnet mask Addr 셋팅(W5100) : 정상 저장됨
  4. MAC addr 셋팅(W5100) : 정상 저장됨
  5. Source IP Addr 셋팅(W5100) : 정상 저장됨
  6. RX버퍼 사이즈 설정 : 정상 저장됨
  7. TX버퍼 사이즈 설정 : 정상 저장됨
  8. 소켓1 TCP모드 설정
  9. 소켓1 포트설정
  10. 소켓1 OPEN
  11. 소켓1 스테이터스 읽기 결과 : 0x13
  12. 소켓1 Destination IP Addr셋팅(컴퓨터) : 저장 안됨 (0리턴됨) <<문제가 되는 부분
  13. 소켓1 Destination PORT Addr셋팅(컴퓨터) : 저장 안됨 (0리턴됨) <<문제가 되는 부분
  14. 소켓1 커넥트 실시
  15. 소켓1 인터럽트 읽기 결과 : 0리턴됨
  16. 소켓1 스테이터스 읽기 결과 : 1리턴됨

상기 과정에 문제가 있는지 답변 부탁드립니다

과정 자체에는 문제가 없어보입니다.
하지만 Destination IP와 Port가 셋팅 되지않는게 잘 이해가 안됩니다.
Destination IP Addr과 Port를 셋팅할 때 어떻게 셋팅을 하시는지요?
DataSheet를 보고 직접 Driver를 짜신건가요?
TCP Client 구현을 하고싶다면 저희 WIZnet에서 제공하는 ioLibrary에 Loopback 코드의 tcpcloopback 함수를 참고하시면 좋을것 같습니다.
저희 ioLibrary의 링크는 github.com/Wiznet/ioLibrary_Driver 입니다.

드라이버 구현을 직접하였습니다 내부 사정상 라이브러리 사용이 어려운 이유에서 입니다
예로 아이피를 0x040C번지에 192를 저장한후 다시 0x040C번지 값을 읽으면 0으로 반환되고 있습니다
하기 EnetWriteData함수는 처음 포스트에서 언급하였듯이,
소스측(W5100) 아이피 설정이 정상적으로 저장되고 읽어지는 것으로 검증이 되었다고 생각합니다
하기에 코드를 부분적으로 정리하여 올렸는데 검토 부탁드립니다
감사합니다

---------------------Destination IP설정---------------------주의! Socket1은 W5100 Datasheet 에서 Socket0을 의미함
#define REG_SOC1DIPR1 0x040C //Socket 1 Des IP Address 1: 0x040C
#define REG_SOC1DIPR2 0x040D //Socket 1 Des IP Address 2: 0x040D
#define REG_SOC1DIPR3 0x040E //Socket 1 Des IP Address 3: 0x040E
#define REG_SOC1DIPR4 0x040F //Socket 1 Des IP Address 4: 0x040F

EnetWriteData(REG_SOC1DIPR1, 192);
EnetWriteData(REG_SOC1DIPR2, 168);
EnetWriteData(REG_SOC1DIPR3, 0);
EnetWriteData(REG_SOC1DIPR4, 1);
---------------------Destination IP설정---------------------

------------------EnetWriteData함수 구현-----------------
int EnetWriteData(unsigned int Addr, unsigned char Data) {
ENET_W5100DI; //SS핀 로우
if (SPISendByte(WRITE_OPCODE) != 0x0000) {
//error
return ERROR;
}
if (SPISendByte(Addr) != 0x0100) { //상위 주소 송신(MCU가 상위 1바이트를 송신함)
//Error
return ERROR;
}
if (SPISendByte(Addr << 8) != 0x0200) { //하위 주소 송신(MCU가 상위 1바이트를 송신함)
//Error
return ERROR;
}
if (SPISendByte(Data << 8) != 0x0300) { //상위 1바이트 송신하는 MCU이므로 좌 시프트 8번 함.
//Error
return ERROR;
}
delay_us(5);
ENET_W5100EN; //SS핀 하이
return SUCCESS;
}
------------------EnetWriteData함수 구현-----------------

안녕하세요 :slight_smile:

정상동작으로 보여집니다.
Destination IP와 port를 connect 실시후에 read해보시길바랍니다.
write하더라도 connect command가 내려가야지 register에 저장되도록 되어있습니다.

빠른 답변 감사드립니다 :smiley:
커넥트 명령 후 정상적으로 저장되는것을 확인하였습니다
지원 감사합니다

잘해결되어 다행입니다 ^^

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