USB2.0高速转接芯片CH347应用开发手册

CH347应用开发手册 V1.3

一、简介

CH347是一款USB2.0高速转接芯片,以实现USB-UART(HID串口/VCP串口)、USB-SPI、USB-I2C、USB-JTAG以及USB-GPIO等接口,分别包含在芯片的四种工作模式中。

CH347DLL用于为CH347芯片提供操作系统端的UART/SPI/I2C/JTAG/BitStream等接口操作函数,支持CH341厂商/HID/VCP驱动接口,使用时无需区分驱动接口和芯片工作模式。

二、接口说明

根据CH347所支持的USB转接接口特性,CH347DLL提供了USB-UART(HID串口/VCP串口)、USB-SPI、USB-I2C、USB-JTAG以及USB-GPIO的接口功能函数,包括基本功能函数与对应的功能函数,如EEPROM读写,JTAG应用中的SHIFT-DR状态读写等。

CH347所支持接口如下表所示,通过上电时MODE配置引脚电平组合来切换不同模式。

工作模式 功能接口说明 驱动接口 API
模式 0 接口 0:USB 转高速串口 0 CH343SER(VCP) 系统内原生串口 API 或CH347DLL 内 CH347UART_xxx
接口 1:USB 转高速串口 1
模式 1 接口 0:USB2.0 转高速串口 1 CH343SER(VCP) 系统内原生串口 API 或CH347DLL 内 CH347UART_xxx
接口 1: USB2.0 转 SPI+I2C CH347PAR CH347DLL 内 CH347SPI_xxx CH347I2C_xxx
模式 2 接口 0:USB2.0 HID 转高速串口 1 系统自带 HID 驱动 CH347UART_xxx
接口 1:USB2.0 HID 转 SPI+I2C CH347DLL 内 CH347SPI_xxx CH347I2C_xxx
模式 3 接口 0:USB2.0 转高速串口 1 CH343SER(VCP) 系统内原生串口 API 或CH347DLL 内 CH347UART_xxx
接口 1:USB2.0 转 JTAG+I2C CH347PAR CH347DLL 内 CH347JTAG_xxx CH347I2C_xxx

Table. CH347 接口功能 API 表

三、同步串行接口

3.1 相关数据类型 //驱动接口

c 复制代码
#define CH347_USB_CH341 0
#define CH347_USB_HID 2
#define CH347_USB_VCP 3 //芯片功能接口号
#define CH347_FUNC_UART 0
#define CH347_FUNC_SPI_IIC 1
#define CH347_FUNC_JTAG_IIC 2

3.1.1 SPI 控制器信息

c 复制代码
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.5KHz,7=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;

3.1.2 设备信息

