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 转高速串口 0CH343SER(VCP)系统内原生串口 API 或CH347DLL 内 CH347UART_xxx
接口 1:USB 转高速串口 1
模式 1接口 0:USB2.0 转高速串口 1CH343SER(VCP)系统内原生串口 API 或CH347DLL 内 CH347UART_xxx
接口 1: USB2.0 转 SPI+I2CCH347PARCH347DLL 内 CH347SPI_xxx CH347I2C_xxx
模式 2接口 0:USB2.0 HID 转高速串口 1系统自带 HID 驱动CH347UART_xxx
接口 1:USB2.0 HID 转 SPI+I2CCH347DLL 内 CH347SPI_xxx CH347I2C_xxx
模式 3接口 0:USB2.0 转高速串口 1CH343SER(VCP)系统内原生串口 API 或CH347DLL 内 CH347UART_xxx
接口 1:USB2.0 转 JTAG+I2CCH347PARCH347DLL 内 CH347JTAG_xxx CH347I2C_xxx
Table. CH347 接口功能 API 表

三、同步串行接口

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

#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 控制器信息

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 则参数有效:1000/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 设备信息

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 接口的打开
函数定义

HANDLE  WINAPI
CH347OpenDevice( ULONG  DevI);

参数说明
DevI: 指定操作设备序号
返回值
执行成功返回设备序号

3.2.2 CH347CloseDevice

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

BOOL  WINAPI
CH347CloseDevice( ULONG  iIndex)

参数说明
iIndex: 指定操作设备序号
返回值
执行成功返回 1,失败返回 0

3.2.3 CH347SetDeviceNotify

功能描述
该函数用于指定设备事件通知程序,可用于 CH347 所有模式下 SPI/I2C/JTAG 接口的动
态插拔检测
函数定义

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 等信息
函数定义

BOOL  WINAPI
CH347GetDeviceInfor(ULONG    iIndex,
mDeviceInforS    *DevInformation)

参数说明
iIndex:指定操作设备序号
DevInformation:设备信息结构体
返回值
执行成功返回 1,失败返回 0
注解
设备信息结构体,可参考_DEV_INFOR

3.2.5 CH347GetVersion

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

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 数据读写的超时
函数定义

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 设备插拔检测通知程序

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 宏即可。

//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 读写函数与设备进行通讯。
函数调用流程图如下:
SPI 函数操作流程图

Figure 3.3.1 SPI 函数操作流程图

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

3.3.2 CH347SPI_Init

功能描述
该函数用于对 SPI 控制器进行参数配置
函数定义

BOOL  WINAPI
CH347SPI_Init( ULONG	iIndex,
						mSpiCfgS    *SpiCfg)

参数说明
iIndex:指定操作设备序号
SpiCfg:SPI 控制器配置
返回值
执行成功返回 1,失败返回 0
注解
SPI 控制器配置可参考结构体_SPI_CONFIG

3.3.3 CH347SPI_GetCfg

功能描述
该函数用于获取 SPI 控制器当前配置
函数定义

BOOL  WINAPI
CH347SPI_GetCfg( ULONG		iIndex,
				SpiCfgS    *SpiCfg)

参数说明
iIndex:指定操作设备序号
SpiCfg:SPI 控制器配置
返回值
执行成功返回 1,失败返回 0
注解
SPI 控制器配置可参考结构体_SPI_CONFIG

3.3.4 CH347SPI_ChangeCS

功能描述
该函数用于设置片选状态,使用前需先调用 CH347SPI_Init 对 CS 进行设置
函数定义

BOOL  WINAPI
CH347SPI_ChangeCS( ULONG    iIndex,
					UCHAR    iStatus)

参数说明
iIndex:指定操作设备序号
iStatus:0=撤销片选,1=设置片选
返回值
执行成功返回 1,失败返回 0

3.3.5 CH347SPI_SetChipSelect

功能描述
该函数用于设置 SPI 片选
函数定义

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 写数据
函数定义

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 数据
函数定义

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 数据流
函数定义

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 数据流,写入的同时读出数据
函数定义

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 状态进行读写操作,其中读写函数为位带方式读写与批量快速读写方式两种,可根据实际用途进行选择。
函数调用流程图如下:
JTAG 函数操作流程图

Figure 3.4.1 JTAG 函数操作流程图

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

3.4.2 CH347Jtag_INIT

