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

news2024/9/8 23:08:51

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零散的面试题

★1.java常见的引用类型 强:普通的变量引用 软:内存够时,GC不会主动删除,内存不够时,GC会删除 弱:一旦执行GC就会被删除 虚:用了感觉没用 ★2.JDK1.8新特性 lambda表达式(极大简化了匿名内部类的创建,促进函数式编程的风格)函数式接口(只能有一个抽象方法的接口 )日…

什么是On-die Termination(ODT,片上端接)

在深入研究“片上端接”之前,让我们先了解一下“端接”的概念。为什么需要“端接”? 高速的数据传输速率和实时功能是电子设备的目标。这些共同的目标推动了电子设备不仅需要高速运行,而且还需要提供快速响应和实时性能,以满足各种…

欧阳修,仕途波澜中的文坛巨匠

欧阳修,字永叔,号醉翁、六一居士,生于北宋真宗景德四年(公元1007年),卒于北宋神宗熙宁五年(公元1072年),享年65岁。他是北宋时期著名的文学家、史学家,也是唐…

嘻嘻我是图床倒霉蛋

嘻嘻花了将近两个小时的时间配了一个小小的图床 手把手教你搭建阿里云图床(PicGoTypora阿里云OSS),新手小白一看就会-阿里云开发者社区 (aliyun.com) 大体上按照这篇配置就好 七牛云因为测试域名30天到期,用自己的得备案,所以比较麻烦,建议直接上阿里云 我买了一…

SVM-SMO算法

SMO算法思想 上面这个优化式子比较复杂,里面有m个变量组成的向量α𝛼需要在目标函数极小化的时候求出。直接优化时很难的。SMO算法则采用了一种启发式的方法。它每次只优化两个变量,将其他的变量都视为常数。由于 ∑ i 1 m α i y i 0 \su…

springboot与flowable(6):任务分配(监听器)

一、创建流程模型 制作如下流程 给审批用户1一个值表达式。 二、给用户审批2添加监听器 创建一个监听器类 package org.example.flowabledemo2.listener;import org.flowable.engine.delegate.TaskListener; import org.flowable.task.service.delegate.DelegateTask;/*** 自定…

【Spine学习05】之网格权重概念,以及让小臂动起来

上一节绑定好骨骼设置好了父级之后呢, 会发现操纵只有大臂能摆动,但是小臂以及手部无法K帧动起来。 所以这时候处理需要引入网格和权重的概念: 网格:在图片内设置多边形,操纵多边形顶点让图片变形 :启用按…

分布式技术导论 — 探索分析从起源到现今的巅峰之旅(分布式技术)

分析探索从起源到现今的巅峰之旅 背景介绍数据可伸缩性案例 计算可伸缩性案例 代价和权衡分布式的代价分布式的权衡权衡策略 分布式技术方向数据系统运算系统 分布式数据系统Partition(分区)Round-Robin(轮询)局限性 Range&#x…

【QT5】<重点> QT串口编程

目录 前言 一、串口编程步骤 0. 添加串口模块 1. 自动搜索已连接的串口 2. 创建串口对象 3. 初始化串口 4. 打开串口 5. 关闭串口 6. 发送数据 7. 接收数据 二、简易串口助手 1. 实现效果 2. 程序源码 3. 实现效果二 前言 本篇记录QT串口编程相关内容&#xff0…

半导体芯片结构以及译码驱动

一.半导体芯片结构 可能并不是只有一个芯片,有多个芯片就需要片选线了。 二.半导体存储芯片的译码驱动 主要有两种方式:线选法和重合法 线选法:每一个存储单元都用一根字选择线选中,直接选中存储单元的各位。(一维…

Codeforces Round 953 (Div. 2)(A~D题解)

这次比赛是我最顺利的一次比赛,也是成功在中途打进前1500,写完第三道题的时候也是保持在1600左右,但是后面就啥都不会了,还吃了点罚时,虽说如此也算是看到进步了,D题学长说很简单,但是我当时分析…

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程

Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs 基于之前的博客《使用LoRA微调Llama 2》的内容,我们深入研究了一种称为量化低秩调整(QLoRA)的参数高效微调&#xff0…

非常好用的7个Vue3组件库!!【送源码】

说到Vue,怎能不提Vue3呢? 它的大名鼎鼎主要归功于一项革命性的创新——Composition API。 这个新功能为逻辑复用带来了前所未有的友好性和灵活性,让开发者们在构建应用时如鱼得水。 如果你现在正在使用Vue3,或者在新的一年考虑…

reflutter工具实践之--xx一番赏app

此文章已经录制b站视频: flutter逆向案例-某某一番赏_哔哩哔哩_bilibili 一、工具介绍--reFlutter 这个框架帮助 Flutter 应用逆向工程,使用 Flutter 库的补丁版本,该版本已经编译并准备好重新打包应用。此库修改了快照反序列化过程&#…

SpringCloudNetflix组件整合

SpringCloudNetflix组件整合 Eureka注册中心 Eureka是什么 Eureka是netflix的一个子模块,也是核心模块之一,Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是…

“Dream Machine“震撼登场!免费推出的AI电影级巨制在网络上引爆热潮

"巅峰初现!视频AI新星‘梦幻制造者’华美登场! 在视频生成技术的赛道上,Luma AI昨日骄傲地揭开了其旗舰创新——梦幻制造者(Dream Machine)的神秘面纱,凭借无与伦比的文本到视频及图像到视频转换技术…

Cyber Weekly #11

赛博新闻 1、苹果召开2024年WWDC开发者大会 本周二(6月11日)凌晨1点,苹果召开2024年全球开发者大会,宣布与OpenAl合作,在iOS18、iPadOS18和macOS Sequoia中全面支持GPT-4o。用户在询问Siri问题时,Siri可以…

Oracle 入门--前提

目录 1.sqlplus 2.dual是什么? 3.SQL语句的种类 4.Oracle是如何工作的 5.Oracle查看配置文件 6.修改配置文件 7.常用的参数设置 1.sqlplus 管理数据库:启动,关闭,创建,删除对象......查看数据库的运行状态&…

01 - matlab m_map地学绘图工具基础函数理解(一)

01 - matlab m_map地学绘图工具基础函数理解(一) 0. 引言1. m_demo2. 小结 0. 引言 上篇介绍了m_map的配置过程,本篇开始介绍下m_map中涉及到的所有可调用函数。如果配置的没有问题,执行">>help m_map"可以看到类…

戴尔第十一代十二代十三代处理器重装系统找不到驱动程序

一、戴尔第十一代十二代十三代处理器重装系统找不到驱动程序 VMD(Volume Management Device)是针对下一代存储推出的部署方案。这套方案支持从 PCIe 总线对 NVMe 固态盘进行热升级和更换,而无需关闭系统,同时标准化 LED 管理可帮助…