STM32F 에 W5500 라이브러리 설치 후 셋업

안녕하십니까?

메일을 보내도 답장도 없고 전화 문의는 내용을 잘 몰라서 모르겠다 하시고 여기다 문의 하라고 해서 이곳에 글 남깁니다. (많이 실망 했습니다. 전에 계셨던 분은 정말 친절하게 해주셨던 기억만 있었나 보네요.)

우선 회로 상에는 문제가 없음을 기본 전제 조건으로 문의 드립니다.

약 4년전에 교육 받았을당시 사용 했던 W5500 관련 IO_Library를 사용하고 있습니다.
그리고 STM32F 제품 프로그램 상에서 아래와 같이 설정을 하고 있습니다.

////////////////////////////// W5500 //////////////////////////////////////////////////////////

BYTE buffer[512]; // file copy buffer

wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef},
.ip = {192, 168, 11, 194},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 11, 1},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_STATIC};
/////////////////////////////////////////////////////////////////////////////////////////////

main 에서는

Load_Net_Parameters();
W5500_Config();
W5500Initialze();

wizchip_setnetinfo(&gWIZNETINFO);
print_network_information();

W5500_CS_On;
W5500_RST_On;

위와 같이 사용 하고 있구요.

while(1){//W5500 TEST for loopback OK~!
loopback_tcps(0,buffer,12345);
}

void print_network_information(void){

wizchip_getnetinfo(&gWIZNETINFO);
printf(“IP address : %d.%d.%d.%d\n\r”,gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);
printf(“SM Mask : %d.%d.%d.%d\n\r”,gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);
printf(“Gate way : %d.%d.%d.%d\n\r”,gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);
printf(“DNS Server : %d.%d.%d.%d\n\r”,gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);
}

void W5500_Socket_Set(void){
if(S0_State==0){
if(S0_Mode==TCP_SERVER){
if(Socket_Listen(0)==TRUE) S0_State=S_INIT; else S0_State=0;
}
else if(S0_Mode==TCP_CLIENT){
if(Socket_Connect(0)==TRUE) S0_State=S_INIT; else S0_State=0;
}
else{
if(Socket_UDP(0)==TRUE) S0_State=S_INIT|S_CONN; else S0_State=0;
}
}
}

////// 찾아 보라고 해서 찾은 내용인데 에러만 뜨네요.
void Load_Net_Parameters(void){
//if flash is enabled
if (SPI_FLASH_ReadID() == FLASH_ID) {
delay();
SPI_FLASH_BufferRead(Gateway_IP, FLASH_GATEWAY_IP_ADDR, FLASH_GATEWAY_IP_SIZE);
delay();
SPI_FLASH_BufferRead(Sub_Mask, FLASH_SUBNET_MASK_ADDR, FLASH_SUBNET_MASK_SIZE);
delay();
SPI_FLASH_BufferRead(Phy_Addr, FLASH_PHY_ADDR_ADDR, FLASH_PHY_ADDR_SIZE);
delay();
SPI_FLASH_BufferRead(Local_IP, FLASH_LOCAL_IP_ADDR, FLASH_LOCAL_IP_SIZE);
delay();
SPI_FLASH_BufferRead(S0_Port, FLASH_LOCAL_PORT_ADDR, FLASH_LOCAL_PORT_SIZE);
}
else {
/* 加??? */
Gateway_IP[0] = GATEWAY_IP_ADDR_1;
Gateway_IP[1] = GATEWAY_IP_ADDR_2;
Gateway_IP[2] = GATEWAY_IP_ADDR_3;
Gateway_IP[3] = GATEWAY_IP_ADDR_4;

/* 加?子?掩? */
Sub_Mask[0] = SUBNET_MASK_1;
Sub_Mask[1] = SUBNET_MASK_2;
Sub_Mask[2] = SUBNET_MASK_3;
Sub_Mask[3] = SUBNET_MASK_4;

/* 加?物理地址 */
Phy_Addr[0] = PHY_ADDR_1;
Phy_Addr[1] = PHY_ADDR_2;
Phy_Addr[2] = PHY_ADDR_3;
Phy_Addr[3] = PHY_ADDR_4;
Phy_Addr[4] = PHY_ADDR_5;
Phy_Addr[5] = PHY_ADDR_6;

/* 加?IP地址 */
Local_IP[0] = LOCAL_IP_ADDR_1;
Local_IP[1] = LOCAL_IP_ADDR_2;
Local_IP[2] = LOCAL_IP_ADDR_3;
Local_IP[3] = LOCAL_IP_ADDR_4;

/* 加?端口0的端口?5000 /
S0_Port[0] = S0_PORT_1;
S0_Port[1] = S0_PORT_2;
}
/
加?端口0/1的工作模式 */
S0_Mode = S0_MODE;
S1_Mode = S1_MODE;
}
}