功能描述
该函数用于初始化 JTAG 接口与设置通信速度
函数定义

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 命令包以字节为单位进行批量读写。
函数定义

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固件下载操作。
函数定义

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 状态,以字节为单位,可进行多字节连续读写。
函数定义

BOOL  WINAPI
CH347Jtag_ByteWriteDR(ULONG    iIndex,
ULONG    iWriteLength,
PVOID    iWriteBuffer);

参数说明
iIndex:指定操作设备序号
iWriteLength: 准备写出数据的字节长度
iWriteBuffer: 指向一个缓冲区,放置准备写出的数据
返回值
执行成功返回 1,失败返回 0

3.4.7 CH347Jtag_ByteReadDR

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

BOOL  WINAPI
CH347Jtag_ByteReadDR( ULONG    iIndex,
PULONG   oReadLength,
PVOID    oReadBuffer);

参数说明
iIndex:指定操作设备序号
oReadLength: 准备读取数据的字节长度
oReadBuffer: 指向一个缓冲区,放置准备读取的数据
返回值
执行成功返回 1,失败返回 0

3.4.8 CH347Jtag_ByteWriteIR

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

BOOL  WINAPI
CH347Jtag_ByteWriteIR(ULONG
iIndex,
ULONG
iWriteLength,
PVOID
iWriteBuffer);

参数说明
iIndex:指定操作设备序号
iWriteLength: 准备写出数据的字节长度
iWriteBuffer: 指向一个缓冲区,放置准备写出的数据
返回值
执行成功返回 1,失败返回 0

3.4.9 CH347Jtag_ByteReadIR

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

BOOL  WINAPI
CH347Jtag_ByteReadIR(ULONG
iIndex,
PULONG
oReadLength,
PVOID
oReadBuffer);

参数说明
iIndex:指定操作设备序号
oReadLength: 准备读取数据的字节长度
oReadBuffer: 指向一个缓冲区,放置准备读取的数据
返回值
执行成功返回 1,失败返回 0

3.4.10 CH347Jtag_BitWriteDR

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

BOOL  WINAPI
CH347Jtag_BitWriteDR(ULONG
iIndex,
ULONG
iWriteLength,
PVOID
iWriteBuffer);

参数说明
iIndex:指定操作设备序号
iWriteLength: 准备写出数据的字节长度
iWriteBuffer: 指向一个缓冲区,放置准备写出的数据
返回值
执行成功返回 1,失败返回 0

3.4.11 CH347Jtag_BitWriteIR

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

BOOL  WINAPI
CH347Jtag_BitWriteIR(ULONG
iIndex,
ULONG
iWriteLength,
PVOID
iWriteBuffer);

参数说明
iIndex:指定操作设备序号
iWriteLength: 准备写出数据的字节长度
iWriteBuffer: 指向一个缓冲区,放置准备写出的数据
返回值
执行成功返回 1,失败返回 0

3.4.12 CH347Jtag_BitReadIR

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

BOOL  WINAPI
CH347Jtag_BitReadIR(ULONG
iIndex,
PULONG
oReadLength,
PVOID
oReadBuffer);

参数说明
iIndex:指定操作设备序号
oReadLength: 准备读取数据的字节长度
oReadBuffer: 指向一个缓冲区,放置准备读取的数据
返回值
执行成功返回 1,失败返回 0

3.4.13 CH347Jtag_BitReadDR

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

BOOL  WINAPI
CH347Jtag_BitReadDR(ULONG
iIndex,
PULONG
oReadLength,
PVOID
oReadBuffer);

参数说明
iIndex:指定操作设备序号
oReadLength:准备读取数据的字节长度
oReadBuffer:指向一个缓冲区,放置准备读取的数据
返回值
执行成功返回 1,失败返回 0

3.5 I2C 功能函数

3.5.1 操作流程

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

Figure 3.5.1 I2C 操作流程图

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

3.5.2 相关数据类型

EEPROM 类型

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 频率
函数定义

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

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

BOOL  WINAPI
CH347I2C_SetDelaymS(ULONG    iIndex,
ULONG    iDelay) ;

参数说明
iIndex:指定操作设备序号
iDelay:指定延时的毫秒数
返回值
执行成功返回 1,失败返回 0

3.5.5 CH347StreamI2C

