본문 바로가기

[ST_MICRO]/STM32H7

[STM32H7-RP]W5300 Iperf로 TCP Throughput 측정 테스트

 

STM32H7 RP 보드는 확장 테스트 모듈에 W5300 을 연결 할 수 있다.

W5300을 이용하여 80Mbps 이상의 네트웍 성능를 사용할 수 있어 네트웍 고속의 데이터 전송에 적용해 볼 수 있다. 

 

 

STM32H7 RP 보드에서 NE2(PG9) 핀이 W5300의 CS 핀에 할당되어 있다.

 

W5300 모듈 핀맵

 


STM32CubeIDE 를 이용하여 STM32H7의 FMC 설정을 해 준다. CS핀은 NE2에 할당하면 된다.

 

 

 

CS핀 할당을 NE2에 했기 때문에 W5300메모리 제어 설정을 STM32H7의 FMC 메모리 블럭중 0x64000000 에 할당하면 된다.

#define W5300_BANK_ADDR                 ((uint32_t)0x64000000)

#define _W5300_DATA(p)                  (*(volatile uint16_t*) (W5300_BANK_ADDR + (p<<1)))

 

 

먼저 W5300의 루프백 테스트 코드를 이용하여 전송률을 측정해 보자

int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
   int32_t ret;
   uint16_t size = 0, sentsize=0;

#ifdef _LOOPBACK_DEBUG_
   uint8_t destip[4];
   uint16_t destport;
#endif

   switch(getSn_SR(sn))
   {
      case SOCK_ESTABLISHED :
         if(getSn_IR(sn) & Sn_IR_CON)
         {
#ifdef _LOOPBACK_DEBUG_
			getSn_DIPR(sn, destip);
			destport = getSn_DPORT(sn);

			printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
			setSn_IR(sn,Sn_IR_CON);
         }



		 if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur.
         {
			if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;

			ret = recv(sn, buf, size);

			if(ret <= 0) return ret;      // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.

			size = (uint16_t) ret;
			sentsize = 0;

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

         break;
      case SOCK_CLOSE_WAIT :
#ifdef _LOOPBACK_DEBUG_
         printf("%d:CloseWait\r\n",sn);
#endif
         if((ret = disconnect(sn)) != SOCK_OK) return ret;
#ifdef _LOOPBACK_DEBUG_
         printf("%d:Socket Closed\r\n", sn);
#endif
         break;
      case SOCK_INIT :
#ifdef _LOOPBACK_DEBUG_
    	 printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port);
#endif
         if( (ret = listen(sn)) != SOCK_OK) return ret;
         break;
      case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
         printf("%d:TCP server loopback start\r\n",sn);
#endif
         if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
#ifdef _LOOPBACK_DEBUG_
         printf("%d:Socket opened\r\n",sn);
#endif
         break;
      default:
         break;
   }
   return 1;
}

 

STM32H7 EV 보드에서 W5300 iperf TCP 전송률 테스트 설정을 이용하여 최대 전송률을 적용해 보면 Wizent Ax 프로그램에서 루프백 전송률이 85Mbps 정도로 측정이 된다.

 

 

 

iperf로 TCP 전송률 테스트를 해보면 95Mbps로 거의 100M 네트워크 환경의 최대치를 사용하고 있다.

 

반응형