위 처럼 테스트를 해보라고 해서 사용 하고 있습니다.
PING 테스트에서는 아무런 반응이 없고.

여기서 질문 드립니다.

IO_Library가 4년전 가지고 있던 자료이니 최신 버젼의 자료가 따로 있는지 있다면 어디서 받아야 되는지…

W5500 초기 셋업시 어떤걸 해줘야 되고 어떤 순서로 하는지 나와 있는 자료가 있는지 있다면 어디서 받아야 되는지…

추가 질문 드려요~

Load Net Parameters 에서 사용 되는 변수?는 어디에서 지정이 되어 있는건가요?

구글 검색 해도 못찾겠네요.
FLASH_ID
Gateway_IP
FLASH_GATEWAY_IP_ADDR
FLASH_GATEWAY_IP_SIZE
등등…

이 내용 확인 부탁 드립니다.

안녕하세요.
먼저, 실망하셨다니, 죄송합니다.
4년전 교육당시 코드가 어떤 코드인지 알수가 없으니, 해당 코드로 확인해 드릴수 는 없을 것 같습니다.

  1. ioLibrary 최신버전은 아래의 GitHub 링크로 가시면 됩니다.
  1. W5500초기 셋업은 어떤걸 말씀하시는건가요?
    보통 W5500을 셋업할때는,
  • reg_wizchip_spi_cbfunc or reg_wizchip_spiburst_cbfunc 함수를 이용하여 Callback 함수를 정의해줍니다
  • network 정보를 넣어줍니다.
  • wizphy_getphylink 함수를 통해 PHY Link를 확인한 후 Ping Test 를 진행합니다.

위와 같은 세팅이 제대로 되었다면, 네트워크 환경은 잡힌것입니다.

WIZnet에서 공식적으로 제공하는 Reference code에는 말씀하신 Load Net Parameters 함수는 없습니다.
저희가 공식적으로 제공하는 Reference code 중 STM32F103을 이용하여 사용한 코드가 있습니다.

위의 코드를 참고하셔서 변경하시면 됩니다.

감사합니다.
irina

안녕하세요
전체 코드가 어떻게 되어있는지는 잘 모르겠지만 이부분은 아마도 IP, GateWay 등 network 정보를 Flash에서 받아오는 코드 같습니다.
이전에 처음 Flash에 Network 정보를 저장하고 이후 부팅했을 때 Flash에서 저장된 정보가 있으면 정보를 받아오는 코드 같습니다.

감사합니다.
Teddy

안녕하세요?
빠른 답변 감사 합니다.

  1. 최신 IO_Library 는 최신 버전과 제가 가지고 있는게 큰 차이는 없는거 같습니다.
    우선 이부분은 패스~

  2. 초기 셋업
    이것을 참고 하고 있고…W5500 Ethernet shield spi dma rx 데이터 수신이 안됩니다.
    아래 내용은 일전에 작업 했던 소스 입니다.
    void W5500Initialze(void){
    unsigned char temp;
    unsigned char W5500FifoSize[2][8] = {{2,2,2,2,2,2,2,2,},{2,2,2,2,2,2,2,2}};

W5500DeSelect();
// spi function register
reg_wizchip_spi_cbfunc(W5500ReadByte, W5500WriteByte);
//reg_wizchip_spiburst_cbfunc(wizchip_burst_read, wizchip_burst_write);
// CS function register
reg_wizchip_cs_cbfunc(W5500Select, W5500DeSelect);
if(ctlwizchip(CW_INIT_WIZCHIP,(void*)W5500FifoSize) == -1){printf(“W5500 initialized fail.\r\n”);}
do{//check phy status.
if(ctlwizchip(CW_GET_PHYLINK,(void*)&temp) == -1){printf(“Unknown PHY link status.\r\n”);}
}while(temp == PHY_LINK_OFF);
}
2-2 •network 정보를 넣어줍니다.

