/********************************** (C) COPYRIGHT ******************************* * File Name : CH392CMD.C * Author : WCH * Version : V1.0 * Date : 2020/02/19 * Description : CH392芯片命令接口文件 *******************************************************************************/ #include "CH392INC.H" #include "ch392cmd.h" #include "CH392SPI_HW.h" #include "delay.h" #include "stddef.h" /******************************************************************************** * Function Name : CH392CMDReset * Description : 复位CH392芯片 * Input : None * Output : None * Return : None *******************************************************************************/ void CH392CMDReset(void) { xWriteCH392Cmd(CMD00_RESET_ALL); xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392CMDSleep * Description : 使CH392进入睡眠状态 * Input : None * Output : None * Return : None *******************************************************************************/ void CH392CMDSleep(void) { xWriteCH392Cmd(CMD00_ENTER_SLEEP); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392CMDSleep * Description : 获取芯片以及固件版本号,1字节,高四位表示芯片版本, 低四位表示固件版本 * Input : None * Output : None * Return : 1字节芯片及固件版本号 *******************************************************************************/ UINT8 CH392CMDGetVer(void) { UINT8 i = 0; xWriteCH392Cmd(CMD01_GET_IC_VER); i = xReadCH392Data(); xCH392CmdEnd(); return i; } /******************************************************************************** * Function Name : CH392CMDCheckExist * Description : 测试命令,用于测试硬件以及接口通讯 * Input : testdata 1字节测试数据 * Output : None * Return : 硬件OK,返回 testdata按位取反 *******************************************************************************/ UINT8 CH392CMDCheckExist(UINT8 testdata) { UINT8 i; xWriteCH392Cmd(CMD11_CHECK_EXIST); xWriteCH392Data(testdata); i = xReadCH392Data(); xCH392CmdEnd(); DEBUG_SHOW_VALUE(i) return i; } /******************************************************************************** * Function Name : CH392CMDSetPHY * Description : 设置PHY,主要设置CH392 PHY为100/10M 或者全双工半双工,CH392默 为自动协商。 * Input : phystat 参考PHY 命令参数/状态 * Output : None * Return : None *******************************************************************************/ void CH392CMDSetPHY(UINT8 phystat) { xWriteCH392Cmd(CMD10_SET_PHY); xWriteCH392Data(phystat); xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392CMDGetPHYStatus * Description : 获取PHY的状态 * Input : None * Output : None * Return : 当前CH392PHY状态,参考PHY参数/状态定义 *******************************************************************************/ UINT8 CH392CMDGetPHYStatus(void) { UINT8 i; xWriteCH392Cmd(CMD01_GET_PHY_STATUS); i = xReadCH392Data(); xCH392CmdEnd(); return i; } /******************************************************************************* * Function Name : CH392CMDGetGlobIntStatus * Description : 获取全局中断状态,收到此命令CH392自动取消中断,0x43及以下版本使用 * Input : None * Output : None * Return : 返回当前的全局中断状态 *******************************************************************************/ UINT8 CH392CMDGetGlobIntStatus(void) { UINT8 init_status; xWriteCH392Cmd(CMD01_GET_GLOB_INT_STATUS); init_status = xReadCH392Data(); xCH392CmdEnd(); DEBUG_SHOW_VALUE(init_status) return init_status; } /******************************************************************************** * Function Name : CH392CMDInitCH392 * Description : 初始化CH392芯片。 * Input : None * Output : None * Return : 返回执行结果 *******************************************************************************/ UINT8 CH392CMDInitCH392(void) { UINT8 i = 0; UINT8 s = 0; xWriteCH392Cmd(CMD0W_INIT_CH392); xCH392CmdEnd(); while(1) { delay_ms(10); /* 延时查询,建议2MS以上*/ DEBUG_SHOW_VALUE(s) s = CH392GetCmdStatus(); /* 不能过于频繁查询*/ if(s !=CH392_ERR_BUSY) break; /* 如果CH392芯片返回忙状态*/ if(i++ > 200) return CH392_ERR_UNKNOW; /* 超时退出,本函数需要500MS以上执行完毕 */ } return s; } /******************************************************************************** * Function Name : CH392CMDSetUartBaudRate * Description : 设置CH392串口波特率,仅在串口模式下有效 * Input : baudrate 串口波特率 * Output : None * Return : None *******************************************************************************/ void CH392CMDSetUartBaudRate(UINT32 baudrate) { xWriteCH392Cmd(CMD31_SET_BAUDRATE); xWriteCH392Data((UINT8)baudrate); xWriteCH392Data((UINT8)((UINT16)baudrate >> 8)); xWriteCH392Data((UINT8)(baudrate >> 16)); xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392GetCmdStatus * Description : 获取命令执行状态,某些命令需要等待命令执行结果 * Input : None * Output : None * Return : 返回上一条命令执行状态 *******************************************************************************/ UINT8 CH392GetCmdStatus(void) { UINT8 i; xWriteCH392Cmd(CMD01_GET_CMD_STATUS); i = xReadCH392Data(); xCH392CmdEnd(); return i; } /******************************************************************************** * Function Name : CH392CMDSetIPAddr * Description : 设置CH392的IP地址 * Input : ipaddr 指IP地址 * Output : None * Return : None *******************************************************************************/ void CH392CMDSetIPAddr(UINT8 *ipaddr) { UINT8 i; xWriteCH392Cmd(CMD40_SET_IP_ADDR); for(i = 0; i < 4;i++)xWriteCH392Data(*ipaddr++); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392CMDSetGWIPAddr * Description : 设置CH392的网关IP地址 * Input : ipaddr 指向网关IP地址 * Output : None * Return : None *******************************************************************************/ void CH392CMDSetGWIPAddr(UINT8 *gwipaddr) { UINT8 i; xWriteCH392Cmd(CMD40_SET_GWIP_ADDR); for(i = 0; i < 4;i++)xWriteCH392Data(*gwipaddr++); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392CMDSetMASKAddr * Description : 设置CH392的子网掩码,默认为255.255.255.0 * Input : maskaddr 指子网掩码地址 * Output : None * Return : None *******************************************************************************/ void CH392CMDSetMASKAddr(UINT8 *maskaddr) { UINT8 i; xWriteCH392Cmd(CMD40_SET_MASK_ADDR); for(i = 0; i < 4;i++)xWriteCH392Data(*maskaddr++); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392CMDSetMACAddr * Description : 设置CH392的MAC地址。 * Input : amcaddr MAC地址指针 * Output : None * Return : None *******************************************************************************/ void CH392CMDSetMACAddr(UINT8 *amcaddr) { UINT8 i; xWriteCH392Cmd(CMD60_SET_MAC_ADDR); for(i = 0; i < 6;i++)xWriteCH392Data(*amcaddr++); xCH392CmdEnd(); delay_ms(100); } /******************************************************************************** * Function Name : CH392CMDGetMACAddr * Description : 获取CH392的MAC地址。 * Input : amcaddr MAC地址指针 * Output : None * Return : None *******************************************************************************/ void CH392CMDGetMACAddr(UINT8 *amcaddr) { UINT8 i; xWriteCH392Cmd(CMD06_GET_MAC_ADDR); for(i = 0; i < 6;i++)*amcaddr++ = xReadCH392Data(); xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392CMDSetMACFilt * Description : 设置MAC过滤。 * Input : filtype 参考 MAC过滤 table0 Hash0 table1 Hash1 * Output : None * Return : None *******************************************************************************/ void CH392CMDSetMACFilt(UINT8 filtype,UINT32 table0,UINT32 table1) { xWriteCH392Cmd(CMD90_SET_MAC_FILT); xWriteCH392Data(filtype); xWriteCH392Data((UINT8)table0); xWriteCH392Data((UINT8)((UINT16)table0 >> 8)); xWriteCH392Data((UINT8)(table0 >> 16)); xWriteCH392Data((UINT8)(table0 >> 24)); xWriteCH392Data((UINT8)table1); xWriteCH392Data((UINT8)((UINT16)table1 >> 8)); xWriteCH392Data((UINT8)(table1 >> 16)); xWriteCH392Data((UINT8)(table1 >> 24)); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392CMDGetUnreachIPPT * Description : 获取不可达信息 (IP,Port,Protocol Type) * Input : list 保存获取到的不可达 第1个字节为不可达代码,请参考 不可达代码(CH392INC.H) 第2个字节为IP包协议类型 第3-4字节为端口号 第4-8字节为IP地址 * Output : None * Return : None *******************************************************************************/ void CH392CMDGetUnreachIPPT(UINT8 *list) { UINT8 i; xWriteCH392Cmd(CMD08_GET_UNREACH_IPPORT); for(i = 0; i < 8; i++) { *list++ = xReadCH392Data(); } xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392CMDGetRemoteIPP * Description : 获取远端的IP和端口地址,一般在TCP Server模式下使用 * Input : sockindex Socket索引 list 保存IP和端口 * Output : None * Return : None *******************************************************************************/ void CH392CMDGetRemoteIPP(UINT8 sockindex,UINT8 *list) { UINT8 i; xWriteCH392Cmd(CMD06_GET_REMOT_IPP_SN); xWriteCH392Data(sockindex); for(i = 0; i < 6; i++) { *list++ = xReadCH392Data(); } xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392SetSocketDesIP * Description : 设置socket n的目的IP地址 * Input : sockindex Socket索引 ipaddr 指向IP地址 * Output : None * Return : None *******************************************************************************/ void CH392SetSocketDesIP(UINT8 sockindex,UINT8 *ipaddr) { xWriteCH392Cmd(CMD50_SET_IP_ADDR_SN); xWriteCH392Data(sockindex); xWriteCH392Data(*ipaddr++); xWriteCH392Data(*ipaddr++); xWriteCH392Data(*ipaddr++); xWriteCH392Data(*ipaddr++); xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392SetSocketProtType * Description : 设置socket 的协议类型 * Input : sockindex Socket索引 prottype 协议类型,请参考 socket协议类型定义(CH392INC.H) * Output : None * Return : None *******************************************************************************/ void CH392SetSocketProtType(UINT8 sockindex,UINT8 prottype) { xWriteCH392Cmd(CMD20_SET_PROTO_TYPE_SN); xWriteCH392Data(sockindex); xWriteCH392Data(prottype); xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392SetSocketDesPort * Description : 设置socket n的协议类型 * Input : sockindex Socket索引 desprot 2字节目的端口 * Output : None * Return : None *******************************************************************************/ void CH392SetSocketDesPort(UINT8 sockindex,UINT16 desprot) { xWriteCH392Cmd(CMD30_SET_DES_PORT_SN); xWriteCH392Data(sockindex); xWriteCH392Data((UINT8)desprot); xWriteCH392Data((UINT8)(desprot >> 8)); xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392SetSocketSourPort * Description : 设置socket n的协议类型 * Input : sockindex Socket索引 desprot 2字节源端口 * Output : None * Return : None *******************************************************************************/ void CH392SetSocketSourPort(UINT8 sockindex,UINT16 surprot) { xWriteCH392Cmd(CMD30_SET_SOUR_PORT_SN); xWriteCH392Data(sockindex); xWriteCH392Data((UINT8)surprot); xWriteCH392Data((UINT8)(surprot>>8)); xCH392CmdEnd(); } /****************************************************************************** * Function Name : CH392SetSocketIPRAWProto * Description : IP模式下,socket IP包协议字段 * Input : sockindex Socket索引 prototype IPRAW模式1字节协议字段 * Output : None * Return : None *******************************************************************************/ void CH392SetSocketIPRAWProto(UINT8 sockindex,UINT8 prototype) { xWriteCH392Cmd(CMD20_SET_IPRAW_PRO_SN); xWriteCH392Data(sockindex); xWriteCH392Data(prototype); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392EnablePing * Description : 开启/关闭 PING * Input : enable : 1 开启PING :0 关闭PING * Output : None * Return : None *******************************************************************************/ void CH392EnablePing(UINT8 enable) { xWriteCH392Cmd(CMD01_PING_ENABLE); xWriteCH392Data(enable); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392SendData * Description : 向发送缓冲区写数据 * Input : sockindex Socket索引 databuf 数据缓冲区 len 长度 * Output : None * Return : None *******************************************************************************/ void CH392SendData(UINT8 sockindex,UINT8 *databuf,UINT16 len) { UINT16 i; xWriteCH392Cmd(CMD30_WRITE_SEND_BUF_SN); xWriteCH392Data((UINT8)sockindex); xWriteCH392Data((UINT8)len); xWriteCH392Data((UINT8)(len>>8)); for(i = 0; i < len; i++) { xWriteCH392Data(*databuf++); } xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392GetRecvLength * Description : 获取接收缓冲区长度 * Input : sockindex Socket索引 * Output : None * Return : 返回接收缓冲区有效长度 *******************************************************************************/ UINT16 CH392GetRecvLength(UINT8 sockindex) { UINT16 i; xWriteCH392Cmd(CMD12_GET_RECV_LEN_SN); xWriteCH392Data((UINT8)sockindex); i = xReadCH392Data(); i = (UINT16)(xReadCH392Data()<<8) + i; xCH392CmdEnd(); return i; } /******************************************************************************* * Function Name : CH392ClearRecvBuf * Description : 清除接收缓冲区 * Input : sockindex Socket索引 * Output : None * Return : None *******************************************************************************/ void CH392ClearRecvBuf(UINT8 sockindex) { xWriteCH392Cmd(CMD10_CLEAR_RECV_BUF_SN); xWriteCH392Data((UINT8)sockindex); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392GetRecvLength * Description : 读取接收缓冲区数据 * Input : sockindex Socket索引 len 长度 pbuf 缓冲区 * Output : None * Return : None *******************************************************************************/ void CH392GetRecvData(UINT8 sockindex,UINT16 len,UINT8 *pbuf) { UINT16 i; if(!len)return; xWriteCH392Cmd(CMD30_READ_RECV_BUF_SN); xWriteCH392Data(sockindex); xWriteCH392Data((UINT8)len); xWriteCH392Data((UINT8)(len>>8)); delay_us(1); for(i = 0; i < len; i++) { *pbuf = xReadCH392Data(); pbuf++; } xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392CMDSetRetryCount * Description : 设置重试次数 * Input : count 重试值,最大为20次 * Output : None * Return : None ********************************************************************************/ void CH392CMDSetRetryCount(UINT8 count) { xWriteCH392Cmd(CMD10_SET_RETRAN_COUNT); xWriteCH392Data(count); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392CMDSetRetryPeriod * Description : 设置重试周期 * Input : period 重试周期单位为毫秒,最大1000ms * Output : None * Return : None *******************************************************************************/ void CH392CMDSetRetryPeriod(UINT16 period) { xWriteCH392Cmd(CMD10_SET_RETRAN_COUNT); xWriteCH392Data((UINT8)period); xWriteCH392Data((UINT8)(period>>8)); xCH392CmdEnd(); } /******************************************************************************** * Function Name : CH392CMDGetSocketStatus * Description : 获取socket * Input : None * Output : socket n的状态信息,第1字节为socket 打开或者关闭 第2字节为TCP状态 * Return : None *******************************************************************************/ void CH392CMDGetSocketStatus(UINT8 sockindex,UINT8 *status) { xWriteCH392Cmd(CMD12_GET_SOCKET_STATUS_SN); xWriteCH392Data(sockindex); *status++ = xReadCH392Data(); *status++ = xReadCH392Data(); xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392OpenSocket * Description : 打开socket,此命令需要等待执行成功 * Input : sockindex Socket索引 * Output : None * Return : 返回执行结果 *******************************************************************************/ UINT8 CH392OpenSocket(UINT8 sockindex) { UINT8 i = 0; UINT8 s = 0; xWriteCH392Cmd(CMD1W_OPEN_SOCKET_SN); xWriteCH392Data(sockindex); xCH392CmdEnd(); while(1) { delay_ms(5); /* 延时查询,建议2MS以上*/ s = CH392GetCmdStatus(); /* 不能过于频繁查询*/ if(s !=CH392_ERR_BUSY)break; /* 如果CH392芯片返回忙状态*/ if(i++ > 200)return CH392_ERR_UNKNOW; /* 超时退出*/ } return s; } /******************************************************************************* * Function Name : CH392CloseSocket * Description : 关闭socket, * Input : sockindex Socket索引 * Output : None * Return : 返回执行结果 *******************************************************************************/ UINT8 CH392CloseSocket(UINT8 sockindex) { UINT8 i = 0; UINT8 s = 0; xWriteCH392Cmd(CMD1W_CLOSE_SOCKET_SN); xWriteCH392Data(sockindex); xCH392CmdEnd(); while(1) { delay_ms(5); /* 延时查询,建议2MS以上*/ s = CH392GetCmdStatus(); /* 不能过于频繁查询*/ if(s !=CH392_ERR_BUSY)break; /* 如果CH392芯片返回忙状态*/ if(i++ > 200)return CH392_ERR_UNKNOW; /* 超时退出*/ } return s; } /******************************************************************************** * Function Name : CH392TCPConnect * Description : TCP连接,仅在TCP模式下有效,此命令需要等待执行成功 * Input : sockindex Socket索引 * Output : None * Return : 返回执行结果 *******************************************************************************/ UINT8 CH392TCPConnect(UINT8 sockindex) { UINT8 i = 0; UINT8 s = 0; xWriteCH392Cmd(CMD1W_TCP_CONNECT_SN); xWriteCH392Data(sockindex); xCH392CmdEnd(); while(1) { delay_ms(5); /* 延时查询,建议2MS以上*/ s = CH392GetCmdStatus(); /* 不能过于频繁查询*/ if(s !=CH392_ERR_BUSY)break; /* 如果CH392芯片返回忙状态*/ if(i++ > 200)return CH392_ERR_UNKNOW; /* 超时退出*/ } return s; } /****************************************************************************** * Function Name : CH392TCPListen * Description : TCP监听,仅在TCP模式下有效,此命令需要等待执行成功 * Input : sockindex Socket索引 * Output : None * Return : 返回执行结果 *******************************************************************************/ UINT8 CH392TCPListen(UINT8 sockindex) { UINT8 i = 0; UINT8 s = 0; xWriteCH392Cmd(CMD1W_TCP_LISTEN_SN); xWriteCH392Data(sockindex); xCH392CmdEnd(); while(1) { delay_ms(5); /* 延时查询,建议2MS以上*/ s = CH392GetCmdStatus(); /* 不能过于频繁查询*/ if(s !=CH392_ERR_BUSY)break; /* 如果CH392芯片返回忙状态*/ if(i++ > 200)return CH392_ERR_UNKNOW; /* 超时退出*/ } return s; } /******************************************************************************** * Function Name : CH392TCPDisconnect * Description : TCP断开,仅在TCP模式下有效,此命令需要等待执行成功 * Input : sockindex Socket索引 * Output : None * Return : None *******************************************************************************/ UINT8 CH392TCPDisconnect(UINT8 sockindex) { UINT8 i = 0; UINT8 s = 0; xWriteCH392Cmd(CMD1W_TCP_DISNCONNECT_SN); xWriteCH392Data(sockindex); xCH392CmdEnd(); while(1) { delay_ms(5); /* 延时查询,建议2MS以上*/ s = CH392GetCmdStatus(); /* 不能过于频繁查询*/ if(s !=CH392_ERR_BUSY)break; /* 如果CH392芯片返回忙状态*/ if(i++ > 200)return CH392_ERR_UNKNOW; /* 超时退出*/ } return s; } /******************************************************************************* * Function Name : CH392GetSocketInt * Description : 获取socket n的中断状态 * Input : sockindex socket索引 * Output : None * Return : 中断状态 *******************************************************************************/ UINT8 CH392GetSocketInt(UINT8 sockindex) { UINT8 intstatus; xWriteCH392Cmd(CMD11_GET_INT_STATUS_SN); xWriteCH392Data(sockindex); delay_us(2); intstatus = xReadCH392Data(); xCH392CmdEnd(); return intstatus; } /******************************************************************************* * Function Name : CH392CRCRet6Bit * Description : 对多播地址进行CRC运算,并取高6位。 * Input : mac_addr MAC地址 * Output : None * Return : 返回CRC32的高6位 *******************************************************************************/ UINT8 CH392CRCRet6Bit(UINT8 *mac_addr) { INT32 perByte; INT32 perBit; const UINT32 poly = 0x04C11DB7; UINT32 crc_value = 0xFFFFFFFF; UINT8 c; for ( perByte = 0; perByte < 6; perByte ++ ) { c = *(mac_addr++); for ( perBit = 0; perBit < 8; perBit++ ) { crc_value = (crc_value<<1)^((((crc_value>>31)^c)&0x01)?poly:0); c >>= 1; } } crc_value=crc_value>>26; return ((UINT8)crc_value); } /****************************************************************************** * Function Name : CH392DHCPEnable * Description : 启动/停止DHCP * Input : flag 1:启动DHCP;0:停止DHCP * Output : None * Return : 执行状态 *******************************************************************************/ UINT8 CH392DHCPEnable(UINT8 flag) { UINT8 i = 0; UINT8 s; xWriteCH392Cmd(CMD10_DHCP_ENABLE); xWriteCH392Data(flag); xCH392CmdEnd(); while(1) { delay_ms(20); s = CH392GetCmdStatus(); /* 不能过于频繁查询*/ if(s !=CH392_ERR_BUSY)break; /* 如果CH392芯片返回忙状态*/ if(i++ > 200)return CH392_ERR_UNKNOW; /* 超时退出*/ } return s; } /****************************************************************************** * Function Name : CH392GetDHCPStatus * Description : 获取DHCP状态 * Input : None * Output : None * Return : DHCP状态,0为成功,其他值表示错误 *******************************************************************************/ UINT8 CH392GetDHCPStatus(void) { UINT8 status; xWriteCH392Cmd(CMD01_GET_DHCP_STATUS); status = xReadCH392Data(); xCH392CmdEnd(); return status; } /******************************************************************************* * Function Name : CH392GetIPInf * Description : 获取IP,子网掩码和网关地址 * Input : None * Output : 12个字节的IP,子网掩码和网关地址 * Return : None *******************************************************************************/ void CH392GetIPInf(UINT8 *addr) { UINT8 i; xWriteCH392Cmd(CMD014_GET_IP_INF); for(i = 0; i < 20; i++) { *addr++ = xReadCH392Data(); } xCH392CmdEnd(); } /******************************************************************************* * Function Name : CH392WriteGPIOAddr * Description : 写GPIO寄存器 * Input : regadd 寄存器地址 * :regval 寄存器值 * Output : None * Return : None *******************************************************************************/ void CH392WriteGPIOAddr(UINT8 regadd,UINT8 regval) { xWriteCH392Cmd(CMD20_WRITE_GPIO_REG); xWriteCH392Data(regadd); xWriteCH392Data(regval); } /******************************************************************************* * Function Name : CH392ReadGPIOAddr * Description : 读GPIO寄存器 * Input : regadd 寄存器地址 * Output : None * Return : 寄存器的值 *******************************************************************************/ UINT8 CH392ReadGPIOAddr(UINT8 regadd) { UINT8 i; xWriteCH392Cmd(CMD10_READ_GPIO_REG); xWriteCH392Data(regadd); delay_ms(1); i = xReadCH392Data(); return i; } /******************************************************************************* * Function Name : CH392EEPROMErase * Description : 擦除EEPROM * Input : None * Output : None * Return : 执行状态 *******************************************************************************/ UINT8 CH392EEPROMErase(void) { UINT8 i; xWriteCH392Cmd(CMD00_EEPROM_ERASE); while(1) { delay_ms(20); i = CH392GetCmdStatus(); if(i == CH392_ERR_BUSY)continue; break; } return i; } /******************************************************************************* * Function Name : CH392EEPROMWrite * Description : 写EEPROM * Input : eepaddr EEPROM地址 * :buf 缓冲区地址 * :len 长度 * Output : None * Return : 执行状态 *******************************************************************************/ UINT8 CH392EEPROMWrite(UINT16 eepaddr,UINT8 *buf,UINT8 len) { UINT8 i; xWriteCH392Cmd(CMD30_EEPROM_WRITE); xWriteCH392Data((UINT8)(eepaddr)); xWriteCH392Data((UINT8)(eepaddr >> 8)); xWriteCH392Data(len); while(len--)xWriteCH392Data(*buf++); while(1) { delay_ms(20); i = CH392GetCmdStatus(); if(i == CH392_ERR_BUSY)continue; break; } return i; } /******************************************************************************* * Function Name : CH392EEPROMRead * Description : 写EEPROM * Input : eepaddr EEPROM地址 * :buf 缓冲区地址 * :len 长度 * Output : None * Return : None *******************************************************************************/ void CH392EEPROMRead(UINT16 eepaddr,UINT8 *buf,UINT8 len) { xWriteCH392Cmd(CMD30_EEPROM_READ); xWriteCH392Data((UINT8)(eepaddr)); xWriteCH392Data((UINT8)(eepaddr >> 8)); xWriteCH392Data(len); delay_ms(1); while(len--)*buf++ = xReadCH392Data(); } /******************************************************************************* * Function Name : CH392SetTCPMss * Description : 设置TCP MSS值 * Input : tcpmss * Output : None * Return : None *******************************************************************************/ void CH392SetTCPMss(UINT16 tcpmss) { xWriteCH392Cmd(CMD20_SET_TCP_MSS); xWriteCH392Data((UINT8)(tcpmss)); xWriteCH392Data((UINT8)(tcpmss >> 8)); } /******************************************************************************* * Function Name : CH392SetSocketRecvBuf * Description : 设置Socket接收缓冲区 * Input : sockindex socket索引 :startblk 起始地址 :blknum 单位缓冲区个数 ,单位为512字节 * Output : None * Return : None *******************************************************************************/ void CH392SetSocketRecvBuf(UINT8 sockindex,UINT8 startblk,UINT8 blknum) { xWriteCH392Cmd(CMD30_SET_RECV_BUF); xWriteCH392Data(sockindex); xWriteCH392Data(startblk); xWriteCH392Data(blknum); } /******************************************************************************* * Function Name : CH392SetSocketSendBuf * Description : 设置Socket发送缓冲区 * Input : sockindex socket索引 :startblk 起始地址 :blknum 单位缓冲区个数 * Output : None * Return : None *******************************************************************************/ void CH392SetSocketSendBuf(UINT8 sockindex,UINT8 startblk,UINT8 blknum) { xWriteCH392Cmd(CMD30_SET_SEND_BUF); xWriteCH392Data(sockindex); xWriteCH392Data(startblk); xWriteCH392Data(blknum); } /******************************************************************************* * Function Name : CH392UDPSendTo * Description : UDP向指定的IP和端口发送数据 * Input : buf : 发送数据缓冲区 len : 发送数据长度 ip : 目标IP port : 目标端口 sockeid : socket索引值 * Output : None * Return : None *******************************************************************************/ void CH392UDPSendTo(UINT8 *buf,UINT32 len,UINT8 *ip,UINT16 port,UINT8 sockindex) { CH392SetSocketDesIP(sockindex,ip); /* 设置socket 0目标IP地址 */ CH392SetSocketDesPort(sockindex,port); CH392SendData(sockindex,buf,len); } /******************************************************************************* * Function Name : CH392SetStartPara * Description : 设置CH392启动参数 * Input : mdata * Output : None * Return : None *******************************************************************************/ void CH392SetStartPara(UINT32 mdata) { xWriteCH392Cmd(CMD40_SET_FUN_PARA); xWriteCH392Data((UINT8)mdata); xWriteCH392Data((UINT8)((UINT16)mdata>>8)); xWriteCH392Data((UINT8)(mdata >> 16)); xWriteCH392Data((UINT8)(mdata >> 24)); } /******************************************************************************* * Function Name : CH392CMDGetGlobIntStatus * Description : 获取全局中断状态,收到此命令CH392自动取消中断,0x44及以上版本使用 * Input : None * Output : None * Return : 返回当前的全局中断状态 *******************************************************************************/ UINT8 CH392CMDGetGlobIntStatus_ALL(void) { UINT8 init_status; xWriteCH392Cmd(CMD01_GET_GLOB_INT_STATUS); delay_us(2); init_status = xReadCH392Data(); xCH392CmdEnd(); return init_status; } /******************************************************************************* * Function Name : CH392SetKeepLive * Description : 设置keepalive功能 * Input : sockindex Socket号 * cmd 0:关闭 1:开启 * Output : None * Return : None *******************************************************************************/ void CH392SetKeepLive(UINT8 sockindex,UINT8 cmd) { xWriteCH392Cmd(CMD20_SET_KEEP_LIVE_SN); xWriteCH392Data(sockindex); xWriteCH392Data(cmd); } /******************************************************************************* * Function Name : CH392KeepLiveCNT * Description : 设置keepalive重试次数 * Input : cnt 重试次数() * Output : None * Return : None *******************************************************************************/ void CH392KeepLiveCNT(UINT8 cnt) { xWriteCH392Cmd(CMD10_SET_KEEP_LIVE_CNT); xWriteCH392Data(cnt); } /******************************************************************************* * Function Name : CH392KeepLiveIDLE * Description : 设置KEEPLIVE空闲 * Input : idle 空闲时间(单位:ms) * Output : None * Return : None *******************************************************************************/ void CH392KeepLiveIDLE(UINT32 idle) { xWriteCH392Cmd(CMD40_SET_KEEP_LIVE_IDLE); xWriteCH392Data((UINT8)idle); xWriteCH392Data((UINT8)((UINT16)idle>>8)); xWriteCH392Data((UINT8)(idle >> 16)); xWriteCH392Data((UINT8)(idle >> 24)); } /******************************************************************************* * Function Name : CH392KeepLiveINTVL * Description : 设置KeepLive间隔时间 * Input : intvl 间隔时间(单位:ms) * Output : None * Return : None *******************************************************************************/ void CH392KeepLiveINTVL(UINT32 intvl) { xWriteCH392Cmd(CMD40_SET_KEEP_LIVE_INTVL); xWriteCH392Data((UINT8)intvl); xWriteCH392Data((UINT8)((UINT16)intvl>>8)); xWriteCH392Data((UINT8)(intvl >> 16)); xWriteCH392Data((UINT8)(intvl >> 24)); } /******************************************************************************* * Function Name : CH392SetTTLNum * Description : 设置TTL * Input : sockindex Socket号 * TTLnum:TTL数 * Output : None * Return : None *******************************************************************************/ void CH392SetTTLNum(UINT8 sockindex,UINT8 TTLnum) { xWriteCH392Cmd(CMD20_SET_TTL); xWriteCH392Data(sockindex); xWriteCH392Data(TTLnum); }