【沁恒 CH32V208 开发板免费试用】+TCP测试
上一篇测评报告为硬件SPI驱动LCD屏幕,本片主要测评网口功能,主要测试了TCPclient,网口助手作为server,通过发送不同格式的命令,控制开发板。
- 硬件资源介绍
主控还是CH32V208开发板,下载仿真用WCH-LINK-R1就不多介绍了。
LCD模块采用4线制SPI通讯方式,驱动IC为ILI9341,分辨率为240*320。
本次实验引脚对应为:
- 驱动部分
以下是实物连接图
接线方式参考实验引脚对应部分
- 项目结构:
主要移植了SPI,LCD,GUI等驱动
- SPI驱动和LCD驱动上一次报告中有讲解:
https://bbs.elecfans.com/jishu_2352676_1_1.html
本次实验过程中,由于主频到120M移植过来的SPI的分配系数未变动,存在问题,将SPI.C驱动中分频系数改成以下即可。
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
- 项目实验:
3.1 Main函数中,主要还是做了硬件初始化工作,TCP客户端创建连接服务器。通过板载TCP中断来处理网口数据。main
int main(void)
{
u8 i;
u8 setbuf[10];
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n",SystemCoreClock);
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);
printf("mac addr:");
for ( i = 0; i < 6; i++)
printf("%x ", MACAddr[i]);
printf("\n");
TIM2_Init();
i = ETH_LibInit(IPAddr, GWIPAddr, IPMask, MACAddr);
mStopIfError(i);
if (i == WCHNET_ERR_SUCCESS)
printf("WCHNET_LibInit Success\r\n");
#if KEEPALIVE_ENABLE
{
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();
while(1)
{
WCHNET_MainTask();
if(WCHNET_QueryGlobalInt())
{
WCHNET_HandleGlobalInt();
}
}
}
3.2 我们需要主要看下DataLoopback,在这个函数中,我们做了接收数据和处理任务。
void WCHNET_DataLoopback(u8 id)
{
#if 0
u8 i;
u32 len;
u32 endAddr = SocketInf[id].RecvStartPoint + SocketInf[id].RecvBufLen;
if ((SocketInf[id].RecvReadPoint + SocketInf[id].RecvRemLen) > endAddr) {
len = endAddr - SocketInf[id].RecvReadPoint;
}
else {
len = SocketInf[id].RecvRemLen;
}
i = WCHNET_SocketSend(id, (u8 *) SocketInf[id].RecvReadPoint, &len);
if (i == WCHNET_ERR_SUCCESS) {
WCHNET_SocketRecv(id, NULL, &len);
}
#else
u32 len, totallen;
u8 *p = MyBuf;
len = WCHNET_SocketRecvLen(id, NULL);
totallen = len;
comm2023(MyBuf,len);
#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)
{
splid(str);
switch(str[2])
{
case '0':
flow = atof(dat[2]);
setting = atof(dat[3]);
one_mass = atof(dat[4]);
sprintf(setbuf,"%d",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;
}
}
}
- 结束
此次硬件网口测试结束,主要测试了网口和屏幕的联动,下次上位机和下位机进行联调,测试其他硬件功能。
- 附源码
*附件:mz_20230509_TcpClient.zip