/********************************** (C) COPYRIGHT ******************************* * File Name : main.c * Author : WCH * Version : V1.0.0 * Date : 2020/02/19 * Description : Main program body. *******************************************************************************/ #include "delay.h" #include "sys.h" #include "usart.h" #include "string.h" #include "stdio.h" #include "CH392INC.h" #include "CH392.H" #define Query392Interrupt() PAin(0) /***********************************************************************************/ /*CH392_OP_INTERFACE_MODE可以为1-2 1:串口连接方式 2:spi口连接方式 */ #define CH392_OP_INTERFACE_MODE 1 #if (CH392_OP_INTERFACE_MODE == 1) /* SEL = 0, TX = 1*/ #include "CH392UART.C" #elif (CH392_OP_INTERFACE_MODE == 2) /* SEL = 0, TX = 1*/ #include "CH392SPI_HW.C" #else #error "Please Select Correct Communication Interface " #endif /**********************************************************************************/ /* 包含命令文件 */ #include "CH392CMD.C" /* 常用变量定义 */ UINT8 MyBuffer[4096]; /* 数据缓冲区 */ struct _SOCK_INF SockInf; /* 保存Socket信息 */ struct _CH392_SYS CH392Inf; /* 保存CH392信息 */ /* CH392相关定义 */ const UINT8 CH392IPAddr[4] = {192,168,1,10}; /* CH392IP地址 */ const UINT8 CH392GWIPAddr[4] = {192,168,1,1}; /* CH392网关 */ const UINT8 CH392IPMask[4] = {255,255,255,0}; /* CH392子网掩码 */ /* socket 相关定义*/ const UINT8 Socket0DesIP[4] = {192,168,1,100}; /* Socket 0目的IP地址 */ const UINT16 Socket0SourPort = 5000; /* Socket 0源端口 */ const UINT16 Socket0DesPort = 1000; /* Socket 0目的端口 */ /********************************************************************************** * Function Name : mStopIfError * Description : 调试使用,显示错误代码,并停机 * Input : iError * Output : None * Return : None **********************************************************************************/ void mStopIfError(UINT8 iError) { if (iError == CMD_ERR_SUCCESS) return; /* 操作成功 */ printf("Error: %02X\r\n", (UINT16)iError); /* 显示错误 */ while ( 1 ) { delay_ms(200); delay_ms(200); } } /********************************************************************************** * Function Name : InitCH392InfParam * Description : 初始化CH392Inf参数 * Input : None * Output : None * Return : None **********************************************************************************/ void InitCH392InfParam(void) { memset(&CH392Inf,0,sizeof(CH392Inf)); /* 将CH392Inf全部清零*/ memcpy(CH392Inf.IPAddr,CH392IPAddr,sizeof(CH392IPAddr)); /* 将IP地址写入CH392Inf中 */ memcpy(CH392Inf.GWIPAddr,CH392GWIPAddr,sizeof(CH392GWIPAddr)); /* 将网关IP地址写入CH392Inf中 */ memcpy(CH392Inf.MASKAddr,CH392IPMask,sizeof(CH392IPMask)); /* 将子网掩码写入CH392Inf中 */ } /********************************************************************************** * Function Name : InitSocketParam * Description : 初始化socket * Input : None * Output : None * Return : None **********************************************************************************/ void InitSocketParam(void) { memset(&SockInf,0,sizeof(SockInf)); /* 将SockInf[0]全部清零*/ memcpy(SockInf.IPAddr,Socket0DesIP,sizeof(Socket0DesIP)); /* 将目的IP地址写入 */ SockInf.DesPort = Socket0DesPort; /* 目的端口 */ SockInf.SourPort = Socket0SourPort; /* 源端口 */ SockInf.ProtoType = PROTO_TYPE_UDP; /* TCP模式 */ } /********************************************************************************** * Function Name : CH392SocketInitOpen * Description : 配置CH392 socket 参数,初始化并打开socket * Input : None * Output : None * Return : None **********************************************************************************/ void CH392SocketInitOpen(void) { UINT8 i; CH392SetSocketDesIP(0,SockInf.IPAddr); /* 设置socket 0目标IP地址 */ CH392SetSocketProtType(0,SockInf.ProtoType); /* 设置socket 0协议类型 */ CH392SetSocketDesPort(0,SockInf.DesPort); /* 设置socket 0目的端口 */ CH392SetSocketSourPort(0,SockInf.SourPort); /* 设置socket 0源端口 */ i = CH392OpenSocket(0); /* 打开socket 0 */ mStopIfError(i); /* 检查是否成功 */ } /********************************************************************************** * Function Name : CH392SocketInterrupt * Description : CH392 socket 中断,在全局中断中被调用 * Input : sockindex * Output : None * Return : None **********************************************************************************/ void CH392SocketInterrupt(UINT8 sockindex) { UINT8 sock_int_socket; UINT16 len; sock_int_socket = CH392GetSocketInt(sockindex); /* 获取socket 的中断状态 */ if(sock_int_socket & SINT_STAT_SENBUF_FREE) /* 发送缓冲区空闲,可以继续写入要发送的数据 */ { } if(sock_int_socket & SINT_STAT_SEND_OK) /* 发送完成中断 */ { } if(sock_int_socket & SINT_STAT_RECV) /* 接收中断 */ { len = CH392GetRecvLength(sockindex); /* 获取当前缓冲区内数据长度 */ printf("receive len = %d\r\n",len); CH392GetRecvData(sockindex,len,MyBuffer); CH392SendData(sockindex,MyBuffer,len); } if(sock_int_socket & SINT_STAT_CONNECT) /* 连接中断,仅在TCP模式下有效*/ { printf("SINT_STAT_CONNECT\r\n"); } if(sock_int_socket & SINT_STAT_DISCONNECT) /* 断开中断,仅在TCP模式下有效 */ { printf("SINT_STAT_DISCONNECT \r\n"); } if(sock_int_socket & SINT_STAT_TIM_OUT) /* 超时中断,仅在TCP模式下有效 */ { printf("SINT_STAT_TIM_OUT\r\n"); } } /********************************************************************************** * Function Name : CH392GlobalInterrupt * Description : CH392全局中断函数 * Input : None * Output : None * Return : None **********************************************************************************/ void CH392GlobalInterrupt(void) { UINT16 init_status; UINT8 buf[10]; init_status = CH392CMDGetGlobIntStatus_ALL(); if(init_status & GINT_STAT_UNREACH) /* 不可达中断,读取不可达信息 */ { CH392CMDGetUnreachIPPT(buf); } if(init_status & GINT_STAT_IP_CONFLI) /* 产生IP冲突中断,建议重新修改CH392的 IP,并初始化CH392*/ { } if(init_status & GINT_STAT_PHY_CHANGE) /* 产生PHY改变中断*/ { printf("Init status : GINT_STAT_PHY_CHANGE\r\n"); } if(init_status & GINT_STAT_SOCK0) { CH392SocketInterrupt(0); /* 处理socket 0中断*/ } if(init_status & GINT_STAT_SOCK1) { CH392SocketInterrupt(1); /* 处理socket 1中断*/ } if(init_status & GINT_STAT_SOCK2) { CH392SocketInterrupt(2); /* 处理socket 2中断*/ } if(init_status & GINT_STAT_SOCK3) { CH392SocketInterrupt(3); /* 处理socket 3中断*/ } } /********************************************************************************** * Function Name : CH392Init * Description : 配置CH392的IP,GWIP,MAC等参数,并初始化 * Input : None * Output : None * Return : 函数执行结果 **********************************************************************************/ UINT8 CH392Init(void) { UINT8 i; i = CH392CMDCheckExist(0x65); if(i != 0x9a)return CH392_ERR_UNKNOW; /* 测试命令,如果无法通过返回0XFA */ /* 返回0XFA一般为硬件错误或者读写时序不对 */ #if (CH392_OP_INTERFACE_MODE == 5) #ifdef UART_WORK_BAUDRATE CH392CMDSetUartBaudRate(UART_WORK_BAUDRATE); /* 设置波特率 */ delay_ms(10); Set_MCU_BaudRate(); i = xReadCH392Data(); /* 如果设置成功,CH392返回CMD_ERR_SUCCESS */ if(i == CMD_ERR_SUCCESS)printf("Set Success\r\n"); #endif #endif CH392CMDSetIPAddr(CH392Inf.IPAddr); /* 设置CH392的IP地址 */ CH392CMDSetGWIPAddr(CH392Inf.GWIPAddr); /* 设置网关地址 */ CH392CMDSetMASKAddr(CH392Inf.MASKAddr); /* 设置子网掩码,默认为255.255.255.0*/ i = CH392CMDInitCH392(); /* 初始化CH392芯片 */ return i; } /********************************************************************************** * Function Name : Gpio_Init * Description : GPIO初始化函数 * Input : None * Output : None * Return : None **********************************************************************************/ void Gpio_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits( GPIOC, GPIO_Pin_8 ); } /********************************************************************************** * Function Name : main * Description : main主函数 * Input : None * Output : None * Return : None **********************************************************************************/ int main(void) { UINT8 i; delay_init(); uart_init(115200); CH392_Port_Init(); Gpio_Init(); CH392CMDReset(); delay_ms(100); printf("CH392EVT Test Demo\r\n"); i = CH392CMDGetVer(); printf("CH392VER : %2x\r\n",(UINT16)i); InitCH392InfParam(); /* 初始化CH392相关变量 */ i = CH392Init(); /* 初始化CH392芯片 */ mStopIfError(i); while(1) { /* 等待以太网连接成功*/ if(CH392CMDGetPHYStatus() == PHY_DISCONN) /* 查询CH392是否连接 */ { delay_ms(200); /* 未连接则等待200MS后再次查询 */ } else { printf("CH392 Connect Ethernet\r\n"); /* CH392芯片连接到以太网,此时会产生中断 */ break; } } InitSocketParam(); /* 初始化socket相关变量 */ CH392SocketInitOpen(); while(1) { if(Query392Interrupt()==0) CH392GlobalInterrupt(); } }