////////////////////////////// W5500 //////////////////////////////////////////////////////////
BYTE buffer[512]; // file copy buffer

wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef},
.ip = {192, 168, 11, 194},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 11, 1},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_STATIC};
/////////////////////////////////////////////////////////////////////////////////////////////
wizchip_setnetinfo(&gWIZNETINFO);

W5500_Config();
W5500Initialze();

wizchip_setnetinfo(&gWIZNETINFO);
print_network_information();

위와 같은 순서로 설정 하고

2-3
main 에서

while(1){//W5500 TEST for loopback OK~!
loopback_tcps(0,buffer,12345);
}

요렇게 하고 있습니다.

PC에서 Ping 192.168.11.194 -5 라고 실행 하면

요청 시간이 만료 되었다고 나옵니다.

어디가 문제 일가요?

요 글을 보고 했었습니다만 지금은 지웠습니다.

글 썼는데 지워 졌는지 안보이네요.

우선 빠른 답변 감사합니다.

메인에서 아래와 같이 설정 해줍니다.
W5500_Config(); <=== STM32F407 에서 I/O SPI 등을 설정.
W5500Initialze();

wizchip_setnetinfo(&gWIZNETINFO);
print_network_information();

//////////////////
void W5500Initialze(void){
unsigned char temp;
unsigned char W5500FifoSize[2][8] = {{2,2,2,2,2,2,2,2,},{2,2,2,2,2,2,2,2}};

W5500DeSelect();
// spi function register
reg_wizchip_spi_cbfunc(W5500ReadByte, W5500WriteByte);
//reg_wizchip_spiburst_cbfunc(wizchip_burst_read, wizchip_burst_write);
// CS function register
reg_wizchip_cs_cbfunc(W5500Select, W5500DeSelect);
if(ctlwizchip(CW_INIT_WIZCHIP,(void*)W5500FifoSize) == -1){printf(“W5500 initialized fail.\r\n”);}
do{//check phy status.
if(ctlwizchip(CW_GET_PHYLINK,(void*)&temp) == -1){printf(“Unknown PHY link status.\r\n”);}
}while(temp == PHY_LINK_OFF);
}
위와 같이 초기화
////////////////////////////// W5500 //////////////////////////////////////////////////////////
BYTE buffer[512]; // file copy buffer

wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef},
.ip = {192, 168, 11, 194},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 11, 1},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_STATIC};
/////////////////////////////////////////////////////////////////////////////////////////////

위와 같이 설정

while(1){//W5500 TEST for loopback OK~!
loopback_tcps(0,buffer,12345);
}
과 같이 해놓고

PING 테스트를 하면 요청시간이 만료 되었다고 나옵니다.

이럴 경우 어디를 확인 해봐야 될까요?

LAN 콘넥터 쪽 LED는 녹색은 깜빡이고 주황색 계속 불이 들어 옵니다.

안녕하세요 위즈네트 박병택입니다.

PC의 IP 주소를 확인하셔서 Device의 IP를 맞춰서 확인 하시기 바랍니다.

감사합니다.
Teddy

안녕하세요? 제가 잘 몰라서 그러는데… W5500 에서 맞춰야 되는
////////////////////////////// W5500 //////////////////////////////////////////////////////////
BYTE buffer[512]; // file copy buffer

wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef},
.ip = {192, 168, 11, 194},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 11, 1},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_STATIC};
/////////////////////////////////////////////////////////////////////////////////////////////
이곳의 IP가 연결 되는 PC의 IP 주소랑 같으면 되는건가요?

현재 네이버에서 IP 검색으로로 나오는 IP주소로
////////////////////////////// W5500 //////////////////////////////////////////////////////////
BYTE buffer[512]; // file copy buffer

wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef},
.ip = {192.168.1.60}, <====== IPV4 주소:
.sn = {255, 255, 255, 0},
.gw = {192, 168, 11, 1},
.dns = {8, 8, 8, 8}, <===IPv4 DNS 서버
.dhcp = NETINFO_STATIC};
/////////////////////////////////////////////////////////////////////////////////////////////

설정을 하고

PC랑 W5500과 연결 해서 확인을 해보면

Ping 192.168.1.60 32바이트 데이터 사용:
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.

W5500보드에서 케이블을 빼서 PC랑 인터넷 여결 하면

