ctlwizchip(CW_GET_ID,(void*)tmpstr);
printf("\r\n=======================================\r\n");
printf(" WIZnet %s EVB Demos v%d.%.2d\r\n", tmpstr, VER_H, VER_L);
printf("=======================================\r\n");
printf(">> W5500 based SNTP Example\r\n");
printf("=======================================\r\n");
Display_Net_Conf(); // Print out the network information to serial terminal
#endif
/* Enable and setup SysTick Timer at a periodic rate */
SysTick_Config(SystemCoreClock / TICKRATE_HZ1);
/* Initialize buttons on the W5500 EVB board */
Board_Buttons_Init();
SNTP_init(0, ntp_server, 40, gDATABUF); // timezone: Korea, Republic of
while(1) {
/* Button: SW1 */
if(Check_Buttons_Pressed() == BUTTONS_BUTTON1)
{
printf("\r\n########## SW1 was pressed.\r\n");
do {}
while (SNTP_run(&time) != 1);
printf("%d-%d-%d, %d:%d:%d", time.yy, time.mo, time.dd, time.hh, time.mm, time.ss);
}
}
질문 하였을 때 이미 w5500evb.c를 참고 하였었는데 SNTP_run 함수의 리턴값이 0아고, 시간 정보가 받아와지지 않았습니다. 제 추측으로는 네트워크 설정과 ntp 서버 연결 문제 같은데…
제가 첨부해드린 이미지 처럼 메인문에 uint8_t ntp_server[4] = {128, 138, 141, 172}; 구문을 넣기만 해도 NTP서버와 연결이 되는건가요? (혹시나 또 다른 코드 구문을 추가해야 되나요?)
네트워크 기본 설정 관련해서 main.c에 아래와 같은 구문을 넣어주었는데, 이 작업으로 네트워크 설정이 되는건가요? (혹시 제가 잘못된 주소를 넣었을 수도 있을 것 같은데, 각각의 항목에 어떠한 주소를 넣어야 하는지도 답변 부탁드립니다.)
wiz_NetInfo gWIZNETINFO = { .mac = {0x0c, 0x01, 0x02, 0x22, 0xc0, 0xa8},
.ip = {192, 168, 21, 10},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 0, 1},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_STATIC };
sntp.c의 SNTP_run 함수에 ‘recvfrom(NTP_SOCKET, data_buf, RSR_len, (uint8_t *)&destip, &destport);’ 구문을 동작 시키면 SOCK_ERROR-5에러가 발생합니다.(#define SOCKERR_SOCKMODE (SOCK_ERROR - 5) ///< Invalid socket mode for socket operation.) 이 에러를 해결할 수 있는 방법을 문의드립니다.
SNTP_init(0, ntp_server, 40, gDATABUF); 함수에서 위의 변수에 저장한 서버 주소로 접속됩니다. 다른 추가 부분은 없습니다.
이변수에 네트워크 정보값을 저장하고, Net_Conf(gWIZNETINFO); 함수를 통해 정보가 설정됩니다.
첨부하신 이미지에는 Net_Conf등이 보이지 않는데 확인해보시기 바랍니다.
또
차례대로 mac address, ipaddress, subnet mask, gateway 주소인데 gateway와 ip주소의 네트워크 대역대가 다릅니다. 네트워크 설정하는방법에 대해 좀더 숙지하셔야할 것 같습니다.
Socket open이 제대로 되지않은 것 같습니다. Version Register를 read하시어 CHIP과 MCU간의 SPI 통신이 되고있는지부터 먼저 확인해 보시는게 좋을 것 같습니다.
IP가 192.168.21.10이라면 게이트웨이주소는 192.168.21.1이 일반적입니다.
IP를 192.168.21.10으로 설정하신 이유가 있으신가요?
임의로 설정하신거라면 환경에따라 통신이 되지않을 수도 있습니다.
게이트웨이 주소는 라우터의 주소를 설정하셔야합니다.
기술지원문의는 lucid@wiznet.io로 주시면됩니다
안녕하세요. 지난 번에 도움 감사드립니다.
현재 ntp 서버로부터 시간 정보는 받아와 지는데,
1~2번 시간 정보가 갱신된 후 mac,ip,sn,gw,dns,dhcp주소와 현재시간이 전부 0으로 초기화 되다가
다시 1~2번 시간 정보가 갱신된 후 전부 0으로 초기화 되는 증상이 반복됩니다.
do {}
while (SNTP_run(&time) != 1);
printf(“%d-%d-%d, %d:%d:%d”, time.yy, time.mo, time.dd, time.hh, time.mm, time.ss);
문제는 위 구문인 것 같은데, 현재 위 구문을 main.c의 int main함수 내에 넣어 두었습니다. (물론 다른 곳에 넣어도 같은 증상이 반복됩니다.)
while (SNTP_run(&time) != 1);을 if (SNTP_run(&time) != 1);로 바꾸었을 때는 mac, ip, sn, gw, dns, dhcp주소가 0으로 초기화 되지는 않지만 시간은 1~2번만 가져옵니다. ('SNTP_run(&time);'으로 하여도 마찬가지 입니다. 간혹 길게는 2분 정도 시간정보를 얻어오다 멈추기도 합니다.)
이를 해결하여 mac, ip, sn, gw, dns ,dhcp주소와 시간 정보가 0으로 초기화 되지않고 시간 정보를 연속으로 받아지게 하려면 어떻게 해야할까요? 조언 부탁드립니다.
→
시간 정보가 받아질 때는 sntp.c에서 getSn_RX_RSR(NTP_SOCKET)의 값이 56이 되어 아래 빨간 표시한 조건문에 들어가서 시간 정보가 띄어지는데, 잘 동작하다 어느 순간에 getSn_RX_RSR(NTP_SOCKET)의 값이 0만 띄어져 아래 빨간 표시한 조건문이 만족하지 않아 시간 정보가 뜨지 않네요… 혹시 예상되는 문제점을 알 수 있나요?
답변 감사합니다. 시간이 1~2번만 받아와지고 멈출 때, ntp_retry_cnt이 1에서 멈춰져 있길래 0값을 넣어 주었더니 다시 1~2번 동작합니다. 그래서 SNTP_run 함수 안에 ‘if(ntp_retry_cnt>0) ntp_retry_cnt=0;’ 조건문을 넣어주었더니 멈추지 않고 연속으로 잘 동작합니다!
혹시 ntp_retry_cnt이 1에서 멈춰져 시간이 안받아와졌던 이유를 알 수 있을까요?