본문 바로가기

WCH/CH32V20x

CH32V208 SSM - Ethernet 테스트 (TCP 전송속도 , Iperf Throughput 측정 테스트)

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 까지 측정된다.

 

반응형