192.168.1.60의 응답: 바이트=32 시간<1ms TTL=128
192.168.1.60의 응답: 바이트=32 시간<1ms TTL=128
192.168.1.60의 응답: 바이트=32 시간<1ms TTL=128
192.168.1.60의 응답: 바이트=32 시간<1ms TTL=128
192.168.1.60의 응답: 바이트=32 시간<1ms TTL=128
192.168.1.60의 응답: 바이트=32 시간<1ms TTL=128
192.168.1.60의 응답: 바이트=32 시간<1ms TTL=128
192.168.1.60의 응답: 바이트=32 시간<1ms TTL=128
192.168.1.60의 응답: 바이트=32 시간<1ms TTL=128

이렇게 나옵니다.

요렇게 나옵니다.

뭐가 문제 인지… 모르겠네요. (인터넷 쪽은 전혀 모릅니다.)

  1. CMD 창에서 ipconfig 로 IP주소와 Gateway 등 화면을 캡쳐 해 주셨으면 합니다.
    PC 주소가 고정로 되어있는지 자동으로 되어있는지 확인부탁드립니다.


    자동으로 되어있다면
    W5500 ip 192.168.1.60 의 뒤자리만 바꿔서 설정하시기 바랍니다.
    W5500 gw ={192.168.1.1}로 변경하시고 W5500과 연결하여 테스트 하시기 바랍니다.

  2. W5500보드에서 케이블을 빼서 PC랑 인터넷 연결 했다는 것은 어떻게 연결하신것인지 모르겠습니다.
    PC ---- 공유기 -----W5500 이렇게 연결하신 것인지 확인 부탁드립니다.

감사합니다.


위와 같이 설정이 되어 있구요.

PC ---- 공유기 ---- W5500 으로 연결 되어 있습니다.

PING 테스트는 케이블 꽃아도… 안꽃아도 동작을 하네요…

https://blog.naver.com/newspacekor/221527118723

상기 동영상 확인 부탁 드립니다.

안녕하세요.

해당 동영상을 보니, PC 와 W5500의 동일한 IP를 쓰고 있네요,(IP 192.168.1.60)…
공유기에 연결된 장치들은 같은 IP를 쓰게 되면 충돌이 나게 됩니다.
외부로 나가는것이 아닌것이라면,
공유기에 연결하지 말고, PC와 W5500을 LAN cable로 바로 연결해서 사용하셔도 됩니다.
해당 IP도 아래와 같이 변경하셔서 테스트 하시길 바랍니다.
image

감사합니다
irina

안녕하세요?

빠른 답변 감사합니다.

다름이 알려 주신대로 하였으나 동작을 안해서 재 점검 결과 IP 주소 값이 틀려서 변경 하여 PING 테스트는 동작을 잘 하고 있습니다.

감사합니다.

https://blog.naver.com/newspacekor/221527639905

보내 주신 이미지는 먼서 양해를 못구하고 사용 하게 된점 죄송합니다. 혹여나 싫으시다면 바로 지우겠습니다.

그리고 블로그에도 글을 남기긴 하였고 포럼에도 답글이 올라 오긴 했습니다만…

수신 해서 데이타를 저장 하는 부분과 데이타를 송신 하는 부분 한번 더 설명 좀 부탁 드려도 될까요?

바쁜 시간 자꾸 뺏어서 죄송합니다.

loopback 함수에서


이부분 수정하셔서 참고 하시면 될 것 같습니다.
여기 코드 참고 하시기 바랍니다.

동작 시 PC Client 프로그램에서 W5500에 접속하셔서 데이터를 보내시기 바랍니다.


감사합니다.

안녕하세요?

동영상에 보면…

SOCK ESTABLISHED <=== 이부분을 안들어 갑니다.

처음에 접속을 하면.

case : SOCK_CLOSED <=== 이부분을 지나고

case SOCK_INIT <==== 그다음에 이부분을 지나고

case SOCK_LISTEN: <===== 그리고는 이곳에서 계속~~~~ 무한 루프를 돌고 있습니다.

클라이언트 접속이 되면

case SOCK_ESTABLISHED <==== 이부분을 동작 한다고 하셨는데.

그럼 지금 사항은 클라이언트 접속이 안되어 있다는 얘기 같고.

그래서 확인을 해보니 제가 툴에서 server로 해놨더군요.

우선 데이타 잘 나옵니다~

몇일전 유선상의 불쾨 했던 점들이 말끔이 해소가 되네요.

감사합니다 ^.^