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로 했다.
SPI클럭을 33Mhz로 설정하면 4.5Mbps정도로 측정이 된다.
속도가 너무 느리다.
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가 지원 되도록 수정 했다.
#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 전송률 테스트 부터 진행 해 보자.