W7500P보드(WIZ750SR)를 PC(노트북)에 직업 연결시 sendto 지연 문제 입니다.

안녕하세요. W7500P 사용해서 보드를 개발중에 있습니다.
(W5100, W5200, W5500등으로 제품을 개발 경험이 있습니다)

  1. PC – S/W HUB – W750SR 연결 구조에서 이상이 없던 코드가
  2. PC – W750SR 연결 구조에서 문제가 발생하여 테스트 중입니다.

먼저 UDP에 문제가 있는것 같아 아래의 Loopback 코드를 테스트 했습니다.
위의 1번 연결 구조에서는 문제가 없지만 2번 구조로 연결하면
전송후 응답 지연이 길게는 4초 까지 발생합니다.

@ 아래 코드에서 아래의 printf 부분을 삭제하면 지연이 발생하지 않습니다.

       printf("size:%dBytes : ", ret);
       for (int i = 0; i < ret; i++)
       {
            printf ("%02x ", buf[i]);
       }
       printf("\n");

@ printf 부분 대신 delay_ms(1) 같은 지연 함수를 사용해도 증상이 같습니다.

  • 테스트 코드 입니다.
int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port)
{
	#define DATA_BUF_SIZE 1024

	int32_t  ret;
	uint16_t size, sentsize;
	uint8_t  destip[4];
	uint16_t destport;

	switch(getSn_SR(sn))
	{
		case SOCK_UDP :
			if((size = getSn_RX_RSR(sn)) > 0)
			{
				LED_BLUE_TOGGLE();
				if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
				ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
				if(ret <= 0)
				{
					return ret;
				}

				printf("size:%dBytes : ", ret);
				for (int i = 0; i < ret; i++)
				{
					printf ("%02x ", buf[i]);
				}
				printf("\n");

				size = (uint16_t) ret;
				sentsize = 0;
				while(sentsize != size)
				{
					ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
					if(ret < 0)
					{
						return ret;
					}
					sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
				}
			}
		break;

		case SOCK_CLOSED:
			if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)
				return ret;
        break;

		default :
        break;
   }

   return 1;
}

위 이미지는 PC와 직접 연결했을때 패킷 캡춰한 것 입니다.
PC의 IP는 192.168.2.1이고, 보드 IP는 192.168.2.101 입니다.
테스트 프로그램은 Hercules를 사용했습니다.
Time 항목을 보시면 짧게는 100m에서 길게는 4초 정도 지연이 있습니다.

검토 부탁드리겠습니다.
테스트한 eclipse 소스파일 링크 남김니다. (업로드가 안되네요…)
감사합니다.

http://naver.me/xaJQ9Vrb

양해를 먼저 드립니다.
저희는 회사 정책상 코드리뷰는 진행하지 않는다는점 참고부탁드립니다.

보내주신 코드에서 main.c를 봤을때 gw. 즉 gateway주소를 192.168.2.1으로 사용하시고, PC의 ip도 192.168.2.1로 사용하시네요.
PC의 IP를 192.168.2.10 과 같이 gateway 주소를 제외한 값으로 변경해서 테스트 부탁드립니다.

사용하시는 printf문 때문은 아닌것 같습니다.

검토 감사드립니다. 초기화 문제였던 것 같습니다.
이더넷 초기화에 PHY_Init(GPIOB, GPIO_Pin_15, GPIO_Pin_14); 를 추가하니 해결됐습니다.
문제가 생기는 이유가 궁금하네요. W7500P의 Erratum 2와 관련 있을까요?
소스는 테스트에 필요하실 것 같아 첨부했었습니다.
감사합니다.