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 테스트를 해보자.