본문 바로가기

RaspberryPi/RP2350

[RP2350_W6100] Arduino IDE에서 Iperf TCP Throughput 측정 테스트 (Ethernet_Generic 라이브러리 수정)

 

W6100을 이용하여 제작한 보드의 네트웍 전송속도를 테스트 해보자
[RP2040_W5500]  보드에서 테스트한 Iperf TCP Throughput 측정 테스트를 참고 하여 Arsuino의 기본 예제를 이용하여 전송률을 테스트 해보자.


4Mbps 정도로 측정이 된다. 역시 W5500의 수준으로 느리다.

 

 

전송율을 높이려면 SPI전송 방식을 BUF 형태로 전송해야 한다.

#define SPI_HAS_TRANSFER_BUF      true

 

 

전송 부분에서 SPI 전송을 퍼버 형태로 보내게 된다.

#ifdef SPI_HAS_TRANSFER_BUF
      pCUR_SPI->transfer((uint8_t*)buf, NULL, len);
#else
      // TODO: copy 8 bytes at a time to cmd[] and block transfer
      for (uint16_t i = 0; i < len; i++)
      {
        pCUR_SPI->transfer(buf[i]);
      }
#endif

 

 

버퍼 수정후 전송률을 측정해 보면 8Mbps정도로 측정이 된다. 아직 느리다.

 

 


RP2350의 SPI DMA 방식으로 수정해 보자 

전송율을 높이려면 Ethernet_Generic 라이브러리의 w5100_Impl.h 파일에서  write(), read() 함수를  수정하여 DMA로 전송하도록 수정해야 한다.

 

https://nexp.tistory.com/4118

 

[RP2350_ W6100] Arduino IDE에서 SPI DMA 사용하기

RP2350의 최대 SPI클럭은 시스템 클럭의 1/2 인 75Mhz 이다. 75Mhz로 동작하는 SPI슬레이브는 잘 없을것 같고 1/4 인 37.5Mhz가 적당할것 같다.Arduino IDE 개발환에서 RP2350의 SPI 전송률 테스트 하면 데이터 전

nexp.tistory.com

 

 

를 참고로 해서

\Documents\Arduino\libraries\Ethernet_Generic\src\utility\w5100_Impl.h 파일을 수정하면 된다.

 

 

DMA를 사용하기 위해 define으로 정의하고 DMA 사용여부를 설정 할수 있도록 했다.

#define ETHERNET_USE_RPIPICO_DMA  true

 

 

라이브러리 초기화 함수 init()에 DMA초기화 를 추가 한다.

uint8_t W5100Class::init(uint8_t socketNumbers, uint8_t new_ss_pin)
{
  (void) socketNumbers;

  uint8_t i;

  if (initialized)
    return 1;

  delay(560);

  CH_SIZE = 0x0100; // Default except W6100

  pCUR_SPI->begin();

  initSS();
  resetSS();


#ifdef ETHERNET_USE_RPIPICO_DMA
	initDMA();
#endif

 

 

wtire 함수를 DMA가 가능하도록 수정한다.

uint16_t W5100Class::write(uint16_t addr, const uint8_t *buf, uint16_t len)
{
  uint8_t cmd[8];

	:
  ////////////////////////////////////////

#if USING_W6100

  else if (chip == w6100)
  {
    // chip == w6100
    setSS();

	:

    if (len <= 5)
    {
      for (uint8_t i = 0; i < len; i++)
      {
        cmd[i + 3] = buf[i];
      }

      pCUR_SPI->transfer(cmd, len + 3);
    }
    else
    {
      pCUR_SPI->transfer(cmd, 3);

#ifdef SPI_HAS_TRANSFER_BUF
	#ifdef ETHERNET_USE_RPIPICO_DMA
	spi_write_dma((uint8_t*)buf, len);
	#else
      pCUR_SPI->transfer(buf, NULL, len);
    #endif
#else

      // TODO: copy 8 bytes at a time to cmd[] and block transfer
      for (uint16_t i = 0; i < len; i++)
      {
        pCUR_SPI->transfer(buf[i]);
      }

#endif
    }

    resetSS();
  }

#endif    // W6100

 

 

 

read 함수도 DMA가 되도록 수정한다.

uint16_t W5100Class::read(uint16_t addr, uint8_t *buf, uint16_t len)
{
  uint8_t cmd[4];
   :

#if USING_W6100

  else if (chip == w6100)
  {
    // chip == w6100
    setSS();

	:
	#ifdef ETHERNET_USE_RPIPICO_DMA
	pCUR_SPI->transfer(cmd, 3);
	memset(buf, 0, len);
	spi_read_dma(buf, len);
	#else
    pCUR_SPI->transfer(cmd, 3);
    memset(buf, 0, len);
    pCUR_SPI->transfer(buf, len);
    #endif
	
    resetSS();
  }

#endif    // USING_W6100

 

 

SPI DMA 방식으로 변경후 15Mbps로 빨라 졌다. RP2040 수준으로 빨려 졌는데 더 빨라야 할것 같은데...

 

 

버퍼 사이즈를 수정해보자.

//#define MAX_BUF_SIZE      2048
#define MAX_BUF_SIZE        1024

byte buf[MAX_BUF_SIZE];

 

 

SPI DMA로 코드 수정 최종 테스트 결과 RP2350으로 W6100의 Iperf TCP Throughput 측정 테스트 전송률은 18Mbps로 빨라 지는것을 확인 할 수 있다.

 

 

 

Arduino 코드에서 이정도의 TCP 전송률이면 이더넷 관련 많은 다양한 예제들을 쉽게 해결할 수 있을것 같다.

반응형