功能描述
该函数用于处理 I2C 数据流,实现 I2C 数据的读取和写入
函数定义

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 中读取数据块
函数定义

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 中写入数据块
函数定义

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 内容.

//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 函数实现串口数据收发。
HID 串口操作流程图

Figure 4.2.1 HID 串口操作流程图

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

4.2.2 CH347Uart_Open

功能描述
该函数用于打开 CH347 串口
函数定义

HANDLE  WINAPI
CH347Uart_Open(ULONG  iIndex)

参数说明
iIndex:指定操作设备序号
返回值
执行成功返回 1,失败返回 0

4.2.3 CH347Uart_Close

功能描述
该函数用于关闭 CH347 串口
函数定义

BOOL  WINAPI
CH347Uart_Close(ULONG  iIndex)

参数说明
iIndex:指定操作设备序号
返回值
执行成功返回 1,失败返回 0

4.2.4 CH347Uart_SetDeviceNotify

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

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

功能描述
该函数用于初始化串口参数
函数定义

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 数据读写的超时时间
函数定义

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

功能描述
该函数用于读取串口数据
函数定义

BOOL  WINAPI
CH347Uart_Read( ULONG
iIndex,
PVOID
oBuffer,
PULONG
ioLength )

参数说明
iIndex:指定操作设备序号
oBuffer:指向一个足够大的缓冲区,用于保存读取的数据
ioLength:指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
返回值
执行成功返回 1,失败返回 0

4.2.8 CH347Uart_Write

功能描述
该函数用于发送串口数据
函数定义

BOOL  WINAPI
CH347Uart_Write(ULONG
iIndex,
PVOID
iBuffer,
PULONG ioLength )

参数说明
iIndex:指定操作设备序号
iBuffer:指向一个缓冲区,放置准备写出的数据
ioLength:指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度
返回值
执行成功返回 1,失败返回 0

4.2.9 CH347Uart_QueryBufUpload

功能描述
该函数用于查询缓冲区还有多少字节未取出
函数定义

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 实现。
GPIO 操作流程图

Figure 4.3.1 GPIO 操作流程图

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

4.3.2 CH347GPIO_Get

功能描述
该函数用于获取设备当前的 GPIO 输入输出状态
函数定义

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 方向与输出状态
函数定义

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/714657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows11和Ubuntu22双系统安装指南

一、需求描述 台式机电脑,已有Windows11操作系统,想要安装Ubuntu22系统(版本任意)。其中Windows安装在Nvme固态上,Ubuntu安装在Sata固态上,双盘双系统。开机时使用Grub控制进入哪个系统,效果图…

Win10“始终使用此应用打开”不见了怎么办?

问题背景 真是服了,昨天家里停电把我电脑系统盘固态烧掉了,于是换了个新的固态给电脑装上新系统。结果这个版本的Win10系统居然无法修改默认应用。具体问题见下面两个图,以py文件为例。 图一:“选择打开方式时没有始终使用此应用…

大模型-人类病理学的语言视觉AI助手

论文摘要翻译与评论 论文标题: A Multimodal Generative AI Copilot for Human Pathology 摘要翻译: 计算病理学领域已经在任务特定的预测模型和任务无关的自监督视觉编码器的发展方面取得了显著进展。然而,尽管生成性人工智能快速增长&a…

史上最详细的轨迹优化教程-机器人避障及轨迹平滑实现(干货满满)

有一些朋友问我到底如何用优化方法实现轨迹优化(避障轨迹平滑等),今天就出一个干货满满的教程,绝对是面向很多工业化场景的讲解,为了便于理解,我选用二维平面并给出详细代码实现,三维空间原理相…

MySQL数据操作与查询- 聚合函数和分组查询

一、聚合函数 聚合函数主要用来进行数据 汇总 。 1、sum 返回选取的某列的总和。 语法: select sum(字段名) from 表名 where 条件表达式 2、max 返回选取的某列的最大值。 语法: select max(字段名) from 表名 where 条件表达式 3、min 返…

LoadBalance客户端负载均衡

1. 前言Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0…

VMware虚拟机linux无法使用ifconfig的解决方法

在有些linux系统中,输入ifconfig会报错,这是为什么呢? 如果出现 那是说明,你的linux内没有对应的命令。 具体可输入 ls /sbin 查看,发现其中确实没有ifconfig命令 这个解决很简单,在命令行输入 sudo apt-get inst…

