본문 바로가기

[ST_MICRO]/STM32F103-SM

[STM32-48 SSM] Arduino IDE에서 W5500 iperf 전송률 테스트

 

STM32F103 Aruino TCP 예제를 이용하여 iperf로 W5500의 네트웍 전송율 테스트를 해 보자

 

#include <SPI.h>
#include <Ethernet2.h>
#define USE_THIS_SS_PIN                     PB0

byte mac[] = {
  0x00, 0x08, 0xDC, 0x00, 0x00, 0x00
};


EthernetServer server(5001);

void setup() {
  Serial.begin(115200);

  Serial.print("Iperf server address : ");
  Ethernet.w5500_cspin = USE_THIS_SS_PIN;
  
  // initialize the ethernet device
  Ethernet.begin(mac);
  
  // start listening for clients
  server.begin();
  Serial.println(Ethernet.localIP());
  Serial.println(" ");
}

void loop() {
  byte buf[2048];
  unsigned int len = 0;
  
  // wait for a new client:
  EthernetClient client = server.available();

  // when the client sends the first byte, say hello:
    if (client) {
    Serial.println("Here is new client for check arduino performance");
  while (client.connected())
    {
      len = client.available();
      if (len)
      {
       client.read(buf, 2048);
      }
   }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

 

STM32F103 에서 Arduino코드로 W5500의 TCP 전송 속도는 1.4Mbps 정도로 측정된다.
iperf -c 192.168.1.48 -w 300k -t 100 -i 10

 

느려도 너무 드리다. Arduino 에서 다양한 라이브러리를 사용하면 쉽고 간단하게 이더넷 기능들을 구현할수 있지만 이더넷 전송 속도가 느리다면 문제가 될 수 있다.

 


Ethernet2 라이브러리 코드를 수정해서 STM32F103용으로도 만들어 보았다.

 

W5500 Arduino 라이브러리 Ethernet2 의 w5500.cpp에서 read, write 함수를 보니 SPI 통신을 한바이트씩 수행하고 있다.

STM32F405 - Arduino에서 W5500 iperf 네트웍 전송율 테스트 참고

uint16_t W5500Class::write(uint16_t _addr, uint8_t _cb, const uint8_t *_buf, uint16_t _len)
{
    SPI.beginTransaction(wiznet_SPI_settings);
    setSS();
    SPI.transfer(_addr >> 8);
    SPI.transfer(_addr & 0xFF);
    SPI.transfer(_cb);
	
    for (uint16_t i=0; i<_len; i++){
        SPI.transfer(_buf[i]);
    }
    resetSS();
    SPI.endTransaction();

    return _len;
}

uint16_t W5500Class::read(uint16_t _addr, uint8_t _cb, uint8_t *_buf, uint16_t _len)
{ 
    SPI.beginTransaction(wiznet_SPI_settings);
    setSS();
    SPI.transfer(_addr >> 8);
    SPI.transfer(_addr & 0xFF);
    SPI.transfer(_cb);
	
    for (uint16_t i=0; i<_len; i++){
        _buf[i] = SPI.transfer(0);
    }
	
    resetSS();
    SPI.endTransaction();

    return _len;
}

 

 

DMA를 사용하지 않고 iperf TCP 전송율을 테스트 해 보면 3.5Mbps 정도로 측정이 된다.

 


DMA를 사용하도록 수정하고 iperf TCP 전송율을 측정해 보면  8.5Mbps까지 측정이 되지만 STM32CubeIDE에서 테스트 했던 STM32F103 Iperf로 W5500의 TCP Throughput 측정 테스트 결과와 비교하면 아무래도 속도가 느리다.

 

 

반응형