【沁恒 CH32V208 开发板免费试用】+TCP测试
上一篇测评报告为硬件SPI驱动LCD屏幕,本片主要测评网口功能,主要测试了TCPclient,网口助手作为server,通过发送不同格式的命令,控制开发板。
主控还是CH32V208开发板,下载仿真用WCH-LINK-R1就不多介绍了。
LCD模块采用4线制SPI通讯方式,驱动IC为ILI9341,分辨率为240*320。
本次实验引脚对应为:
以下是实物连接图
接线方式参考实验引脚对应部分
主要移植了SPI,LCD,GUI等驱动
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
/*********************************************************************
* @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;
}
}
}
此次硬件网口测试结束,主要测试了网口和屏幕的联动,下次上位机和下位机进行联调,测试其他硬件功能。
头次试用,大家多多谅解。
更多回帖