본문 바로가기

WCH/CH32V307

CH32V307 SM - Arduino에서 W5500을 이용한 iperf Throughput 측정 테스트

 

 

CH32V307 Arduino 개발환경 에서 W5500 테스트하려고 기존 코드를 컴파일 하려니 에러가 발생한다.

In file included from c:\Users\nexp7\OneDrive\����\Arduino\libraries\Ethernet2\src/Ethernet2.h:16,
                 from D:\WORK\Arduino\CH32\w5500_iperf\w5500_iperf.ino:22:
c:\Users\nexp7\OneDrive\����\Arduino\libraries\Ethernet2\src/EthernetClient.h:5:10: fatal error: Client.h: No such file or directory
 #include "Client.h"

 

 

STM32용 코드중에서 Client.h, TCP.h, UDP.h 파일을 \AppData\Local\Arduino15\packages\WCH\hardware\ch32v\1.0.3\cores\arduino 폴더에 복사 해 넣으니 컴파일 된다.

 

 

W5500의 CS 핀이 PB3에 할당되어 있는데… 디폴트 코드에서는 할당되어 있지 않다

 

먼저 핀수를 수정해 주고

\AppData\Local\Arduino15\packages\WCH\hardware\ch32v\1.0.3\variants\CH32V30x\CH32V307VCT6\variant_CH32V307VCT6.h

 

#define NUM_DIGITAL_PINS        24

 

원하는 포트를 추가 해 준다.

\AppData\Local\Arduino15\packages\WCH\hardware\ch32v\1.0.3\variants\CH32V30x\CH32V307VCT6\variant_CH32V307VCT6.cpp

 

// Digital PinName array
const PinName digitalPin[] = {
  PA_0,  //D0/A0
  PA_1,  //D1/A1
  PA_2,  //D2/A2
  PA_3,  //D3/A3
  PA_4,  //D4/A4    SPI1_NSS
  PA_5,  //D5/A5    SPI1_SCK

  PA_10,  //D6      USART1_RX
  PA_9,   //D7      USART1_TX
  PA_8,   //D8   
  PA_7,   //D9      SPI_MOSI    TIM8_CH1N  TIM3_CH2  
  PA_6,   //D10     SPI1_MISO  
  PB_5,   //D11                 TIM3_CH2_2 TIM10_CH3_1  
  PB_8,   //D12                 TIM4_CH3 TIM10_CH1 TIM8_CH3_1
  PB_9,   //D13                  
  PB_1,   //D14                 TIM3_CH4 TIM8_CH3N TIM1_CH3N_1    TIM3_CH4_2 TIM9_CH2N_1 
  PB_0,   //D15                 TIM3_CH3 TIM8_CH2N TIM1_CH2N_1    TIM3_CH3_2 TIM9_CH1N_1 
  PB_12,  //D16    SPI2_NSS
  PB_15,  //D17    SPI2_MOSI
  PB_14,  //D18    SPI2_MISO 
  PB_13,  //D19    SPI2_SCK 
  PB_11,  //D20    I2C2_SDA
  PB_10,   //D21    I2C2_SCL
  PB_3,
  PB_4
};

 

 

이렇게 해서 루프백 코드 구동하면 3Mpbs 정도로 측정이 된다. 역시 느리네…

 

 

 

좀더 속도를 높이기 위해 버퍼 형태로 SPI 데이터를 보내도록 수정해 보자

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);
	
	//SPI.transfer((uint8_t*)_buf, _len);
	
	
    for (uint16_t i=0; i<_len; i++){
        SPI.transfer(_buf[i]);
    }
	
    resetSS();
    SPI.endTransaction();

    return _len;
	*/
    SPI.beginTransaction(wiznet_SPI_settings);
    setSS();	
	uint8_t spi_data[4];
	
	spi_data[0] = (_addr & 0x0000FF00) >> 8;
	spi_data[1] = (_addr & 0x000000FF) >> 0;
	spi_data[2] = _cb;	
	
	SPI.transfer(spi_data, 3);
	SPI.transfer((uint8_t *)_buf, _len);
	
    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;*/
	
	uint8_t spi_data[4];
	
    SPI.beginTransaction(wiznet_SPI_settings);
    setSS();	
	spi_data[0] = (_addr & 0x0000FF00) >> 8;
	spi_data[1] = (_addr & 0x000000FF) >> 0;
	spi_data[2] = _cb;	
	
	SPI.transfer(spi_data, 3, SPI_CONTINUE);
	SPI.transfer(_buf, _len, SPI_CONTINUE);
	
	resetSS();
	return _len;
	
}

 

 

6Mbps 정도로 두배 정도 빨라졌다. 하지만 SPI 지연이 많이 되는것 같다.

 

 

속도를 좀더 올리기 위해 SPI DMA를 사용하거나 Arduino에서 제공하는 SPI함수를 사용하지 않고 SPI 직접 제어 코드로 테스트 할 필요가 있다. 그러기 위해서는 우선 MounRiver 환경에서 W5500 테스트를 해보자.

 

 

반응형