#include "CH392_PARAM.H" #include "delay.h" #include "string.h" /* 常用变量定义 */ UINT8 MyBuffer[4096]; /* 数据缓冲区 */ struct _SOCK_INF SockInf; /* 保存Socket信息 */ struct _CH392_SYS CH392Inf; /* 保存CH392信息 */ /* CH392相关定义 */ const UINT8 CH392IPAddr[4] = {192, 168, 61, 10}; // CH392IP地址 //192.168.61.1 const UINT8 CH392GWIPAddr[4] = {192, 168, 61, 1}; /* CH392网关 */ const UINT8 CH392IPMask[4] = {255, 255, 255, 0}; /* CH392子网掩码 */ /* socket 相关定义*/ //const UINT8 Socket0DesIP[4] = {255,255,255,255}; /* Socket 0目的IP地址 */ const UINT8 Socket0DesIP[4] = {192, 168, 61, 100}; /* Socket 0目的IP地址 */ const UINT16 Socket0SourPort = 5000; /* Socket 0源端口 */ const UINT16 Socket0DesPort = 10002; /* Socket 0目的端口 */ /********************************************************************************** * 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 : 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 : 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 : 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_TCP ;//PROTO_TYPE_UDP; // TCP模式 //} 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_TCP; /* 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); // 检查是否成功 //} 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); /* 检查是否成功 */ i=CH392TCPListen(0); mStopIfError(i); } /********************************************************************************** * 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中断 } } 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模式下有效 { //TCP 客户端模式的时候,假如TCP CLIENT无法顺利连接服务器端会进入此中断 /*此时可以把Socket源端口号进行自加处理,以新的端口去连接服务器*/ printf("SINT_STAT_TIM_OUT\r\n"); } } /********************************************************************************** * Function Name : CH392SocketInterrupt * Description : CH392 socket 中断,在全局中断中被调用 * Input : sockindex * Output : None * Return : None **********************************************************************************/ /* void CH392SocketInterrupt(UINT8 sockindex) { UINT8 sock_int_socket; UINT16 len; UINT16 i; 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); for(i = 0; i < len; i++) printf("%x ", MyBuffer[i]); } 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"); } } */ void InitNet(void) { delay_ms(1000); UINT8 i = 0; CH392_Port_Init(SPI0); CH392CMDReset(); delay_ms(100); printf("CH392EVT Test Demo\r\n"); i = CH392CMDGetVer(); printf("CH392VER : %2x\r\n", (UINT16)i); InitCH392InfParam(); // 初始化CH392相关变量 i = CH392Init(); 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(); } void NetRouting(void) { if(Query392Interrupt() == 0) CH392GlobalInterrupt(); }