ch341a_software_and_drivers/Drivers/LIB/CH347/CH347DLL.H

505 lines
23 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*****************************************************************************
** Copyright (C) WCH 2001-2022 **
** Web: http://wch.cn **
******************************************************************************
Abstract:
USB2.0转接芯片CH347,基于480Mbps高速USB总线扩展UART、SPI、I2C、JTAG
Environment:
user mode only,VC6.0 and later
Notes:
Copyright (c) 2022 Nanjing Qinheng Microelectronics Co., Ltd.
--*/
#ifndef _CH347_DLL_H
#define _CH347_DLL_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN64
#define mOFFSET( s, m ) ( (ULONG_PTR) & ( ( ( s * ) 0 ) -> m ) ) // 定义获取结构成员相对偏移地址的宏
#else
#define mOFFSET( s, m ) ( (ULONG) & ( ( ( s * ) 0 ) -> m ) ) // 定义获取结构成员相对偏移地址的宏
#endif
#ifndef max
#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) // 较大值
#endif
#ifndef min
#define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) // 较小值
#endif
#ifdef ExAllocatePool
#undef ExAllocatePool // 删除带TAG的内存分配
#endif
#ifndef NTSTATUS
typedef LONG NTSTATUS; // 返回状态
#endif
//与CH31DLL合用CH341WDM驱动
#ifndef _CH341_DLL_H
typedef struct _USB_SETUP_PKT { // USB控制传输的建立阶段的数据请求包结构
UCHAR mUspReqType; // 00H 请求类型
UCHAR mUspRequest; // 01H 请求代码
union {
struct {
UCHAR mUspValueLow; // 02H 值参数低字节
UCHAR mUspValueHigh; // 03H 值参数高字节
};
USHORT mUspValue; // 02H-03H 值参数
};
union {
struct {
UCHAR mUspIndexLow; // 04H 索引参数低字节
UCHAR mUspIndexHigh; // 05H 索引参数高字节
};
USHORT mUspIndex; // 04H-05H 索引参数
};
USHORT mLength; // 06H-07H 数据阶段的数据长度
} mUSB_SETUP_PKT, *mPUSB_SETUP_PKT;
typedef struct _WIN32_COMMAND { // 定义WIN32命令接口结构
union {
ULONG mFunction; // 输入时指定功能代码或者管道号
NTSTATUS mStatus; // 输出时返回操作状态
};
ULONG mLength; // 存取长度,返回后续数据的长度
union {
mUSB_SETUP_PKT mSetupPkt; // USB控制传输的建立阶段的数据请求
UCHAR mBuffer[ 512]; // 数据缓冲区,长度为0至255B
};
} mWIN32_COMMAND, *mPWIN32_COMMAND;
// WIN32应用层接口命令
#define IOCTL_CH341_COMMAND ( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f34 << 2 | METHOD_BUFFERED ) // 专用接口
#define mWIN32_COMMAND_HEAD mOFFSET( mWIN32_COMMAND, mBuffer ) // WIN32命令接口的头长度
#define mCH341_MAX_NUMBER 16 // 最多同时连接的CH341数
#define mMAX_BUFFER_LENGTH 0x1000 // 数据缓冲区最大长度4096
#define mMAX_COMMAND_LENGTH ( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH ) // 最大数据长度加上命令结构头的长度
#define mDEFAULT_BUFFER_LEN 0x0400 // 数据缓冲区默认长度1024
#define mDEFAULT_COMMAND_LEN ( mWIN32_COMMAND_HEAD + mDEFAULT_BUFFER_LEN ) // 默认数据长度加上命令结构头的长度
// CH341端点地址
#define mCH347_ENDP_DATA_UP 0x86 // CH347的数据块上传端点的地址
#define mCH347_ENDP_DATA_DOWN 0x06 // CH347的数据块下传端点的地址
// 设备层接口提供的管道操作命令
#define mPipeDeviceCtrl 0x00000004 // CH347的综合控制管道
#define mPipeDataUp 0x00000006 // CH347的数据块上传管道
#define mPipeDataDown 0x00000007 // CH347的数据块下传管道
// 应用层接口的功能代码
#define mFuncNoOperation 0x00000000 // 无操作
#define mFuncGetVersion 0x00000001 // 获取驱动程序版本号
#define mFuncGetConfig 0x00000002 // 获取USB设备配置描述符
#define mFuncSetTimeout 0x00000009 // 设置USB通讯超时
#define mFuncSetExclusive 0x0000000b // 设置独占使用
#define mFuncResetDevice 0x0000000c // 复位USB设备
#define mFuncResetPipe 0x0000000d // 复位USB管道
#define mFuncAbortPipe 0x0000000e // 取消USB管道的数据请求
#define mFuncBufferMode 0x00000020 // 设定缓冲上传模式及查询缓冲区中的数据长度
#define mFuncBufferModeDn 0x00000021 // 设定缓冲下传模式及查询缓冲区中的数据长度
#define mFuncGetVersionEx 0x00000022 // 获取驱动程序版本号及芯片型号
// USB设备标准请求代码
#define mUSB_CLR_FEATURE 0x01
#define mUSB_SET_FEATURE 0x03
#define mUSB_GET_STATUS 0x00
#define mUSB_SET_ADDRESS 0x05
#define mUSB_GET_DESCR 0x06
#define mUSB_SET_DESCR 0x07
#define mUSB_GET_CONFIG 0x08
#define mUSB_SET_CONFIG 0x09
#define mUSB_GET_INTERF 0x0a
#define mUSB_SET_INTERF 0x0b
#define mUSB_SYNC_FRAME 0x0c
// CH341控制传输的厂商专用请求类型
#define mCH341_VENDOR_READ 0xC0 // 通过控制传输实现的CH341厂商专用读操作
#define mCH341_VENDOR_WRITE 0x40 // 通过控制传输实现的CH341厂商专用写操作
#define mCH341A_CMD_I2C_STREAM 0xAA // I2C接口的命令包,从次字节开始为I2C命令流
#define mCH341A_CMD_UIO_STREAM 0xAB // UIO接口的命令包,从次字节开始为命令流
#define mCH341A_CMD_PIO_STREAM 0xAE // PIO接口的命令包,从次字节开始为数据流
// CH341A控制传输的厂商专用请求代码
#define mCH341A_BUF_CLEAR 0xB2 // 清除未完成的数据
#define mCH341A_I2C_CMD_X 0x54 // 发出I2C接口的命令,立即执行
#define mCH341A_DELAY_MS 0x5E // 以亳秒为单位延时指定时间
#define mCH341A_GET_VER 0x5F // 获取芯片版本
#define mCH341A_CMD_I2C_STM_STA 0x74 // I2C接口的命令流:产生起始位
#define mCH341A_CMD_I2C_STM_STO 0x75 // I2C接口的命令流:产生停止位
#define mCH341A_CMD_I2C_STM_OUT 0x80 // I2C接口的命令流:输出数据,位5-位0为长度,后续字节为数据,0长度则只发送一个字节并返回应答
#define mCH341A_CMD_I2C_STM_IN 0xC0 // I2C接口的命令流:输入数据,位5-位0为长度,0长度则只接收一个字节并发送无应答
#define mCH341A_CMD_I2C_STM_MAX ( min( 0x3F, mCH341_PACKET_LENGTH ) ) // I2C接口的命令流单个命令输入输出数据的最大长度
#define mCH341A_CMD_I2C_STM_SET 0x60 // I2C接口的命令流:设置参数,位2=SPI的I/O数(0=单入单出,1=双入双出),位1位0=I2C速度(00=低速,01=标准,10=快速,11=高速)
#define mCH341A_CMD_I2C_STM_US 0x40 // I2C接口的命令流:以微秒为单位延时,位3-位0为延时值
#define mCH341A_CMD_I2C_STM_MS 0x50 // I2C接口的命令流:以亳秒为单位延时,位3-位0为延时值
#define mCH341A_CMD_I2C_STM_DLY 0x0F // I2C接口的命令流单个命令延时的最大值
#define mCH341A_CMD_I2C_STM_END 0x00 // I2C接口的命令流:命令包提前结束
#define mCH341A_CMD_UIO_STM_IN 0x00 // UIO接口的命令流:输入数据D7-D0
#define mCH341A_CMD_UIO_STM_DIR 0x40 // UIO接口的命令流:设定I/O方向D5-D0,位5-位0为方向数据
#define mCH341A_CMD_UIO_STM_OUT 0x80 // UIO接口的命令流:输出数据D5-D0,位5-位0为数据
#define mCH341A_CMD_UIO_STM_US 0xC0 // UIO接口的命令流:以微秒为单位延时,位5-位0为延时值
#define mCH341A_CMD_UIO_STM_END 0x20 // UIO接口的命令流:命令包提前结束
#define MAX_DEVICE_PATH_SIZE 128 // 设备名称的最大字符数
#define MAX_DEVICE_ID_SIZE 64 // 设备ID的最大字符数
#endif _CH341_DLL_H
//驱动接口
#define CH347_USB_VENDOR 0
#define CH347_USB_HID 2
#define CH347_USB_VCP 3
//CH347_USB_VENDOR支持CH341/7
#define CHIP_TYPE_CH341 0
#define CHIP_TYPE_CH347 1
//芯片功能接口号
#define CH347_FUNC_UART 0
#define CH347_FUNC_SPI_IIC 1
#define CH347_FUNC_JTAG_IIC 2
#define DEFAULT_READ_TIMEOUT 500 //默认读超时毫秒数
#define DEFAULT_WRITE_TIMEOUT 500 //默认写超时毫秒数
#define mCH347_PACKET_LENGTH 512 // CH347支持的数据包的长度
#pragma pack(1)
//SPI控制器配置
typedef struct _SPI_CONFIG{
UCHAR iMode; // 0-3:SPI Mode0/1/2/3
UCHAR iClock; // 0=60MHz, 1=30MHz, 2=15MHz, 3=7.5MHz, 4=3.75MHz, 5=1.875MHz, 6=937.5KHz7=468.75KHz
UCHAR iByteOrder; // 0=低位在前(LSB), 1=高位在前(MSB)
USHORT iSpiWriteReadInterval; // SPI接口常规读取写入数据命令单位为uS
UCHAR iSpiOutDefaultData; // SPI读数据时默认输出数据
ULONG iChipSelect; // 片选控制, 位7为0则忽略片选控制, 位7为1则参数有效: 位1位0为00/01分别选择CS1/CS2引脚作为低电平有效片选
UCHAR CS1Polarity; // 位0片选CS1极性控制0低电平有效1高电平有效
UCHAR CS2Polarity; // 位0片选CS2极性控制0低电平有效1高电平有效
USHORT iIsAutoDeativeCS; // 操作完成后是否自动撤消片选
USHORT iActiveDelay; // 设置片选后执行读写操作的延时时间,单位us
ULONG iDelayDeactive; // 撤消片选后执行读写操作的延时时间,单位us
}mSpiCfgS,*mPSpiCfgS;
//设备信息
typedef struct _DEV_INFOR{
UCHAR iIndex; // 当前打开序号
UCHAR DevicePath[MAX_PATH]; // 设备链接名,用于CreateFile
UCHAR UsbClass; // 0:CH347_USB_CH341, 2:CH347_USB_HID,3:CH347_USB_VCP
UCHAR FuncType; // 0:CH347_FUNC_UART,1:CH347_FUNC_SPI_I2C,2:CH347_FUNC_JTAG_I2C
CHAR DeviceID[64]; // USB\VID_xxxx&PID_xxxx
UCHAR ChipMode; // 芯片模式,0:Mode0(UART0/1); 1:Mode1(Uart1+SPI+I2C); 2:Mode2(HID Uart1+SPI+I2C) 3:Mode3(Uart1+Jtag+IIC)
HANDLE DevHandle; // 设备句柄
USHORT BulkOutEndpMaxSize; // 上传端点大小
USHORT BulkInEndpMaxSize; // 下传端点大小
UCHAR UsbSpeedType; // USB速度类型0:FS,1:HS,2:SS
UCHAR CH347IfNum; // 设备接口号: 0:UART,1:SPI/IIC/JTAG/GPIO
UCHAR DataUpEndp; // 端点地址
UCHAR DataDnEndp; // 端点地址
CHAR ProductString[64]; // USB产品字符串
CHAR ManufacturerString[64]; // USB厂商字符串
ULONG WriteTimeout; // USB写超时
ULONG ReadTimeout; // USB读超时
CHAR FuncDescStr[64]; // 接口功能描述符
UCHAR FirewareVer; // 固件版本
}mDeviceInforS,*mPDeviceInforS;
#pragma pack()
// CH347模式公用函数,支持CH347所有模式下的打开、关闭、USB读、USB写包含HID
//打开USB设备
HANDLE WINAPI CH347OpenDevice(ULONG DevI);
//关闭USB设备
BOOL WINAPI CH347CloseDevice(ULONG iIndex);
//获取设备信息
BOOL WINAPI CH347GetDeviceInfor(ULONG iIndex,mDeviceInforS *DevInformation);
// 获得驱动版本、库版本、设备版本、芯片类型(CH341(FS)/CH347HS)
BOOL WINAPI CH347GetVersion(ULONG iIndex,
PUCHAR iDriverVer,
PUCHAR iDLLVer,
PUCHAR ibcdDevice,
PUCHAR iChipType); //CHIP_TYPE_CH341/7
typedef VOID ( CALLBACK * mPCH347_NOTIFY_ROUTINE ) ( // 设备事件通知回调程序
ULONG iEventStatus ); // 设备事件和当前状态(在下行定义): 0=设备拔出事件, 3=设备插入事件
#define CH347_DEVICE_ARRIVAL 3 // 设备插入事件,已经插入
#define CH347_DEVICE_REMOVE_PEND 1 // 设备将要拔出
#define CH347_DEVICE_REMOVE 0 // 设备拔出事件,已经拔出
BOOL WINAPI CH347SetDeviceNotify( // 设定设备事件通知程序
ULONG iIndex, // 指定设备序号,0对应第一个设备
PCHAR iDeviceID, // 可选参数,指向字符串,指定被监控的设备的ID,字符串以\0终止
mPCH347_NOTIFY_ROUTINE iNotifyRoutine ); // 指定设备事件回调程序,为NULL则取消事件通知,否则在检测到事件时调用该程序
// 读取USB数据块
BOOL WINAPI CH347ReadData( ULONG iIndex, // 指定设备序号
PVOID oBuffer, // 指向一个足够大的缓冲区,用于保存读取的数据
PULONG ioLength ); // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
// 写取USB数据块
BOOL WINAPI CH347WriteData(ULONG iIndex, // 指定设备序号
PVOID iBuffer, // 指向一个缓冲区,放置准备写出的数据
PULONG ioLength ); // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度
// 设置USB数据读写的超时
BOOL WINAPI CH347SetTimeout(ULONG iIndex, // 指定设备序号
ULONG iWriteTimeout, // USB,mS,0xFFFFFFFF()
ULONG iReadTimeout ); // 指定USB读取数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
/***************SPI********************/
// SPI控制器初始化
BOOL WINAPI CH347SPI_Init(ULONG iIndex,mSpiCfgS *SpiCfg);
//获取SPI控制器配置信息
BOOL WINAPI CH347SPI_GetCfg(ULONG iIndex,mSpiCfgS *SpiCfg);
//设置片选状态,使用前需先调用CH347SPI_Init对CS进行设置
BOOL WINAPI CH347SPI_ChangeCS(ULONG iIndex, // 指定设备序号
UCHAR iStatus); // 0=撤消片选,1=设置片选
//设置SPI片选
BOOL WINAPI CH347SPI_SetChipSelect(ULONG iIndex, // 指定设备序号
USHORT iEnableSelect, // 低八位为CS1高八位为CS2; 字节值为1=设置CS,为0=忽略此CS设置
USHORT iChipSelect, // 低八位为CS1高八位为CS2;片选输出,0=撤消片选,1=设置片选
ULONG iIsAutoDeativeCS, // 低16位为CS1高16位为CS2;操作完成后是否自动撤消片选
ULONG iActiveDelay, // 低16位为CS1高16位为CS2;设置片选后执行读写操作的延时时间,单位us
ULONG iDelayDeactive); // 低16位为CS1高16位为CS2;撤消片选后执行读写操作的延时时间,单位us
//SPI4写数据
BOOL WINAPI CH347SPI_Write(ULONG iIndex, // 指定设备序号
ULONG iChipSelect, // 片选控制, 位7为0则忽略片选控制, 位7为1进行片选操作
ULONG iLength, // 准备传输的数据字节数
ULONG iWriteStep, // 准备读取的单个块的长度
PVOID ioBuffer); // 指向一个缓冲区,放置准备从MOSI写出的数据
//SPI4读数据.无需先写数据效率较CH347SPI_WriteRead高很多
BOOL WINAPI CH347SPI_Read(ULONG iIndex, // 指定设备序号
ULONG iChipSelect, // 片选控制, 位7为0则忽略片选控制, 位7为1进行片选操作
ULONG oLength, // 准备发出的字节数
PULONG iLength, // 准备读入的数据字节数
PVOID ioBuffer); // 指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据
// 处理SPI数据流,4线接口
BOOL WINAPI CH347SPI_WriteRead(ULONG iIndex, // 指定设备序号
ULONG iChipSelect, // 片选控制, 位7为0则忽略片选控制, 位7为1则操作片选
ULONG iLength, // 准备传输的数据字节数
PVOID ioBuffer ); // 指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据
// 处理SPI数据流,4线接口
BOOL WINAPI CH347StreamSPI4(ULONG iIndex, // 指定设备序号
ULONG iChipSelect, // 片选控制, 位7为0则忽略片选控制, 位7为1则参数有效
ULONG iLength, // 准备传输的数据字节数
PVOID ioBuffer ); // 指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据
/***************JTAG********************/
//JTAG接口初始化设置模式及速度
BOOL WINAPI CH347Jtag_INIT(ULONG iIndex,
UCHAR iClockRate); //通信速度有效值为0-5值越大通信速度越快
//获取Jtag速度设置
BOOL WINAPI CH347Jtag_GetCfg(ULONG iIndex, // 指定设备序号
UCHAR *ClockRate); //通信速度有效值为0-5值越大通信速度越快
//位带方式JTAG IR/DR数据读写.适用于少量数据的读写。如指令操作、状态机切换等控制类传输。如批量数据传输建议使用CH347Jtag_WriteRead_Fast
//命令包以4096字节为单位批量读写
//状态机:Run-Test->Shift-IR/DR..->Exit IR/DR -> Run-Test
BOOL WINAPI CH347Jtag_WriteRead(ULONG iIndex, // 指定设备序号
BOOL IsDR, // =TRUE: DR数据读写,=FALSE:IR数据读写
ULONG iWriteBitLength, // 写长度,准备写出的长度
PVOID iWriteBitBuffer, // 指向一个缓冲区,放置准备写出的数据
PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的长度
PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
//JTAG IR/DR数据批量读写,用于多字节连续读写。如JTAG固件下载操作。因硬件有4K缓冲区如先写后读长度不超过4096字节。缓冲区大小可自行调整
//状态机:Run-Test->Shift-IR/DR..->Exit IR/DR -> Run-Test
BOOL WINAPI CH347Jtag_WriteRead_Fast(ULONG iIndex, // 指定设备序号
BOOL IsDR, // =TRUE: DR数据读写,=FALSE:IR数据读写
ULONG iWriteBitLength, // 写长度,准备写出的长度
PVOID iWriteBitBuffer, // 指向一个缓冲区,放置准备写出的数据
PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的长度
PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
//切换JTAG状态机
BOOL WINAPI CH347Jtag_SwitchTapState(UCHAR TapState);
//JTAG DR写,以字节为单位,用于多字节连续读写。如JTAG固件下载操作。
//状态机:Run-Test->Shift-DR..->Exit DR -> Run-Test
BOOL WINAPI CH347Jtag_ByteWriteDR(ULONG iIndex, // 指定设备序号
ULONG iWriteLength, // 写长度,准备写出的字节长度
PVOID iWriteBuffer); // 指向一个缓冲区,放置准备写出的数据
//JTAG DR读,以字节为单位,多字节连续读。
//状态机:Run-Test->Shift-DR..->Exit DR -> Run-Test
BOOL WINAPI CH347Jtag_ByteReadDR(ULONG iIndex, // 指定设备序号
PULONG oReadLength, // 指向长度单元,返回后为实际读取的字节长度
PVOID oReadBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
//JTAG IR写,以字节为单位,多字节连续写。
//状态机:Run-Test->Shift-IR..->Exit IR -> Run-Test
BOOL WINAPI CH347Jtag_ByteWriteIR(ULONG iIndex, // 指定设备序号
ULONG iWriteLength, // 写长度,准备写出的字节长度
PVOID iWriteBuffer); // 指向一个缓冲区,放置准备写出的数据
//JTAG IR读,以字节为单位,多字节连续读写。
//状态机:Run-Test->Shift-IR..->Exit IR -> Run-Test
BOOL WINAPI CH347Jtag_ByteReadIR(ULONG iIndex, // 指定设备序号
PULONG oReadLength, // 指向长度单元,返回后为实际读取的字节长度
PVOID oReadBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
//位带方式JTAG DR数据写.适用于少量数据的读写。如指令操作、状态机切换等控制类传输。如批量数据传输建议使用USB20Jtag_ByeWriteDR
//状态机:Run-Test->Shift-DR..->Exit DR -> Run-Test
BOOL WINAPI CH347Jtag_BitWriteDR(ULONG iIndex, // 指定设备序号
ULONG iWriteBitLength, // 指向长度单元,返回后为实际读取的字节长度
PVOID iWriteBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
//位带方式JTAG IR数据写.适用于少量数据的读写。如指令操作、状态机切换等控制类传输。如批量数据传输建议使用USB20Jtag_ByteWriteIR
//状态机:Run-Test->Shift-IR..->Exit IR -> Run-Test
BOOL WINAPI CH347Jtag_BitWriteIR(ULONG iIndex, // 指定设备序号
ULONG iWriteBitLength, // 指向长度单元,返回后为实际读取的字节长度
PVOID iWriteBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
//位带方式JTAG IR数据读.适用于少量数据的读写。如指令操作、状态机切换等。如批量数据传输建议使用USB20Jtag_ByteReadIR
//状态机:Run-Test->Shift-IR..->Exit IR -> Run-Test
BOOL WINAPI CH347Jtag_BitReadIR(ULONG iIndex, // 指定设备序号
PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的字节长度
PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
//位带方式JTAG DR数据读.适用于少量数据的读写。如批量和高速数据传输建议使用USB20Jtag_ByteReadDR
//状态机:Run-Test->Shift-DR..->Exit DR -> Run-Test
BOOL WINAPI CH347Jtag_BitReadDR(ULONG iIndex, // 指定设备序号
PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的字节长度
PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
//获取CH347的GPIO方向和引脚电平值
BOOL WINAPI CH347GPIO_Get(ULONG iIndex,
UCHAR *iDir, //引脚方向:GPIO0-7对应位0-7.0输入1输出
UCHAR *iData); //GPIO0电平:GPIO0-7对应位0-7,0低电平1高电平)
//设置CH347的GPIO方向和引脚电平值
BOOL WINAPI CH347GPIO_Set(ULONG iIndex,
UCHAR iEnable, //数据有效标志:对应位0-7,对应GPIO0-7.
UCHAR iSetDirOut, //设置I/O方向,某位清0则对应引脚为输入,某位置1则对应引脚为输出.GPIO0-7对应位0-7.
UCHAR iSetDataOut); //输出数据,如果I/O方向为输出,那么某位清0时对应引脚输出低电平,某位置1时对应引脚输出高电平
//进入IAP固件升级模式
BOOL WINAPI CH347StartIapFwUpate(ULONG iIndex,
ULONG FwSize); // 固件长度
/**************HID/VCP串口**********************/
//打开串口
HANDLE WINAPI CH347Uart_Open(ULONG iIndex);
//关闭串口
BOOL WINAPI CH347Uart_Close(ULONG iIndex);
BOOL WINAPI CH347Uart_SetDeviceNotify( // 设定设备事件通知程序
ULONG iIndex, // 指定设备序号,0对应第一个设备
PCHAR iDeviceID, // 可选参数,指向字符串,指定被监控的设备的ID,字符串以\0终止
mPCH347_NOTIFY_ROUTINE iNotifyRoutine ); // 指定设备事件回调程序,为NULL则取消事件通知,否则在检测到事件时调用该程序
//获取UART硬件配置
BOOL WINAPI CH347Uart_GetCfg(ULONG iIndex, // 指定设备序号
PULONG BaudRate, // 波特率
PUCHAR ByteSize, // (5,6,7,8,16)
PUCHAR Parity, // (0None; 1Odd; 2Even; 3Mark; 4Space)
PUCHAR StopBits, // 停止位数(01停止位; 11.5停止位; 22停止位)
PUCHAR ByteTimeout); //字节超时
//设置UART配置
BOOL WINAPI CH347Uart_Init(ULONG iIndex, // 指定设备序号
DWORD BaudRate, // 波特率
UCHAR ByteSize, // (5,6,7,8,16)
UCHAR Parity, // (0None; 1Odd; 2Even; 3Mark; 4Space)
UCHAR StopBits, // 停止位数(01停止位; 11.5停止位; 22停止位)
UCHAR ByteTimeout);// 字节超时时间,单位100uS
// 设置USB数据读写的超时
BOOL WINAPI CH347Uart_SetTimeout(ULONG iIndex, // 指定设备序号
ULONG iWriteTimeout, // USB,mS,0xFFFFFFFF()
ULONG iReadTimeout ); // 指定USB读取数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
// 读取数据块
BOOL WINAPI CH347Uart_Read(ULONG iIndex, // 指定设备序号
PVOID oBuffer, // 指向一个足够大的缓冲区,用于保存读取的数据
PULONG ioLength );// 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
// 写出数据块
BOOL WINAPI CH347Uart_Write(ULONG iIndex, // 指定设备序号
PVOID iBuffer, // 指向一个缓冲区,放置准备写出的数据
PULONG ioLength );// 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度
//查询读缓冲区有多少字节未取
BOOL WINAPI CH347Uart_QueryBufUpload(ULONG iIndex, // 指定设备序号
LONGLONG *RemainBytes);
//获取设备信息
BOOL WINAPI CH347Uart_GetDeviceInfor(ULONG iIndex,mDeviceInforS *DevInformation);
/********IIC***********/
// 设置串口流模式
BOOL WINAPI CH347I2C_Set(ULONG iIndex, // 指定设备序号
ULONG iMode ); // 指定模式,见下行
// 位1-位0: I2C接口速度/SCL频率, 00=低速/20KHz,01=标准/100KHz(默认值),10=快速/400KHz,11=高速/750KHz
// 其它保留,必须为0
// 设置硬件异步延时,调用后很快返回,而在下一个流操作之前延时指定毫秒数
BOOL WINAPI CH347I2C_SetDelaymS(ULONG iIndex, // 指定设备序号
ULONG iDelay ) ; // 指定延时的毫秒数
// 处理I2C数据流,2线接口,时钟线为SCL引脚,数据线为SDA引脚
BOOL WINAPI CH347StreamI2C( ULONG iIndex, // 指定设备序号
ULONG iWriteLength, // 准备写出的数据字节数
PVOID iWriteBuffer, // 指向一个缓冲区,放置准备写出的数据,首字节通常是I2C设备地址及读写方向位
ULONG iReadLength, // 准备读取的数据字节数
PVOID oReadBuffer ); // 指向一个缓冲区,返回后是读入的数据
#ifndef _CH341_DLL_H
typedef enum _EEPROM_TYPE {// EEPROM型号
ID_24C01,
ID_24C02,
ID_24C04,
ID_24C08,
ID_24C16,
ID_24C32,
ID_24C64,
ID_24C128,
ID_24C256,
ID_24C512,
ID_24C1024,
ID_24C2048,
ID_24C4096
} EEPROM_TYPE;
#endif
// 从EEPROM中读取数据块,速度约56K字节
BOOL WINAPI CH347ReadEEPROM(ULONG iIndex, // 指定设备序号
EEPROM_TYPE iEepromID, // 指定EEPROM型号
ULONG iAddr, // 指定数据单元的地址
ULONG iLength, // 准备读取的数据字节数
PUCHAR oBuffer ); // 指向一个缓冲区,返回后是读入的数据
// 向EEPROM中写入数据块
BOOL WINAPI CH347WriteEEPROM(ULONG iIndex, // 指定设备序号
EEPROM_TYPE iEepromID, // 指定EEPROM型号
ULONG iAddr, // 指定数据单元的地址
ULONG iLength, // 准备写出的数据字节数
PUCHAR iBuffer ); // 指向一个缓冲区,放置准备写出的数据
#ifdef __cplusplus
}
#endif
#endif // _CH347_DLL_H