
CH32V208은 저렴(1$대) 하고 작은 사이즈()에 USB, Ethernet (PHY 포함), BLE 가 포함된 MCU로 전천후로 여러 프로젝트에 적용하면 좋은 MCU이다.
이번에는 이더넷 기능을 테스트 해보자.
비로 10Base 이더넷 이지만 Ethernet Phy 칩 까지 포함되어 하드웨어 적으로 아주 간단하게 이더넷을 구현할 수 있다. 사실 Ethernet Phy 칩보다 저렴하니 사용하지 않을 이유가 없다.
CH32V208 SSM에서 이더넷은 Ethernet 커넥터 모듈에 연결해서 테스트 할 수 있고 이더넷 관련 신호서는 PC6~PC7에 연결되어 있다.



CH32V208의 이더넷도 기존에 테스트 했던 CH32V307 이더넷 테스트 예제와 구조가 동일하기 때문에 코드를 동일하게 사용할 수 있다.
우선 TCP Server 루프백 테스트를 해 보자
void WCHNET_DataLoopback(u8 id)
{
u8 i;
u32 len;
u32 endAddr = SocketInf[id].RecvStartPoint + SocketInf[id].RecvBufLen; //Receive buffer end address
if ((SocketInf[id].RecvReadPoint + SocketInf[id].RecvRemLen) > endAddr) { //Calculate the length of the received data
len = endAddr - SocketInf[id].RecvReadPoint;
}
else {
len = SocketInf[id].RecvRemLen;
}
WCHNET_SocketRecv(id, NULL, &len);
i = WCHNET_SocketSend(id, (u8 *) SocketInf[id].RecvReadPoint, &len); //send data
if (i == WCHNET_ERR_SUCCESS) {
WCHNET_SocketRecv(id, NULL, &len); //Clear sent data
}
}
CH32V208 TCP Loopback 테스트 예제 코드
int main(void)
{
u8 i;
Delay_Init();
USART_Printf_Init(115200); //USART initialize
printf("TCPServer Test\r\n");
if((SystemCoreClock == 60000000) || (SystemCoreClock == 120000000))
printf("SystemClk:%d\r\n", SystemCoreClock);
else
printf("Error: Please choose 60MHz and 120MHz clock when using Ethernet!\r\n");
printf("net version:%x\n", WCHNET_GetVer());
if (WCHNET_LIB_VER != WCHNET_GetVer()) {
printf("version error.\n");
}
WCHNET_GetMacAddr(MACAddr); //get the chip MAC address
printf("mac addr:");
for(i = 0; i < 6; i++)
printf("%x ",MACAddr[i]);
printf("\n");
TIM2_Init();
i = ETH_LibInit(IPAddr, GWIPAddr, IPMask, MACAddr); //Ethernet library initialize
mStopIfError(i);
if (i == WCHNET_ERR_SUCCESS)
printf("WCHNET_LibInit Success\r\n");
#if KEEPALIVE_ENABLE //Configure keep alive parameters
{
struct _KEEP_CFG cfg;
cfg.KLIdle = 20000;
cfg.KLIntvl = 15000;
cfg.KLCount = 9;
WCHNET_ConfigKeepLive(&cfg);
}
#endif
memset(socket, 0xff, WCHNET_MAX_SOCKET_NUM);
WCHNET_CreateTcpSocketListen(); //Create TCP Socket for Listening
while(1)
{
/*Ethernet library main task function,
* which needs to be called cyclically*/
WCHNET_MainTask();
/*Query the Ethernet global interrupt,
* if there is an interrupt, call the global interrupt handler*/
if(WCHNET_QueryGlobalInt())
{
WCHNET_HandleGlobalInt();
}
}
}
CH32v208 TCP 전송률 테스트 결과 양뱡향 6.5Mbps 로 측정된다.

CPU 옵티마이즈 해 보면
7.2Mbps로 좀더 빨라진다.

iperf로도 테스트 해보자.
최대 전송률인 10Mbps 까지 측정된다.

반응형