[STM32-64 Ardu] 보드에는 SSM Type의 모듈을 연결 할 수 있는 커넥터가 있고 W5500 Ethernet 모듈을 이용하여 이더넷을 구현할 수 있다. STM32F405에서 W5500의 TCP Throughput 을 측정해 보자.
우선 STM32CubeIDE를 이용하여 SPI 설정을 하자.
네트웍 전송율 테스트를 위해 PC에서는 iperf 프로그램을 사용하고 STM32에서는 W5500 TCP loopback 테스트 코를 조금 수정해 iperf 클라이언트 코드로 작성했다.
int32_t iperf_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret;
uint16_t size = 0, sentsize=0;
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
setSn_IR(sn,Sn_IR_CON);
}
if((size = getSn_RX_RSR(sn)) > 0)
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
#if _USE_DELAY
_delay(_TX_DELAY_TIME);
#endif
ret = recv(sn,buf,size);
if(ret <= 0) return ret;
#if _USE_LOOP_BACK
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.
}
#endif
}
break;
case SOCK_CLOSE_WAIT :
if((ret=disconnect(sn)) != SOCK_OK) return ret;
break;
case SOCK_INIT :
if( (ret = listen(sn)) != SOCK_OK) return ret;
break;
case SOCK_CLOSED:
if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)
cnt = 0;
return ret;
break;
default:
break;
}
return 1;
}
측정결과 2Mbps 정도로 측정이 된다.
SPI클럭속도를 최대한 올리고 옵티마이즈 해보자
6Mbps 정도로 측정이 된다.
W5500의 메모리를 키워보자
//uint8_t memsize[2][8] = { {2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};
uint8_t memsize[2][8] = {{8, 0, 0, 0, 0, 0, 0, 0}, {8, 0, 0, 0, 0, 0, 0, 0}};
STM32F4에서 W5500의 TCP Throughput은 9Mbps 로 측정이 된다.
이게 최선인가?
앞으로 STM32F4의 SPI DMA를 사용해서 속도를 좀더 개선해 보자.
STM32F405 SPI DMA 예제를 수정해서 SPI TX, RX DMA를 추가해서 테스트 해보았다.
27Mbps정도 나온다.
W5500의 FIFO 메모리를 최대로 키우고 SPI DMA를 사용하여 STM32F4에서 W5500 iperf TCP 전송율 테스트 결과 30Mbps로 측정이 된다.
반응형