c 复制代码
typedef struct _DEV_INFOR{
UCHAR    iIndex; // 当前打开序号
UCHAR    DevicePath[MAX_PATH];
UCHAR    UsbClass;               // 0:CH341 Vendor; 1:CH347 Vendor; 2:HID
UCHAR    FuncType;               // 0:UART1;        1:SPI+I2C; 2:JTAG+I2C
CHAR     DeviceID[64];           // USB\VID_xxxx&PID_xxxx
UCHAR    Mode;                   // 芯片模式,0: Mode0(UART*2);
1: Mode1(Uart1+SPI+I2C);
2: Mode2(HID Uart1+SPI+I2C)
3: Mode3(Uart1+Jtag+I2C)
HANDLE   DevHandle;              // 设备句柄
USHORT   BulkOutEndpMaxSize;     // 上传端点大小
USHORT   BulkInEndpMaxSize;      // 下传端点大小
UCHAR    UsbSpeedType;           // USB 速度类型,0:FS,1:HS,2:SS
UCHAR    CH347FuncType;          // USB 接口号
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

3.2 公共操作函数

3.2.1 CH347OpenDevice

功能描述

该函数用于打开 CH347 设备,支持 CH347 所有模式下的 SPI/I2C/JTAG 接口的打开

函数定义

c 复制代码
HANDLE  WINAPI
CH347OpenDevice( ULONG  DevI);

参数说明

DevI: 指定操作设备序号

返回值

执行成功返回设备序号

3.2.2 CH347CloseDevice

功能描述

该函数用于关闭 CH347 设备,支持 CH347 所有模式下 SPI/I2C/JTAG 接口的关闭

函数定义

c 复制代码
BOOL  WINAPI
CH347CloseDevice( ULONG  iIndex)

参数说明

iIndex: 指定操作设备序号

返回值

执行成功返回 1,失败返回 0

3.2.3 CH347SetDeviceNotify

功能描述

该函数用于指定设备事件通知程序,可用于 CH347 所有模式下 SPI/I2C/JTAG 接口的动

态插拔检测

函数定义

c 复制代码
BOOL  WINAPI
CH347SetDeviceNotify( ULONG     iIndex,
                      PCHAR     iDeviceID,
mPCH347_NOTIFY_ROUTINE     iNotifyRoutine)

参数说明

iIndex:指定操作设备序号

iDeviceID:可选参数,指向字符串,指定被监控的设备的 ID,字符串以\0 终止

iNotifyRoutine:指定设备事件回调程序,为 NULL 则取消事件通知,否则在检测到事件时调用该程序

返回值

执行成功返回 1,失败返回 0

注解

iDeviceID 该参数为可变参数,若需实现 CH347 设备的插拔检测,可定义宏如下

#define CH347DevID "VID_1A86&PID_55D\0"

传参时 iDeviceID 替换为 CH347DevID 即可实现对 CH347 同步串行接口的动态插拔检测

若需准确检测各模式下接口的插拔动作,可写下完整的 USBID,以模式 1 中 SPI 接口为例,可定义下方宏:

#define USBID_VEN_SPI_I2C "VID_1A86&PID_55DB&MI_02\0"

传参时 iDeviceID 替换为 USBID_VEN_SPI_I2C 即可实现对 CH347 模式 1 的 SPI&I2C 接口的动态插拔检测其他接口设置可参考 3.2.7 接口动态插拔检测

3.2.4 CH347GetDeviceInfor

功能描述

该函数用于获取设备当前接口模式、VID/PID 等信息

函数定义

c 复制代码
BOOL  WINAPI
CH347GetDeviceInfor(ULONG    iIndex,
mDeviceInforS    *DevInformation)

参数说明

iIndex:指定操作设备序号

DevInformation:设备信息结构体

返回值

执行成功返回 1,失败返回 0

注解

设备信息结构体,可参考_DEV_INFOR

3.2.5 CH347GetVersion

功能描述

该函数用于获得驱动版本、库版本、设备版本、芯片类型(CH341(FS)/CH347(HS))

函数定义

c 复制代码
BOOL  WINAPI
CH347GetVersion(ULONG    iIndex,
                PUCHAR   iDriverVer,
				PUCHAR   iDLLVer,
				PUCHAR   ibcdDevice,
				PUCHAR   iChipType)

参数说明

iIndex:指定操作设备序号

iDriverVer:驱动版本信息

iDLLVer:库版本信息

ibcdDevice:设备版本信息

iChipType:芯片类型

返回值

执行成功返回 1,失败返回 0

3.2.6 CH347SetTimeout

功能描述

该函数用于设置 USB 数据读写的超时

函数定义

c 复制代码
BOOL
WINAPI
CH347SetTimeout(ULONG    iIndex,
ULONG    iWriteTimeout,
ULONG    iReadTimeout )

参数说明

iIndex:指定操作设备序号

iWriteTimeout: 指定 USB 写出数据块的超时时间,以毫秒 mS 为单位,0xFFFFFFFF 指定不超时(默认值)

iReadTimeout: 指定 USB 读取数据块的超时时间,以毫秒 mS 为单位,0xFFFFFFFF 指定不超时(默认值)

返回值 执行成功返回 1,失败返回 0

3.2.7 接口动态插拔检测

检测同步串行接口动态插拔信息可通过 CH347SetDeviceNotify 函数来实现,代码参考如下:

启用 CH347 同步串行接口 USB 的插入和移除的监测:

CH347SetDeviceNotify(DevIndex, USBDevID, UsbDevPnpNotify);

关闭 CH347 同步串行接口 USB 的插入和移除的监测,在程序退出时一定要关闭。

CH347SetDeviceNotify(DevIndex, USBDevID, NULL); // CH347 设备插拔检测通知程序

c 复制代码
VOID
CALLBACK UsbDevPnpNotify (ULONG iEventStatus )
{
if(iEventStatus==CH347_DEVICE_ARRIVAL) // 设备插入事件,已经插入
PostMessage(DebugHwnd,WM_CH347DevArrive,0,0);
else if(iEventStatus==CH347_DEVICE_REMOVE) // 设备拔出事件,已经拔出
PostMessage(DebugHwnd,WM_CH347DevRemove,0,0);
return;
}

若需做到准确检测各模式下的 SPI/I2C/JTAG 接口插拔信息,可写下如下完整 USBID,在使用 CH347SetDeviceNotify 时将 iDeviceID 替换成相应的 USBID 宏即可。

c 复制代码
//MODE1  SPI/I2C
#define   USBID_VEN_Mode1_SPI_I2C  "VID_1A86&PID_55DB&MI_02\0"
//MODE2  SPI/I2C
#define   USBID_HID_Mode2_SPI_I2C   "VID_1A86&PID_55DC&MI_01\0"
//MODE3  JTAG/I2C
#define   USBID_VEN_Mode3_JTAG_I2C "VID_1A86&PID_55DA&MI_02\0"

3.2.8 设备枚举操作

在本接口库中,API 通过指定设备序号实现对应操作,设备序号是设备逐个插入的过程中,根据其插入顺序进行编号产生。实现设备枚举功能可以通过设备 Open 函数打开对应设备序号,根据函数返回值判断设备是否有效且存在。

其中 SPI/I2C/JTAG 接口的打开/关闭函数可用:CH347OpenDevice/CH347CloseDevice。

Figure 3.2.8 设备枚举操作流程图

3.3 SPI 功能函数

3.3.1 操作流程

打开设备后,设置设备 USB 读写超时参数,配置 SPI 控制器参数后进行 SPI 初始化设置,设置成功后即可通过调用 SPI 读写函数与设备进行通讯。

函数调用流程图如下:

Figure 3.3.1 SPI 函数操作流程图

函数具体说明请参考以下内容。

3.3.2 CH347SPI_Init

功能描述

该函数用于对 SPI 控制器进行参数配置

函数定义

c 复制代码
BOOL  WINAPI
CH347SPI_Init( ULONG	iIndex,
						mSpiCfgS    *SpiCfg)

参数说明

iIndex:指定操作设备序号

SpiCfg:SPI 控制器配置

返回值

执行成功返回 1,失败返回 0

注解

SPI 控制器配置可参考结构体_SPI_CONFIG

3.3.3 CH347SPI_GetCfg

功能描述

该函数用于获取 SPI 控制器当前配置

函数定义

c 复制代码
BOOL  WINAPI
CH347SPI_GetCfg( ULONG		iIndex,
				SpiCfgS    *SpiCfg)

参数说明

iIndex:指定操作设备序号

SpiCfg:SPI 控制器配置

返回值

执行成功返回 1,失败返回 0

注解

SPI 控制器配置可参考结构体_SPI_CONFIG

3.3.4 CH347SPI_ChangeCS

功能描述

该函数用于设置片选状态,使用前需先调用 CH347SPI_Init 对 CS 进行设置

函数定义

c 复制代码
BOOL  WINAPI
CH347SPI_ChangeCS( ULONG    iIndex,
					UCHAR    iStatus)

参数说明

iIndex:指定操作设备序号

iStatus:0=撤销片选,1=设置片选

返回值

执行成功返回 1,失败返回 0

3.3.5 CH347SPI_SetChipSelect

功能描述

该函数用于设置 SPI 片选

函数定义

c 复制代码
BOOL WINAPI
CH347SPI_SetChipSelect( ULONG     iIndex,
						USHORT		iEnableSelect,
						USHORT		iChipSelect,
						ULONG     iIsAutoDeativeCS,
						ULONG     iActiveDelay,
						ULONG     iDelayDeactive);

参数说明

iIndex:指定操作设备序号

iEnableSelect:低八位为 CS1,高八位为 CS2;字节值为 0=设置 CS,为 1=忽略此 CS 设置

iChipSelect:低八位为 CS1,高八位为 CS2;片选输出,0=撤消片选,1=设置片选

iIsAutoDeativeCS: 低 16 位为 CS1,高 16 位为 CS2;操作完成后是否自动撤消片选

iActiveDelay:低 16 位为 CS1,高 16 位为 CS2;设置片选后执行读写操作的延时时间,单位 uS

iDelayDeactive:低 16 位为 CS1,高 16 位为 CS2;撤消片选后执行读写操作的延时时间,单位 uS

返回值

执行成功返回 1,失败返回 0

3.3.6 CH347SPI_Write

功能描述

该函数用于 SPI 写数据

函数定义

c 复制代码
BOOL WINAPI
CH347SPI_Write( ULONG    iIndex,
				ULONG    iChipSelect,
				ULONG    iLength,
				ULONG    iWriteStep,
				PVOID    ioBuffer);

参数说明

iIndex:指定操作设备序号

iChipSelect: 片选控制, 位 7 为 0 则忽略片选控制, 位 7 为 1 进行片选操作

iLength:准备传输的数据字节数

iWriteStep:准备读取的单个块的长度

ioBuffer:指向一个缓冲区,放置准备从 MOSI 写出的数据

返回值

执行成功返回 1,失败返回 0

3.3.7 CH347SPI_Read

功能描述

该函数用于读取 SPI 数据

函数定义

c 复制代码
BOOL  WINAPI
CH347SPI_Read( ULONG     iIndex,
				ULONG     iChipSelect,
				ULONG     oLength,
				PULONG		iLength,
				PVOID		ioBuffer);

参数说明

iIndex:指定操作设备序号

iChipSelect: 片选控制, 位 7 为 0 则忽略片选控制, 位 7 为 1 进行片选操作

oLength:准备发出的数据字节数

iLength:准备读取的数据字长度

ioBuffer:指向一个缓冲区,放置准备从 MOSI 写出的数据,返回后是从 MISO 读入的数据

返回值

执行成功返回 1,失败返回 0

3.3.8 CH347SPI_WriteRead

功能描述

该函数用于写入和读取 SPI 数据流

函数定义

c 复制代码
BOOL  WINAPI
CH347SPI_WriteRead( ULONG     iIndex,
					ULONG	iChipSelect,
					ULONG	iLength,
					PVOID	ioBuffer );

参数说明

iIndex:指定操作设备序号

iChipSelect: 片选控制, 位 7 为 0 则忽略片选控制, 位 7 为 1 进行片选操作

iLength:准备传输的数据字节数

ioBuffer:指向一个缓冲区,放置准备从 MOSI 写出的数据,返回后是从 MISO 读入的数据

返回值

执行成功返回 1,失败返回 0

3.3.9 CH347StreamSPI4

功能描述

该函数用于处理 SPI 数据流,写入的同时读出数据

函数定义

c 复制代码
BOOL  WINAPI
CH347StreamSPI4(ULONG     iIndex,
				ULONG	iChipSelect,
				ULONG	iLength,
				PVOID	ioBuffer );

参数说明

iIndex:指定操作设备序号

iChipSelect: 片选控制, 位 7 为 0 则忽略片选控制, 位 7 为 1 进行片选操作

iLength:准备传输的字节数

ioBuffer:指向一个缓冲区,放置准备从 MOSI 写出的数据,返回后是从 MISO 读入的数据

返回值

执行成功返回 1,失败返回 0

3.4 JTAG 功能函数

3.4.1 操作流程

打开设备后,使用 CH347Jtag_INIT 对设备进行初始化操作;

使用 CH347Jtag_SwitchTapState(0)复位目标设备 JTAG TAP 状态为 Test-Logic-Reset状态,随后根据操作需求可使用对应函数切换到 SHIFT-DR/SHIFT-IR 状态进行读写操作,其中读写函数为位带方式读写与批量快速读写方式两种,可根据实际用途进行选择。

函数调用流程图如下:

Figure 3.4.1 JTAG 函数操作流程图

函数具体说明请参考以下内容。

3.4.2 CH347Jtag_INIT

功能描述

该函数用于初始化 JTAG 接口与设置通信速度

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_INIT( ULONG    iIndex,
				UCHAR    iClockRate);

参数说明

iIndex:指定操作设备序号

iClockRate:通信速度;有效值为 0-5,值越大通信速度越快

返回值

执行成功返回 1,失败返回 0

3.4.3 CH347Jtag_WriteRead

功能描述

该函数以位带方式进行 SHIFT-DR/IR 状态数据读写。适用于少量数据读写。如指令操作、状态机切换等控制类传输。如批量数据传输,建议使用 CH347Jtag_WriteRead_Fast 命令包以字节为单位进行批量读写。

函数定义

c 复制代码
BOOL
WINAPI
CH347Jtag_WriteRead(ULONG    iIndex,
BOOL     IsDR,
ULONG    iWriteBitLength,
PVOID    iWriteBitBuffer,
PULONG   oReadBitLength,
PVOID    oReadBitBuffer )

参数说明

iIndex:指定操作设备序号

IsDR:判断切换状态进行读写,

TRUE= SHIFT-DR 数据读写,FALSE=SHIFT-IR 数据读写

iWriteBitLength: 准备写出的数据长度

iWriteBitBuffer: 指向一个缓冲区,放置准备写出的数据

oReadBitLength:指向长度单元,返回后为实际读取的长度

oReadBitBuffer:指向一个足够大的缓冲区,用于保存读取的数据

返回值

执行成功返回 1,失败返回 0

注解

该函数通过 IsDR 的值来判断操作 JTAG 状态切换到 SHIFT-DR 还是 SHIFT-IR 状态,然后以位带的方式进行数据读写之后再切换回 RUN-TEST 状态,其状态切换路径如下:

Run-Test->Shift-IR/DR...->Exit IR/DR -> Run-Test

3.4.4 CH347Jtag_WriteRead_Fast

功能描述

该函数用于切换至 SHIFT-IR/DR 状态进行数据批量读写,用于多字节连续读写。如 JTAG固件下载操作。

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_WriteRead_Fast(ULONG
iIndex,
BOOL     IsDR,
ULONG
iWriteBitLength,
PVOID
iWriteBitBuffer,
PULONG oReadBitLength,
PVOID
oReadBitBuffer );

参数说明

iIndex:指定操作设备序号

IsDR:判断切换状态进行读写,

TRUE = SHIFT-DR 数据读写,FALSE = SHIFT-IR 数据读写

iWriteBitLength: 准备写出的数据长度

iWriteBitBuffer: 指向一个缓冲区,放置准备写出的数据

oReadBitLength:指向长度单元,返回后为实际读取的长度

oReadBitBuffer:指向一个足够大的缓冲区,用于保存读取的数据

返回值

执行成功返回 1,失败返回 0

注解

该函数功能与 CH347Jtag_WriteRead 相似,但该函数使用批量读写方式,以字节格式进

行数据读写。

3.4.5 CH347Jtag_SwitchTapState

功能描述

该函数用于切换 JTAG 状态机状态

函数定义

BOOL CH347Jtag_SwitchTapState(UCHAR TapState)

参数说明

TapState:通过输入序号进行状态切换

返回值

执行成功返回 1,失败返回 0

注解

TapState 状态切换说明如下:

0:复位目标设备状态为 Test-Logic Reset

1:跟随上一状态进入 Run-Test/Idle

2:Run-Test/Idle -> Shift-DR

3:Shift-DR -> Run-Test/Idle

4:Run-Test/Idle -> Shift-IR

5:Shift-IR -> Run-Test/Idle

6:Exit1-DR -> Run-Test-Idle

3.4.6 CH347Jtag_ByteWriteDR

功能描述

该函数用于将 JTAG 状态机切换到 SHIFT-DR 状态,以字节为单位,可进行多字节连续读写。

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_ByteWriteDR(ULONG    iIndex,
ULONG    iWriteLength,
PVOID    iWriteBuffer);

参数说明

iIndex:指定操作设备序号

iWriteLength: 准备写出数据的字节长度

iWriteBuffer: 指向一个缓冲区,放置准备写出的数据

返回值

执行成功返回 1,失败返回 0

3.4.7 CH347Jtag_ByteReadDR

功能描述

该函数用于将 JTAG 状态机切换到 SHIFT-DR 状态,以字节为单位,可进行多字节连续读写。

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_ByteReadDR( ULONG    iIndex,
PULONG   oReadLength,
PVOID    oReadBuffer);

参数说明

iIndex:指定操作设备序号

oReadLength: 准备读取数据的字节长度

oReadBuffer: 指向一个缓冲区,放置准备读取的数据

返回值

执行成功返回 1,失败返回 0

3.4.8 CH347Jtag_ByteWriteIR

功能描述

该函数用于将 JTAG 状态机切换到 SHIFT-IR 状态,以字节为单位,可进行多字节连续读写。

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_ByteWriteIR(ULONG
iIndex,
ULONG
iWriteLength,
PVOID
iWriteBuffer);

参数说明

iIndex:指定操作设备序号

iWriteLength: 准备写出数据的字节长度

iWriteBuffer: 指向一个缓冲区,放置准备写出的数据

返回值

执行成功返回 1,失败返回 0

3.4.9 CH347Jtag_ByteReadIR

功能描述

该函数用于将 JTAG 状态机切换到 SHIFT-IR 状态,以字节为单位,可进行多字节连续读写。

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_ByteReadIR(ULONG
iIndex,
PULONG
oReadLength,
PVOID
oReadBuffer);

参数说明

iIndex:指定操作设备序号

oReadLength: 准备读取数据的字节长度

oReadBuffer: 指向一个缓冲区,放置准备读取的数据

返回值

执行成功返回 1,失败返回 0

3.4.10 CH347Jtag_BitWriteDR

功能描述

该函数用于将 JTAG 状态机切换到 SHIFT-DR 状态,以位带方式进行数据读写。

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_BitWriteDR(ULONG
iIndex,
ULONG
iWriteLength,
PVOID
iWriteBuffer);

参数说明

iIndex:指定操作设备序号

iWriteLength: 准备写出数据的字节长度

iWriteBuffer: 指向一个缓冲区,放置准备写出的数据

返回值

执行成功返回 1,失败返回 0

3.4.11 CH347Jtag_BitWriteIR

功能描述

该函数用于将 JTAG 状态机切换到 SHIFT-IR 状态,以位带方式进行数据读写。

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_BitWriteIR(ULONG
iIndex,
ULONG
iWriteLength,
PVOID
iWriteBuffer);

参数说明

iIndex:指定操作设备序号

iWriteLength: 准备写出数据的字节长度

iWriteBuffer: 指向一个缓冲区,放置准备写出的数据

返回值

执行成功返回 1,失败返回 0

3.4.12 CH347Jtag_BitReadIR

功能描述

该函数用于将 JTAG 状态机切换到 SHIFT-IR 状态,以位带方式进行数据读写。

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_BitReadIR(ULONG
iIndex,
PULONG
oReadLength,
PVOID
oReadBuffer);

参数说明

iIndex:指定操作设备序号

oReadLength: 准备读取数据的字节长度

oReadBuffer: 指向一个缓冲区,放置准备读取的数据

返回值

执行成功返回 1,失败返回 0

3.4.13 CH347Jtag_BitReadDR

功能描述

该函数用于将 JTAG 状态机切换到 SHIFT-DR 状态,以字节为单位,可进行多字节连续读写。

函数定义

c 复制代码
BOOL  WINAPI
CH347Jtag_BitReadDR(ULONG
iIndex,
PULONG
oReadLength,
PVOID
oReadBuffer);

参数说明

iIndex:指定操作设备序号

oReadLength:准备读取数据的字节长度

oReadBuffer:指向一个缓冲区,放置准备读取的数据

返回值

执行成功返回 1,失败返回 0

3.5 I2C 功能函数

3.5.1 操作流程

打开指定操作设备获取设备序号,设置设备 I2C 接口速度/SCL 频率,进行 I2C 读写操作,函数调用流程图如下:

Figure 3.5.1 I2C 操作流程图

函数具体说明请参考以下内容。

3.5.2 相关数据类型

EEPROM 类型

c 复制代码
typedef enum
_EEPROM_TYPE {
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;

3.5.3 CH347I2C_Set

功能描述

该函数用于指定操作设备并设置 I2C 接口速度/SCL 频率

函数定义

c 复制代码
BOOL  WINAPI
CH347I2C_Set( ULONG    iIndex,
ULONG    iMode )

参数说明

iIndex:指定操作设备序号

iMode:设置模式

位 1-0: 00=低速/20KHz,01=标准/100KHz(默认值),

10=快速/400KHz,11=高速/750KHz

位 7-2: 保留为 0

返回值

执行成功返回 1,失败返回 0

3.5.4 CH347I2C_SetDelaymS

功能描述

该函数用于设置硬件异步延时,调用后很快返回,而在下一个流操作之前延时指定毫秒数

函数定义

c 复制代码
BOOL  WINAPI
CH347I2C_SetDelaymS(ULONG    iIndex,
ULONG    iDelay) ;

参数说明

iIndex:指定操作设备序号

iDelay:指定延时的毫秒数

返回值

执行成功返回 1,失败返回 0

3.5.5 CH347StreamI2C

功能描述

该函数用于处理 I2C 数据流,实现 I2C 数据的读取和写入

函数定义

c 复制代码
BOOL  WINAPI
CH347StreamI2C( ULONG    iIndex,
ULONG    iWriteLength,
PVOID    iWriteBuffer,
ULONG    iReadLength,
PVOID    oReadBuffer )

参数说明

iIndex:指定操作设备序号

iWriteLength: 准备写出的数据字节数

iWriteBuffer: 指向一个缓冲区,放置准备写出的数据,首字节通常是 I2C 设备地址及读写方向位,若地址长度超过 7 为则此字节仍可写入以此类推

iReadLength: 准备读取的数据字节数

oReadBuffer: 指向一个缓冲区,函数返回后为读入的数据

返回值

执行成功返回 1,失败返回 0

3.5.6 CH347ReadEEPROM

功能描述

该函数用于向 EEPROM 中读取数据块

函数定义

c 复制代码
BOOL  WINAPI
CH347ReadEEPROM(   ULONG
iIndex,
EEPROM_TYPE    iEepromID,
ULONG    iAddr,
ULONG    iLength,
PUCHAR   iBuffer )

参数说明

iIndex:指定操作设备序号

iEepromID:指定 EEPROM 型号

iAddr:指定数据单元的地址

iLength:准备读取的数据字节数

iBuffer:指向一个缓冲区,放置准备读取的数据

返回值

执行成功返回 1,失败返回 0

注解

iEepromID 所指定的型号可参考_EEPROM_TYPE

3.5.7 CH347WriteEEPROM

功能描述

该函数用于向 EEPROM 中写入数据块

函数定义

c 复制代码
BOOL  WINAPI
CH347WriteEEPROM(   ULONG    iIndex,
EEPROM_TYPE    iEepromID,
ULONG    iAddr,
ULONG    iLength,
PUCHAR   iBuffer )

参数说明

iIndex:指定操作设备序号

iEepromID:指定 EEPROM 型号

iAddr:指定数据单元的地址

iLength:准备写出的数据字节数

iBuffer:指向一个缓冲区,放置准备写出的数据

返回值

执行成功返回 1,失败返回 0

注解

iEepromID 所指定的型号可参考_EEPROM_TYPE

四、异步串行接口函数

4.1 公共函数

4.1.1 接口动态插拔检测

检测 CH347 UART 接口动态插拔信息可通过 CH347Uart_SetDeviceNotify 函数来实现,代码可参考 3.2.6 接口动态插拔检测。

启用 CH347 UART 串口 USB 的插入和移除的监测:

CH347Uart_SetDeviceNotify(DevIndex, USBUartDevID, UsbDevPnpNotify);关闭 CH347 UART 串口 USB 的插入和移除的监测,在程序退出时一定要关闭。

CH347Uart_SetDeviceNotify(DevIndex, USBUartDevID, NULL);监视的 USBUartDevID 可为如下字符串或自行定义 ID 内容.

c 复制代码
//MODE0 UART0
#define   USBID_VCP_Mode0_UART0   "VID_1A86&PID_55DA&MI_00\0"
//MODE0 UART1
#define   USBID_VCP_Mode0_UART1   "VID_1A86&PID_55DA&MI_01\0"
//MODE1 UART
#define USBID_VEN_Mode1_UART1   "VID_1A86&PID_55DB&MI_00\0"
//MODE2 UART
#define   USBID_HID_Mode2_UART1    "VID_1A86&PID_55DB&MI_00\0"
//MODE3 UART
#define   USBID_VEN_Mode3_UART1    "VID_1A86&PID_55DB&MI_00\0"

4.1.2 设备枚举操作

在本接口库中,API 通过指定设备序号实现对应操作,设备序号是设备逐个插入的过程中,根据其插入顺序进行编号产生。实现设备枚举功能可以通过设备 Open 函数打开对应设备序号,根据函数返回值判断设备是否有效或存在。

Figure 4.1.2 设备枚举操作流程图

4.2 HID/VCP UART 功能函数

4.2.1 操作流程

打开 设 备 后 , 使 用 CH347Uart_Open 函数 打 开 串 口 , 设 置 对 应 串 口 参 数 后 使 用CH347Uart_Init 函数进行串口设置,然后即可使用 CH347Uart_Write 或 CH347Uart_Read 函数实现串口数据收发。

Figure 4.2.1 HID 串口操作流程图

函数具体说明请参考以下内容。

4.2.2 CH347Uart_Open

功能描述

该函数用于打开 CH347 串口

函数定义

c 复制代码
HANDLE  WINAPI
CH347Uart_Open(ULONG  iIndex)

参数说明

iIndex:指定操作设备序号

返回值

执行成功返回 1,失败返回 0

4.2.3 CH347Uart_Close

功能描述

该函数用于关闭 CH347 串口

函数定义

c 复制代码
BOOL  WINAPI
CH347Uart_Close(ULONG  iIndex)

参数说明

iIndex:指定操作设备序号

返回值

执行成功返回 1,失败返回 0

4.2.4 CH347Uart_SetDeviceNotify

功能描述

该函数用于设定设备时间通知程序,可用于 CH347 UART 的动态插拔检测

函数定义

c 复制代码
BOOL  WINAPI
CH347Uart_SetDeviceNotify( ULONG    iIndex,
PCHAR    iDeviceID,
mPCH347_NOTIFY_ROUTINE
iNotifyRoutine )

参数说明

iIndex:指定操作设备序号

iDeviceID:可选参数,指向字符串,指定被监控的设备的 ID,字符串以\0 终止

iNotifyRoutine:指定设备事件回调程序,为 NULL 则取消事件通知,否则在检测到事件时调用该程序

返回值

执行成功返回 1,失败返回 0

4.2.5 CH347Uart_Init

功能描述

该函数用于初始化串口参数

函数定义

c 复制代码
BOOL  WINAPI
CH347Uart_Init( ULONG     iIndex,
DWORD
BaudRate,
UCHAR     ByteSize,
UCHAR
Parity,
UCHAR
StopBits,
UCHAR
ByteTimeout)

参数说明

iIndex:指定操作设备序号

BaudRate,:设置的波特率数值

ByteSize:数据位(5、6、7、8、16)

Parity:校验位(0:None; 1:Odd; 2:Even; 3:Mark; 4:Space)

StopBits:停止位数(0:停止位; 1:.5 停止位; 2:停止位)

ByteTimeout: 字节超时时间,单位 100uS

返回值

执行成功返回 1,失败返回 0

4.2.6 CH347Uart_SetTimeout

功能描述

该函数用于设置 USB 数据读写的超时时间

函数定义

c 复制代码
BOOL
WINAPI
CH347Uart_SetTimeout(ULONG
iIndex,
ULONG
iWriteTimeout,
ULONG
iReadTimeout )

参数说明

iIndex:指定操作设备序号

iWriteTimeout: 指定 USB 写出数据块的超时时间。以毫秒 mS 为单位。

0xFFFFFFFF 指定不超时(默认值)

iReadTimeout: 指定 USB 读取数据块的超时时间。以毫秒 mS 为单位。

0xFFFFFFFF 指定不超时(默认值)

返回值

执行成功返回 1,失败返回 0

4.2.7 CH347Uart_Read

功能描述

该函数用于读取串口数据

函数定义

c 复制代码
BOOL  WINAPI
CH347Uart_Read( ULONG
iIndex,
PVOID
oBuffer,
PULONG
ioLength )

参数说明

iIndex:指定操作设备序号

oBuffer:指向一个足够大的缓冲区,用于保存读取的数据

ioLength:指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度

返回值

执行成功返回 1,失败返回 0

4.2.8 CH347Uart_Write

功能描述

该函数用于发送串口数据

函数定义

c 复制代码
BOOL  WINAPI
CH347Uart_Write(ULONG
iIndex,
PVOID
iBuffer,
PULONG ioLength )

参数说明

iIndex:指定操作设备序号

iBuffer:指向一个缓冲区,放置准备写出的数据

ioLength:指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度

返回值

执行成功返回 1,失败返回 0

4.2.9 CH347Uart_QueryBufUpload

功能描述

该函数用于查询缓冲区还有多少字节未取出

函数定义

c 复制代码
BOOL WINAPI
CH347Uart_QueryBufUpload(ULONG      iIndex,
LONGLONG
*RemainBytes);

参数说明

iIndex:指定操作设备序号

RemainBytes: 返回当前缓冲区中未取出字节数量

返回值

执行成功返回 1,失败返回 0

4.3 GPIO 功能函数

4.3.1 操作流程

操作 GPIO 时可用 CH347OpenDevice/CH347Uart_Open 打开设备。

使用 CH347GPIO_Get 获取当前 GPIO 状态之后,根据操作需求使用 CH347GPIO_Set 设置GPIO 的输入输出状态。

实现 GPIO 控制和获取可调用 CH347GPIO_Set 和 CH347GPIO_Get 实现。

Figure 4.3.1 GPIO 操作流程图

函数具体说明请参考以下内容。

4.3.2 CH347GPIO_Get

功能描述

该函数用于获取设备当前的 GPIO 输入输出状态

函数定义

c 复制代码
BOOL  WINAPI
CH347GPIO_Get(ULONG    iIndex,
UCHAR
*iDir,
UCHAR    *iData)

参数说明

iIndex:指定操作设备序号

iDir:引脚方向:GPIO0-7 对应位 0-7.0:输入;1:输出

iData:GPIO 电平状态:GPIO 0-7 对应位 0-7,其中 0 表示低电平,1 表示高电平

返回值

执行成功返回 1,失败返回 0

4.3.3 CH347GPIO_Set

功能描述

该函数用于设置 CH347-GPIO 的 I/O 方向与输出状态

函数定义

c 复制代码
BOOL  WINAPI
CH347GPIO_Set(ULONG    iIndex,
UCHAR    iEnable,
UCHAR    iSetDirOut,
UCHAR
iSetDataOut)

参数说明

iIndex:指定操作设备序号

iEnable:数据有效标志:对应位 0-7,对应 GPIO0-7

iSetDirOut:设置 I/O 方向,某位清 0 则对应引脚为输入,某位置 1 则对应引脚为输出。GPIO0-7 对应位 0-7

iSetDataOut: 输出数据,如果 I/O 方向为输出,那么某位清 0 时对应引脚输出低电平,某位置 1 时对应引脚输出高电平

返回值

执行成功返回 1,失败返回 0

相关推荐
森焱森2 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白2 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D2 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术5 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt6 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘6 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang6 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
几个几个n8 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件
Despacito0o12 小时前
ESP32-s3摄像头驱动开发实战:从零搭建实时图像显示系统
人工智能·驱动开发·嵌入式硬件·音视频·嵌入式实时数据库
门思科技12 小时前
设计可靠 LoRaWAN 设备时需要考虑的关键能力
运维·服务器·网络·嵌入式硬件·物联网