【沁恒 CH32V208 开发板免费试用】TCP测试 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

574246365 关注 私信
[文章]

【沁恒 CH32V208 开发板免费试用】TCP测试

【沁恒 CH32V208 开发板免费试用】+TCP测试

上一篇测评报告为硬件SPI驱动LCD屏幕,本片主要测评网口功能,主要测试了TCPclient,网口助手作为server,通过发送不同格式的命令,控制开发板。

  1. 硬件资源介绍

主控还是CH32V208开发板,下载仿真用WCH-LINK-R1就不多介绍了。

LCD模块采用4线制SPI通讯方式,驱动IC为ILI9341,分辨率为240*320。

1683566187876o16sor15ji1683566188822sla4eceo36

本次实验引脚对应为:

1683566189356nmhs6albb0

  1. 驱动部分

以下是实物连接图

1683566189906azz6a3hpkh

接线方式参考实验引脚对应部分

  1. 项目结构:

1683566191133clh4ohuv86

主要移植了SPI,LCD,GUI等驱动

  1. SPI驱动和LCD驱动上一次报告中有讲解:

https://bbs.elecfans.com/jishu_2352676_1_1.html

本次实验过程中,由于主频到120M移植过来的SPI的分配系数未变动,存在问题,将SPI.C驱动中分频系数改成以下即可。

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;

  1. 项目实验:

3.1 Main函数中,主要还是做了硬件初始化工作,TCP客户端创建连接服务器。通过板载TCP中断来处理网口数据。main

/*********************************************************************
 * @fn      main
 *
 * [url=home.php?mod=space&uid=2666770]@Brief[/url]   Main program
 *
 * [url=home.php?mod=space&uid=1141835]@Return[/url]  none
 */
int main(void)
{
    u8 i;
    u8 setbuf[10];
    Delay_Init();
    USART_Printf_Init(115200);                                   //USART initialize
    printf("SystemClk:%d\r\n",SystemCoreClock);
    LCD_Init();//LCD INIT
    LCD_LED_SET;
    Delay_Ms(1500);
    LCD_LED_CLR;

    DrawTestPage("CH32V208_LCD_DEMO");
   Gui_StrCenter(0,30,GREEN,BLUE,"sxxy",16,1);//居中显示
   Gui_StrCenter(0,60,RED,BLUE,"CH32_testpro",16,1);//居中显示
   Gui_StrCenter(0,90,GREEN,BLUE,"2.8\" ILI9341 240X320",16,1);//居中显示


    printf("TcpClient Test\r\n");
    printf("SystemClk:%d\r\n", SystemCoreClock);
    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);
    for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++)
        WCHNET_CreateTcpSocket();                                //Create TCP Socket

    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();
        }
    }
}

3.2 我们需要主要看下DataLoopback,在这个函数中,我们做了接收数据和处理任务。

void WCHNET_DataLoopback(u8 id)

{

#if 0   //此处我们从1变成0.通过else中进行数据接收。

    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;

    }

    i = WCHNET_SocketSend(id, (u8 *) SocketInf[id].RecvReadPoint, &len);         //send data

    if (i == WCHNET_ERR_SUCCESS) {

        WCHNET_SocketRecv(id, NULL, &len);                                       //Clear sent data

    }

#else

    u32 len, totallen;

    u8 *p = MyBuf;

 

    len = WCHNET_SocketRecvLen(id, NULL);                //query length     WCHNET_SocketRecv(id, MyBuf, &len);                  //Read the data of the receive buffer into MyBuf

    totallen = len;

    comm2023(MyBuf,len);//这里我们做了简化,方便快速开发调试,省略了校验数据步骤。

//    while(1){

//        len = totallen;

//        WCHNET_SocketSend(id, p, &len);                                  //Send the data

//        totallen -= len;                                                 //Subtract the sent length from the total length

//        p += len;                                                        //offset buffer pointer

//        if(totallen) continue;                                           //If the data is not sent, continue to send

//        break;                                                           //After sending, exit

//    }

#endif

}

3.3 我们主要做了协议解析和执行命令任务,修改参数和启动停止控制。

char dat[100][20];

int splid(char *str)//根据不同字符进行分包,这里自己手搓了一个函数。。。

{

    int len=strlen(str);

    int i,j=0,k=0;

    for(i=0;i<len;i++)

    {

        if(str[i]!=0x2C)

        {

            dat[j][i-k]=str[i];

        }

        else

        {

            dat[j][i-k]=0;

            j++;

            k=i+1;

            if(j>=100)

                return 0;

        }

    }

    dat[j][i-k]=0;

    return j;

}

void start_com(void)

{

    Gui_StrCenter(0,210,RED,BLUE,"start_door",16,1);//居中显示

}

void stop_com(void)

{

 

    Gui_StrCenter(0,210,RED,BLUE,"stop_door",16,1);//居中显示

}

 

int flow;

int setting;

int one_mass;

 

void comm2023(u8* str,u32 len)

{

    int i;

    uint32_t checksum;

    char setbuf[16];

    if(str[0] == '#' && len > 5)

    {

//        for(i=0;i<len-5;i++)//本来要进行校验和省略了,上位机没顾上测,就先用网口助手进行调试。

//        {

//            checksum+=str[i];

//        }

//        checksum%=100;

        splid(str);//数据个数

 

        switch(str[2])

        {

        case '0':

            flow = atof(dat[2]);

            setting = atof(dat[3]);

            one_mass = atof(dat[4]);

 

            sprintf(setbuf,"%d",flow);// 目前这里还存在BUG,待修复,sprintf(setbuf,"%.2f",flow) 解析有问题。。。

 

            Gui_StrCenter(0,120,BLUE,BLUE,setbuf,16,1);//居中显示   

            sprintf(setbuf,"%d",one_mass);

            Gui_StrCenter(0,150,BLUE,BLUE,setbuf,16,1);//居中显示

 

            sprintf(setbuf,"%d",setting);

            Gui_StrCenter(0,180,BLUE,BLUE,setbuf,16,1);//居中显示

            break;

        case '1':

            start_com();//启动阀门命令

            break;

        case '2':

            stop_com();//停止阀门命令

            break;

 

        }

    }

}
  1. 结束

此次硬件网口测试结束,主要测试了网口和屏幕的联动,下次上位机和下位机进行联调,测试其他硬件功能。

  1. 附源码
    *附件:mz_20230509_TcpClient.zip

b9caaeebc049dbacaaf828a266c49083

回帖(1)

574246365

2023-5-9 22:41:29
不好意思,视频可能不清楚,附录代码有注释。头次试用,大家多多谅解。

更多回帖

×
发帖