DDPAI盯盯拍记录仪删除后的恢复方法(前后双路)

DDPAI盯盯拍行车记录仪的口碑相当不错,其产品一直以行车记录仪为主,曾经使用过比较早的产品,体验还不错。下面来看下这个DDPAI的视频恢复方法。 故障存储: 64G存储卡 /文件系统:FAT32 故障现象: 在发生事故后在记录仪上看到了…

OpenCV目标识别

一 图像轮廓 具有相同颜色或强度的连续点的曲线。 图像轮廓的作用 可以用于图像分析 物体的识别与检测 注意 为了检测的准确性,需要先对图像进行二值化或Canny操作。 画轮廓时会修改输入的图像。 轮廓查找的API findContours(img,mode,ApproximationMode,...)…

北航第六次数据结构与程序设计作业(查找与排序)选填题

一、 顺序查找的平均查找长度ASL(1 2 …… n)/ n (n 1)/ 2 二、 这半查找法的平均查找次数和判定树的深度有关系。若查找一个不存在的元素,说明进行了深度次比较。 注意,判定树不是满二叉树,因此深…

创新案例 | 3个关键策略:乳制品品牌认养一头牛如何通过私域流量运营获取1400万会员

探索认养一头牛如何运用创新的私域流量运营策略,在竞争激烈的乳制品市场中脱颖而出,实现会员数量的飞速增长至1400万。本文深入分析了其数据驱动的广告投放、高效的会员运营体系和创新的用户互动机制,为企业提供提升用户粘性和品牌忠诚度的宝…

Postgre 调优工具pgBadger部署

一,简介: pgBadger(日志分析器)类似于oracle的AWR报告(基于1小时,一天,一周,一月的报告),以图形化的方式帮助DBA更方便的找到隐含问题。 pgbadger是为了提高…

嵌入式数据库的一般架构

嵌入式数据库的架构与应用对象紧密相关,其架构是以内存、文件和网络等三种方式为主。 1.基于内存的数据库系统 基于内存的数据库系统中比较典型的产品是每个McObject公司的eXtremeDB嵌入式数据库,2013年3月推出5.0版,它采用内存数据结构&…

【Java】过滤器/拦截器

文章目录 两者区别request链路全过程 在实际开发中,过滤器和拦截器都是经常使用的技术,但一被提及到其区别时,整个人就愣住了,好像没有认真地对两者进行区别和总结,这两者之间也确实很容易混淆,因此结合了很…

python读取excel导入数据库

一、环境准备,安装包 pip install pandas openpyxl sqlalchemy二、数据准备 三、代码编写 from sqlalchemy import create_engine import pandas as pdclass GDPDataImporter:def __init__(self, db_type, dbapi, host, port, database, username, password):&quo…

【Git】基础操作

初识Git 版本控制的方式: 集中式版本控制工具:版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代码,是必须联网才能工作,局域网或者互联网。个人修改之后要提交到中央版本库 例如:SVM和…

Python(二)---数据类型与变量、以及运算符

文章目录 前言1.Python程序的构成1.1.代码的组织和缩进1.2.使用\行连接符 2.对象和引用、标识符规则2.1.对象2.2.引用2.3.标识符规则 3.变量和简单赋值语句3.1.变量的声明和赋值3.2.删除变量和垃圾回收机制3.3.常量3.4.链式赋值3.5.系列解包赋值 4.最基本内置数据类型4.1.数字和…

rclone 上传资料到 onedrive 遇到限速问题解决

原因分析 可能和脚本参数设置有关系,我的参数是: rclone copy "F:\阿里云盘\6666\局域网" "od:影视" --ignore-existing -u -v -P --transfers20 --ignore-errors --buffer-size128M --check-first --checkers10 --drive-acknowledge-abuse差不多8G大小的…

C#——值类型和引用类型的区别详情

值类型和引用类型的区别 值类型 值类型: 常用的基本数据类型都是值类型:bool 、char、int、 double、 float、long 、 byte 、ulong、uint、枚举类型、 结构体类型等特点: 在赋值的过程当中,把值的本身赋值给另一个变量,再修改…

关于STM32上用HID HOST调鼠标数据的解析

一、前言 关于这章主要是基于我前面的那篇文章 链接: 关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备(改进版) https://blog.csdn.net/qq_29187987/article/details/139535648?spm1001.2014.3001.5501 引用的文章的简介 引用的这篇文…