본문 바로가기

RaspberryPi/RP2040

Raspberry Pi Pico RP2040 - Arduino IDE에서 Iperf로 W5500의 TCP Throughput 측정 테스트

 

Raspberry Pi Pico 확장 테스트 보드를 이용하여 W5500 모듈의 TCP IP전송률 테스트를 iperf로 진행 해 보자.

확장 테스트보드의 SSM Type EVM 연결 커넥터에 W5500 CS핀이 GP12에 할당 되어 있다.

 

 

Arduino 에서 iperf 를 이용하여 한  네트웍 전송율 테스트를 하기 위해  TCP  Server를 구현 하면 된다.

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

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

EthernetServer server(5001);

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  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();

    if (client) {
  	while (client.connected())
    {
      len = client.available();
      if (len)
      {
       client.read(buf, 2048);
      }
   }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

 

 

RP2040에서 Arduino코드로 W5500의 TCP 전송 속도는 4.5Mbps 정도로 측정된다. SPI 클럭 속도는 16Mhz로 했다.

SPISettings wiznet_SPI_settings(16000000, MSBFIRST, SPI_MODE0);

 

SPI클럭을 33Mhz로 설정하면 4.5Mbps정도로 측정이 된다.

SPISettings wiznet_SPI_settings(33000000, MSBFIRST, SPI_MODE0);

 

속도가 너무 느리다.

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;
}

 


RP2040 Arduino IDE에서 SPI DMA 사용 예제를 이용하여 Ethernet2 라이브러리의 w5500.cpp 를 다양한 MCU들의 SPI DMA가 지원 되도록 수정 했다.

\Arduino\libraries\Ethernet2\src\utility\w5500.cpp
#if _USE_RP2040_SPI_DMA
    #include "w5500_rp2040_dma.hpp"
#elif _USE_STM32_SPI_DMA
    #include "w5500_stm32_dma.hpp"
#elif _USE_ESP32_SPI
    #include "w5500_esp32.hpp"
#else
    #include "w5500.hpp"
#endif

 

RP2040 SPI DMA 모드로 수정하면 13Mbps 정도로 측정이 된다.

 

다른 MCU들의 33Mhz SPI 클럭에서 W5500의 TCP 전송율 테스트 결과와 비교해보면 약간 아쉬움이 있는데...

개발 환경이 Aruino 라 그런가?

우선 RP2040 C++ SDK에서 W5500 전송률 테스트 부터 진행 해 보자.

반응형