1075 lines
36 KiB
C
1075 lines
36 KiB
C
/********************************** (C) COPYRIGHT *******************************
|
||
* File Name : CH395CMD.C
|
||
* Author : WCH
|
||
* Version : V1.1
|
||
* Date : 2014/8/1
|
||
* Description : CH395芯片命令接口文件
|
||
*
|
||
*******************************************************************************/
|
||
|
||
/* 头文件包含*/
|
||
#include "CH395INC.H"
|
||
#include "CH395CMD.H"
|
||
|
||
#include "ch395_adapter.h"
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDReset
|
||
* Description : 复位CH395芯片
|
||
* Input : None
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDReset(void)
|
||
{
|
||
xWriteCH395Cmd(CMD00_RESET_ALL);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395CMDSleep
|
||
* Description : 使CH395进入睡眠状态
|
||
* Input : None
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDSleep(void)
|
||
{
|
||
xWriteCH395Cmd(CMD00_ENTER_SLEEP);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDSleep
|
||
* Description : 获取芯片以及固件版本号,1字节,高四位表示芯片版本,
|
||
低四位表示固件版本
|
||
* Input : None
|
||
* Output : None
|
||
* Return : 1字节芯片及固件版本号
|
||
*******************************************************************************/
|
||
UINT8 CH395CMDGetVer(void)
|
||
{
|
||
UINT8 i;
|
||
xWriteCH395Cmd(CMD01_GET_IC_VER);
|
||
i = xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
return i;
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDCheckExist
|
||
* Description : 测试命令,用于测试硬件以及接口通讯
|
||
* Input : testdata 1字节测试数据
|
||
* Output : None
|
||
* Return : 硬件OK,返回 testdata按位取反
|
||
*******************************************************************************/
|
||
UINT8 CH395CMDCheckExist(UINT8 testdata)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD11_CHECK_EXIST);
|
||
xWriteCH395Data(testdata);
|
||
i = xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
return i;
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDSetPHY
|
||
* Description : 设置PHY,主要设置CH395 PHY为100/10M 或者全双工半双工,CH395默
|
||
为自动协商。
|
||
* Input : phystat 参考PHY 命令参数/状态
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDSetPHY(UINT8 phystat)
|
||
{
|
||
xWriteCH395Cmd(CMD10_SET_PHY);
|
||
xWriteCH395Data(phystat);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395CMDGetPHYStatus
|
||
* Description : 获取PHY的状态
|
||
* Input : None
|
||
* Output : None
|
||
* Return : 当前CH395PHY状态,参考PHY参数/状态定义
|
||
*******************************************************************************/
|
||
UINT8 CH395CMDGetPHYStatus(void)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD01_GET_PHY_STATUS);
|
||
i = xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
return i;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395CMDGetGlobIntStatus
|
||
* Description : 获取全局中断状态,收到此命令CH395自动取消中断,0x43及以下版本使用
|
||
* Input : None
|
||
* Output : None
|
||
* Return : 返回当前的全局中断状态
|
||
*******************************************************************************/
|
||
UINT8 CH395CMDGetGlobIntStatus(void)
|
||
{
|
||
UINT8 init_status;
|
||
|
||
xWriteCH395Cmd(CMD01_GET_GLOB_INT_STATUS);
|
||
init_status = xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
return init_status;
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDInitCH395
|
||
* Description : 初始化CH395芯片。
|
||
* Input : None
|
||
* Output : None
|
||
* Return : 返回执行结果
|
||
*******************************************************************************/
|
||
UINT8 CH395CMDInitCH395(void)
|
||
{
|
||
UINT8 i = 0;
|
||
UINT8 s = 0;
|
||
|
||
xWriteCH395Cmd(CMD0W_INIT_CH395);
|
||
xEndCH395Cmd();
|
||
while(1)
|
||
{
|
||
mDelaymS(10); /* 延时查询,建议2MS以上*/
|
||
s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
|
||
if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
|
||
if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出,本函数需要500MS以上执行完毕 */
|
||
}
|
||
return s;
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDSetUartBaudRate
|
||
* Description : 设置CH395串口波特率,仅在串口模式下有效
|
||
* Input : baudrate 串口波特率
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDSetUartBaudRate(UINT32 baudrate)
|
||
{
|
||
//UINT8 i;
|
||
xWriteCH395Cmd(CMD31_SET_BAUDRATE);
|
||
xWriteCH395Data((UINT8)baudrate);
|
||
xWriteCH395Data((UINT8)((UINT16)baudrate >> 8));
|
||
xWriteCH395Data((UINT8)(baudrate >> 16));
|
||
//i = xReadCH395Data();
|
||
xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395GetCmdStatus
|
||
* Description : 获取命令执行状态,某些命令需要等待命令执行结果
|
||
* Input : None
|
||
* Output : None
|
||
* Return : 返回上一条命令执行状态
|
||
*******************************************************************************/
|
||
UINT8 CH395GetCmdStatus(void)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD01_GET_CMD_STATUS);
|
||
i = xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
return i;
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDSetIPAddr
|
||
* Description : 设置CH395的IP地址
|
||
* Input : ipaddr 指IP地址
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDSetIPAddr(UINT8 *ipaddr)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD40_SET_IP_ADDR);
|
||
for(i = 0; i < 4;i++)xWriteCH395Data(*ipaddr++);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDSetGWIPAddr
|
||
* Description : 设置CH395的网关IP地址
|
||
* Input : ipaddr 指向网关IP地址
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDSetGWIPAddr(UINT8 *gwipaddr)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD40_SET_GWIP_ADDR);
|
||
for(i = 0; i < 4;i++)xWriteCH395Data(*gwipaddr++);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDSetMASKAddr
|
||
* Description : 设置CH395的子网掩码,默认为255.255.255.0
|
||
* Input : maskaddr 指子网掩码地址
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDSetMASKAddr(UINT8 *maskaddr)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD40_SET_MASK_ADDR);
|
||
for(i = 0; i < 4;i++)xWriteCH395Data(*maskaddr++);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDSetMACAddr
|
||
* Description : 设置CH395的MAC地址。
|
||
* Input : amcaddr MAC地址指针
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDSetMACAddr(UINT8 *amcaddr)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD60_SET_MAC_ADDR);
|
||
for(i = 0; i < 6;i++)xWriteCH395Data(*amcaddr++);
|
||
xEndCH395Cmd();
|
||
mDelaymS(100);
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDGetMACAddr
|
||
* Description : 获取CH395的MAC地址。
|
||
* Input : amcaddr MAC地址指针
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDGetMACAddr(UINT8 *amcaddr)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD06_GET_MAC_ADDR);
|
||
for(i = 0; i < 6;i++)*amcaddr++ = xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395CMDSetMACFilt
|
||
* Description : 设置MAC过滤。
|
||
* Input : filtype 参考 MAC过滤
|
||
table0 Hash0
|
||
table1 Hash1
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDSetMACFilt(UINT8 filtype,UINT32 table0,UINT32 table1)
|
||
{
|
||
xWriteCH395Cmd(CMD90_SET_MAC_FILT);
|
||
xWriteCH395Data(filtype);
|
||
xWriteCH395Data((UINT8)table0);
|
||
xWriteCH395Data((UINT8)((UINT16)table0 >> 8));
|
||
xWriteCH395Data((UINT8)(table0 >> 16));
|
||
xWriteCH395Data((UINT8)(table0 >> 24));
|
||
|
||
xWriteCH395Data((UINT8)table1);
|
||
xWriteCH395Data((UINT8)((UINT16)table1 >> 8));
|
||
xWriteCH395Data((UINT8)(table1 >> 16));
|
||
xWriteCH395Data((UINT8)(table1 >> 24));
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDGetUnreachIPPT
|
||
* Description : 获取不可达信息 (IP,Port,Protocol Type)
|
||
* Input : list 保存获取到的不可达
|
||
第1个字节为不可达代码,请参考 不可达代码(CH395INC.H)
|
||
第2个字节为IP包协议类型
|
||
第3-4字节为端口号
|
||
第4-8字节为IP地址
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDGetUnreachIPPT(UINT8 *list)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD08_GET_UNREACH_IPPORT);
|
||
for(i = 0; i < 8; i++)
|
||
{
|
||
*list++ = xReadCH395Data();
|
||
}
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDGetRemoteIPP
|
||
* Description : 获取远端的IP和端口地址,一般在TCP Server模式下使用
|
||
* Input : sockindex Socket索引
|
||
list 保存IP和端口
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDGetRemoteIPP(UINT8 sockindex,UINT8 *list)
|
||
{
|
||
UINT8 i;
|
||
|
||
xWriteCH395Cmd(CMD06_GET_REMOT_IPP_SN);
|
||
xWriteCH395Data(sockindex);
|
||
for(i = 0; i < 6; i++)
|
||
{
|
||
*list++ = xReadCH395Data();
|
||
}
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395SetSocketDesIP
|
||
* Description : 设置socket n的目的IP地址
|
||
* Input : sockindex Socket索引
|
||
ipaddr 指向IP地址
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetSocketDesIP(UINT8 sockindex,UINT8 *ipaddr)
|
||
{
|
||
xWriteCH395Cmd(CMD50_SET_IP_ADDR_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data(*ipaddr++);
|
||
xWriteCH395Data(*ipaddr++);
|
||
xWriteCH395Data(*ipaddr++);
|
||
xWriteCH395Data(*ipaddr++);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395SetSocketProtType
|
||
* Description : 设置socket 的协议类型
|
||
* Input : sockindex Socket索引
|
||
prottype 协议类型,请参考 socket协议类型定义(CH395INC.H)
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetSocketProtType(UINT8 sockindex,UINT8 prottype)
|
||
{
|
||
xWriteCH395Cmd(CMD20_SET_PROTO_TYPE_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data(prottype);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
|
||
* Function Name : CH395SetSocketDesPort
|
||
* Description : 设置socket n的协议类型
|
||
* Input : sockindex Socket索引
|
||
desprot 2字节目的端口
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetSocketDesPort(UINT8 sockindex,UINT16 desprot)
|
||
{
|
||
xWriteCH395Cmd(CMD30_SET_DES_PORT_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data((UINT8)desprot);
|
||
xWriteCH395Data((UINT8)(desprot >> 8));
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395SetSocketSourPort
|
||
* Description : 设置socket n的协议类型
|
||
* Input : sockindex Socket索引
|
||
desprot 2字节源端口
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetSocketSourPort(UINT8 sockindex,UINT16 surprot)
|
||
{
|
||
xWriteCH395Cmd(CMD30_SET_SOUR_PORT_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data((UINT8)surprot);
|
||
xWriteCH395Data((UINT8)(surprot>>8));
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/******************************************************************************
|
||
* Function Name : CH395SetSocketIPRAWProto
|
||
* Description : IP模式下,socket IP包协议字段
|
||
* Input : sockindex Socket索引
|
||
prototype IPRAW模式1字节协议字段
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetSocketIPRAWProto(UINT8 sockindex,UINT8 prototype)
|
||
{
|
||
xWriteCH395Cmd(CMD20_SET_IPRAW_PRO_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data(prototype);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395EnablePing
|
||
* Description : 开启/关闭 PING
|
||
* Input : enable : 1 开启PING
|
||
:0 关闭PING
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395EnablePing(UINT8 enable)
|
||
{
|
||
xWriteCH395Cmd(CMD01_PING_ENABLE);
|
||
xWriteCH395Data(enable);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395SendData
|
||
* Description : 向发送缓冲区写数据
|
||
* Input : sockindex Socket索引
|
||
databuf 数据缓冲区
|
||
len 长度
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SendData(UINT8 sockindex,UINT8 *databuf,UINT16 len)
|
||
{
|
||
//UINT16 i;
|
||
|
||
xWriteCH395Cmd(CMD30_WRITE_SEND_BUF_SN);
|
||
xWriteCH395Data((UINT8)sockindex);
|
||
xWriteCH395Data((UINT8)len);
|
||
xWriteCH395Data((UINT8)(len>>8));
|
||
mDelayuS(1);
|
||
/*
|
||
for(i = 0; i < len; i++)
|
||
{
|
||
xWriteCH395Data(*databuf++);
|
||
}
|
||
*/
|
||
xWriteCH395DataBlock(databuf,len);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395GetRecvLength
|
||
* Description : 获取接收缓冲区长度
|
||
* Input : sockindex Socket索引
|
||
* Output : None
|
||
* Return : 返回接收缓冲区有效长度
|
||
*******************************************************************************/
|
||
UINT16 CH395GetRecvLength(UINT8 sockindex)
|
||
{
|
||
UINT16 i;
|
||
|
||
xWriteCH395Cmd(CMD12_GET_RECV_LEN_SN);
|
||
xWriteCH395Data((UINT8)sockindex);
|
||
i = xReadCH395Data();
|
||
i = (UINT16)(xReadCH395Data()<<8) + i;
|
||
xEndCH395Cmd();
|
||
return i;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395ClearRecvBuf
|
||
* Description : 清除接收缓冲区
|
||
* Input : sockindex Socket索引
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395ClearRecvBuf(UINT8 sockindex)
|
||
{
|
||
xWriteCH395Cmd(CMD10_CLEAR_RECV_BUF_SN);
|
||
xWriteCH395Data((UINT8)sockindex);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395GetRecvLength
|
||
* Description : 读取接收缓冲区数据
|
||
* Input : sockindex Socket索引
|
||
len 长度
|
||
pbuf 缓冲区
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395GetRecvData(UINT8 sockindex,UINT16 len,UINT8 *pbuf)
|
||
{
|
||
//UINT16 i;
|
||
if(!len)return;
|
||
xWriteCH395Cmd(CMD30_READ_RECV_BUF_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data((UINT8)len);
|
||
xWriteCH395Data((UINT8)(len>>8));
|
||
mDelayuS(1);
|
||
/*
|
||
for(i = 0; i < len; i++)
|
||
{
|
||
*pbuf = xReadCH395Data();
|
||
pbuf++;
|
||
}
|
||
*/
|
||
xReadCH395DataBlock(pbuf,len);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDSetRetryCount
|
||
* Description : 设置重试次数
|
||
* Input : count 重试值,最大为20次
|
||
* Output : None
|
||
* Return : None
|
||
********************************************************************************/
|
||
void CH395CMDSetRetryCount(UINT8 count)
|
||
{
|
||
xWriteCH395Cmd(CMD10_SET_RETRAN_COUNT);
|
||
xWriteCH395Data(count);
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDSetRetryPeriod
|
||
* Description : 设置重试周期
|
||
* Input : period 重试周期单位为毫秒,最大1000ms
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDSetRetryPeriod(UINT16 period)
|
||
{
|
||
xWriteCH395Cmd(CMD10_SET_RETRAN_COUNT);
|
||
xWriteCH395Data((UINT8)period);
|
||
xWriteCH395Data((UINT8)(period>>8));
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395CMDGetSocketStatus
|
||
* Description : 获取socket
|
||
* Input : None
|
||
* Output : socket n的状态信息,第1字节为socket 打开或者关闭
|
||
第2字节为TCP状态
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395CMDGetSocketStatus(UINT8 sockindex,UINT8 *status)
|
||
{
|
||
xWriteCH395Cmd(CMD12_GET_SOCKET_STATUS_SN);
|
||
xWriteCH395Data(sockindex);
|
||
*status++ = xReadCH395Data();
|
||
*status++ = xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395OpenSocket
|
||
* Description : 打开socket,此命令需要等待执行成功
|
||
* Input : sockindex Socket索引
|
||
* Output : None
|
||
* Return : 返回执行结果
|
||
*******************************************************************************/
|
||
UINT8 CH395OpenSocket(UINT8 sockindex)
|
||
{
|
||
UINT8 i = 0;
|
||
UINT8 s = 0;
|
||
xWriteCH395Cmd(CMD1W_OPEN_SOCKET_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xEndCH395Cmd();
|
||
while(1)
|
||
{
|
||
mDelaymS(5); /* 延时查询,建议2MS以上*/
|
||
s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
|
||
if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
|
||
if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
|
||
}
|
||
return s;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395CloseSocket
|
||
* Description : 关闭socket,
|
||
* Input : sockindex Socket索引
|
||
* Output : None
|
||
* Return : 返回执行结果
|
||
*******************************************************************************/
|
||
UINT8 CH395CloseSocket(UINT8 sockindex)
|
||
{
|
||
UINT8 i = 0;
|
||
UINT8 s = 0;
|
||
xWriteCH395Cmd(CMD1W_CLOSE_SOCKET_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xEndCH395Cmd();
|
||
while(1)
|
||
{
|
||
mDelaymS(5); /* 延时查询,建议2MS以上*/
|
||
s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
|
||
if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
|
||
if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
|
||
}
|
||
return s;
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395TCPConnect
|
||
* Description : TCP连接,仅在TCP模式下有效,此命令需要等待执行成功
|
||
* Input : sockindex Socket索引
|
||
* Output : None
|
||
* Return : 返回执行结果
|
||
*******************************************************************************/
|
||
UINT8 CH395TCPConnect(UINT8 sockindex)
|
||
{
|
||
UINT8 i = 0;
|
||
UINT8 s = 0;
|
||
xWriteCH395Cmd(CMD1W_TCP_CONNECT_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xEndCH395Cmd();
|
||
while(1)
|
||
{
|
||
mDelaymS(5); /* 延时查询,建议2MS以上*/
|
||
s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
|
||
if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
|
||
if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
|
||
}
|
||
return s;
|
||
}
|
||
|
||
/******************************************************************************
|
||
* Function Name : CH395TCPListen
|
||
* Description : TCP监听,仅在TCP模式下有效,此命令需要等待执行成功
|
||
* Input : sockindex Socket索引
|
||
* Output : None
|
||
* Return : 返回执行结果
|
||
*******************************************************************************/
|
||
UINT8 CH395TCPListen(UINT8 sockindex)
|
||
{
|
||
UINT8 i = 0;
|
||
UINT8 s = 0;
|
||
xWriteCH395Cmd(CMD1W_TCP_LISTEN_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xEndCH395Cmd();
|
||
while(1)
|
||
{
|
||
mDelaymS(5); /* 延时查询,建议2MS以上*/
|
||
s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
|
||
if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
|
||
if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
|
||
}
|
||
return s;
|
||
}
|
||
|
||
/********************************************************************************
|
||
* Function Name : CH395TCPDisconnect
|
||
* Description : TCP断开,仅在TCP模式下有效,此命令需要等待执行成功
|
||
* Input : sockindex Socket索引
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
UINT8 CH395TCPDisconnect(UINT8 sockindex)
|
||
{
|
||
UINT8 i = 0;
|
||
UINT8 s = 0;
|
||
xWriteCH395Cmd(CMD1W_TCP_DISNCONNECT_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xEndCH395Cmd();
|
||
while(1)
|
||
{
|
||
mDelaymS(5); /* 延时查询,建议2MS以上*/
|
||
s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
|
||
if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
|
||
if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
|
||
}
|
||
return s;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395GetSocketInt
|
||
* Description : 获取socket n的中断状态
|
||
* Input : sockindex socket索引
|
||
* Output : None
|
||
* Return : 中断状态
|
||
*******************************************************************************/
|
||
UINT8 CH395GetSocketInt(UINT8 sockindex)
|
||
{
|
||
UINT8 intstatus;
|
||
xWriteCH395Cmd(CMD11_GET_INT_STATUS_SN);
|
||
xWriteCH395Data(sockindex);
|
||
mDelayuS(2);
|
||
intstatus = xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
return intstatus;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395CRCRet6Bit
|
||
* Description : 对多播地址进行CRC运算,并取高6位。
|
||
* Input : mac_addr MAC地址
|
||
* Output : None
|
||
* Return : 返回CRC32的高6位
|
||
*******************************************************************************/
|
||
UINT8 CH395CRCRet6Bit(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 : CH395DHCPEnable
|
||
* Description : 启动/停止DHCP
|
||
* Input : flag 1:启动DHCP;0:停止DHCP
|
||
* Output : None
|
||
* Return : 执行状态
|
||
*******************************************************************************/
|
||
UINT8 CH395DHCPEnable(UINT8 flag)
|
||
{
|
||
UINT8 i = 0;
|
||
UINT8 s;
|
||
xWriteCH395Cmd(CMD10_DHCP_ENABLE);
|
||
xWriteCH395Data(flag);
|
||
xEndCH395Cmd();
|
||
while(1)
|
||
{
|
||
mDelaymS(20);
|
||
s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
|
||
if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
|
||
if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
|
||
}
|
||
return s;
|
||
}
|
||
|
||
/******************************************************************************
|
||
* Function Name : CH395GetDHCPStatus
|
||
* Description : 获取DHCP状态
|
||
* Input : None
|
||
* Output : None
|
||
* Return : DHCP状态,0为成功,其他值表示错误
|
||
*******************************************************************************/
|
||
UINT8 CH395GetDHCPStatus(void)
|
||
{
|
||
UINT8 status;
|
||
xWriteCH395Cmd(CMD01_GET_DHCP_STATUS);
|
||
status = xReadCH395Data();
|
||
xEndCH395Cmd();
|
||
return status;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395GetIPInf
|
||
* Description : 获取IP,子网掩码和网关地址
|
||
* Input : None
|
||
* Output : 12个字节的IP,子网掩码和网关地址
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395GetIPInf(UINT8 *addr)
|
||
{
|
||
UINT8 i;
|
||
xWriteCH395Cmd(CMD014_GET_IP_INF);
|
||
for(i = 0; i < 20; i++)
|
||
{
|
||
*addr++ = xReadCH395Data();
|
||
}
|
||
xEndCH395Cmd();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395WriteGPIOAddr
|
||
* Description : 写GPIO寄存器
|
||
* Input : regadd 寄存器地址
|
||
* :regval 寄存器值
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395WriteGPIOAddr(UINT8 regadd,UINT8 regval)
|
||
{
|
||
xWriteCH395Cmd(CMD20_WRITE_GPIO_REG);
|
||
xWriteCH395Data(regadd);
|
||
xWriteCH395Data(regval);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395ReadGPIOAddr
|
||
* Description : 读GPIO寄存器
|
||
* Input : regadd 寄存器地址
|
||
* Output : None
|
||
* Return : 寄存器的值
|
||
*******************************************************************************/
|
||
UINT8 CH395ReadGPIOAddr(UINT8 regadd)
|
||
{
|
||
UINT8 i;
|
||
xWriteCH395Cmd(CMD10_READ_GPIO_REG);
|
||
xWriteCH395Data(regadd);
|
||
mDelaymS(1);
|
||
i = xReadCH395Data();
|
||
return i;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395EEPROMErase
|
||
* Description : 擦除EEPROM
|
||
* Input : None
|
||
* Output : None
|
||
* Return : 执行状态
|
||
*******************************************************************************/
|
||
UINT8 CH395EEPROMErase(void)
|
||
{
|
||
UINT8 i;
|
||
xWriteCH395Cmd(CMD00_EEPROM_ERASE);
|
||
while(1)
|
||
{
|
||
mDelaymS(20);
|
||
i = CH395GetCmdStatus();
|
||
if(i == CH395_ERR_BUSY)continue;
|
||
break;
|
||
}
|
||
return i;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395EEPROMWrite
|
||
* Description : 写EEPROM
|
||
* Input : eepaddr EEPROM地址
|
||
* :buf 缓冲区地址
|
||
* :len 长度
|
||
* Output : None
|
||
* Return : 执行状态
|
||
*******************************************************************************/
|
||
UINT8 CH395EEPROMWrite(UINT16 eepaddr,UINT8 *buf,UINT8 len)
|
||
{
|
||
UINT8 i;
|
||
xWriteCH395Cmd(CMD30_EEPROM_WRITE);
|
||
xWriteCH395Data((UINT8)(eepaddr));
|
||
xWriteCH395Data((UINT8)(eepaddr >> 8));
|
||
xWriteCH395Data(len);
|
||
while(len--)xWriteCH395Data(*buf++);
|
||
while(1)
|
||
{
|
||
mDelaymS(20);
|
||
i = CH395GetCmdStatus();
|
||
if(i == CH395_ERR_BUSY)continue;
|
||
break;
|
||
}
|
||
return i;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395EEPROMRead
|
||
* Description : 写EEPROM
|
||
* Input : eepaddr EEPROM地址
|
||
* :buf 缓冲区地址
|
||
* :len 长度
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395EEPROMRead(UINT16 eepaddr,UINT8 *buf,UINT8 len)
|
||
{
|
||
xWriteCH395Cmd(CMD30_EEPROM_READ);
|
||
xWriteCH395Data((UINT8)(eepaddr));
|
||
xWriteCH395Data((UINT8)(eepaddr >> 8));
|
||
xWriteCH395Data(len);
|
||
mDelaymS(1);
|
||
while(len--)*buf++ = xReadCH395Data();
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395SetTCPMss
|
||
* Description : 设置TCP MSS值
|
||
* Input : tcpmss
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetTCPMss(UINT16 tcpmss)
|
||
{
|
||
xWriteCH395Cmd(CMD20_SET_TCP_MSS);
|
||
xWriteCH395Data((UINT8)(tcpmss));
|
||
xWriteCH395Data((UINT8)(tcpmss >> 8));
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395SetSocketRecvBuf
|
||
* Description : 设置Socket接收缓冲区
|
||
* Input : sockindex socket索引
|
||
:startblk 起始地址
|
||
:blknum 单位缓冲区个数 ,单位为512字节
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetSocketRecvBuf(UINT8 sockindex,UINT8 startblk,UINT8 blknum)
|
||
{
|
||
xWriteCH395Cmd(CMD30_SET_RECV_BUF);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data(startblk);
|
||
xWriteCH395Data(blknum);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395SetSocketSendBuf
|
||
* Description : 设置Socket发送缓冲区
|
||
* Input : sockindex socket索引
|
||
:startblk 起始地址
|
||
:blknum 单位缓冲区个数
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetSocketSendBuf(UINT8 sockindex,UINT8 startblk,UINT8 blknum)
|
||
{
|
||
xWriteCH395Cmd(CMD30_SET_SEND_BUF);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data(startblk);
|
||
xWriteCH395Data(blknum);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395UDPSendTo
|
||
* Description : UDP向指定的IP和端口发送数据
|
||
* Input : buf : 发送数据缓冲区
|
||
len : 发送数据长度
|
||
ip : 目标IP
|
||
port : 目标端口
|
||
sockeid : socket索引值
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395UDPSendTo(UINT8 *buf,UINT32 len,UINT8 *ip,UINT16 port,UINT8 sockindex)
|
||
{
|
||
CH395SetSocketDesIP(sockindex,ip); /* 设置socket 0目标IP地址 */
|
||
CH395SetSocketDesPort(sockindex,port);
|
||
CH395SendData(sockindex,buf,len);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395SetStartPara
|
||
* Description : 设置CH395启动参数
|
||
* Input : mdata
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetStartPara(UINT32 mdata)
|
||
{
|
||
xWriteCH395Cmd(CMD40_SET_FUN_PARA);
|
||
xWriteCH395Data((UINT8)mdata);
|
||
xWriteCH395Data((UINT8)((UINT16)mdata>>8));
|
||
xWriteCH395Data((UINT8)(mdata >> 16));
|
||
xWriteCH395Data((UINT8)(mdata >> 24));
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395CMDGetGlobIntStatus
|
||
* Description : 获取全局中断状态,收到此命令CH395自动取消中断,0x44及以上版本使用
|
||
* Input : None
|
||
* Output : None
|
||
* Return : 返回当前的全局中断状态
|
||
*******************************************************************************/
|
||
UINT16 CH395CMDGetGlobIntStatus_ALL(void)
|
||
{
|
||
UINT16 init_status;
|
||
xWriteCH395Cmd(CMD02_GET_GLOB_INT_STATUS_ALL);
|
||
mDelayuS(2);
|
||
init_status = xReadCH395Data();
|
||
init_status = (UINT16)(xReadCH395Data()<<8) + init_status;
|
||
xEndCH395Cmd();
|
||
return init_status;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395SetKeepLive
|
||
* Description : 设置keepalive功能
|
||
* Input : sockindex Socket号
|
||
* cmd 0:关闭 1:开启
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetKeepLive(UINT8 sockindex,UINT8 cmd)
|
||
{
|
||
xWriteCH395Cmd(CMD20_SET_KEEP_LIVE_SN);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data(cmd);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395KeepLiveCNT
|
||
* Description : 设置keepalive重试次数
|
||
* Input : cnt 重试次数()
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395KeepLiveCNT(UINT8 cnt)
|
||
{
|
||
xWriteCH395Cmd(CMD10_SET_KEEP_LIVE_CNT);
|
||
xWriteCH395Data(cnt);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395KeepLiveIDLE
|
||
* Description : 设置KEEPLIVE空闲
|
||
* Input : idle 空闲时间(单位:ms)
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395KeepLiveIDLE(UINT32 idle)
|
||
{
|
||
xWriteCH395Cmd(CMD40_SET_KEEP_LIVE_IDLE);
|
||
xWriteCH395Data((UINT8)idle);
|
||
xWriteCH395Data((UINT8)((UINT16)idle>>8));
|
||
xWriteCH395Data((UINT8)(idle >> 16));
|
||
xWriteCH395Data((UINT8)(idle >> 24));
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395KeepLiveINTVL
|
||
* Description : 设置KeepLive间隔时间
|
||
* Input : intvl 间隔时间(单位:ms)
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395KeepLiveINTVL(UINT32 intvl)
|
||
{
|
||
xWriteCH395Cmd(CMD40_SET_KEEP_LIVE_INTVL);
|
||
xWriteCH395Data((UINT8)intvl);
|
||
xWriteCH395Data((UINT8)((UINT16)intvl>>8));
|
||
xWriteCH395Data((UINT8)(intvl >> 16));
|
||
xWriteCH395Data((UINT8)(intvl >> 24));
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CH395SetTTLNum
|
||
* Description : 设置TTL
|
||
* Input : sockindex Socket号
|
||
* TTLnum:TTL数
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CH395SetTTLNum(UINT8 sockindex,UINT8 TTLnum)
|
||
{
|
||
xWriteCH395Cmd(CMD20_SET_TTL);
|
||
xWriteCH395Data(sockindex);
|
||
xWriteCH395Data(TTLnum);
|
||
}
|
||
|
||
/**************************** endfile *************************************/
|
||
|
||
|
||
|