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

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

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

相关文章

Linux_应用篇(17) FrameBuffer 应用编程

本章学习 Linux 下的 Framebuffer 应用编程, 通过对本章内容的学习, 大家将会了解到 Framebuffer 设备究竟是什么?以及如何编写应用程序来操控 FrameBuffer 设备。 本章将会讨论如下主题。 ⚫ 什么是 Framebuffer 设备? ⚫ LCD 显…

N32G031 ADC初始化

目录 1. ADC初始化概述 2. ADC初始化详细步骤 2.1 ADC配置 2.2 ADC初始化函数调用 2.3 DMA配置(可选) 3. 初始化结果验证 4. 注意事项 ADC采样注意事项 1. ADC初始化概述 在N32G031单片机中,ADC的初始化是确保ADC模块能够正常工作的…

安卓在Fragment控制状态栏显示隐藏

废话不多上效果 隐藏 显示 核心代码 首先是Framgrent package com.zx.tab;import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button;impor…

【redis】Redis的经典使用场景

目录 1.最常见——缓存2.数据共享分布式3.分布式锁4.全局ID5.计数器6.限流7.位统计8.购物车9.用户消息时间线timeline10.消息队列11.抽奖点赞、签到、打卡13.商品标签14.商品筛选15.用户关注、推荐模型16排行榜 1.最常见——缓存 数据类型:string例如:热…

给Windows软件添加异常捕获模块生成dump文件(附源码)

软件在运行过程中会时常发生内存越界、内存访问为例、stack overflow线程栈溢出、空指针与野指针等异常崩溃,仅仅是依靠Debug和Release下的调试是远远不够的,因为有些崩溃不是必现的,或者是Debug下很难出现的。所以我们需要在软件中添加异常捕获的模块,在捕获到异常时生成包…

C 语言连接MySQL 数据库

前提条件 本机安装MySQL 8 数据库 整体步骤 第一步:开启Windows 子系统安装Ubuntu 22.04.4,安装MySQL 数据库第三方库执行 如下命令: sudo aptitude install libmysqlclient-dev wz2012LAPTOP-8R0KHL88:/mnt/e/vsCode/cpro$ sudo aptit…

鸿蒙求职面试内容总结——6月3日ZR的FS项目

最近接到了一些公司的入职面试邀约,这里略去公司的和项目的名字,做一些整理分享。 一、长列表如何实现部分渲染,使用的是哪一个API 在鸿蒙系统中,可以使用List组件来实现长列表的部分渲染。List组件支持使用条件渲染、循环渲染、…

docker一些常用命令以及镜像构建完后部署到K8s上

docker一些常用命令以及镜像构建完后部署到K8s上 1.创建文件夹2.删除文件3.复制现有文件内容到新建文件4.打开某个文件5.查看文件列表6.解压文件(tar格式)7.解压镜像8.查看镜像9.删除镜像10.查看容器11.删除容器12.停止运行容器13.构建镜像14.启动容器15…

英伟达开源最强通用模型Nemotron-4 340B

英伟达的通用大模型 Nemotron,开源了最新的 3400 亿参数版本。 本周五,英伟达宣布推出 Nemotron-4 340B。它包含一系列开放模型,开发人员可以使用这些模型生成合成数据,用于训练大语言模型(LLM)&#xff0…

分布式系统中的经典思想实验——两将军问题和拜占庭将军问题

文章目录 一、两将军问题1.1 问题描述1.2 深入理解两将军问题1.3 实验结论 二、拜占庭将军问题2.1 问题描述2.2 深入理解拜占庭将军问题2.3 解决方案 三、两将军和拜占庭问题的关系3.1 区别和联系3.2 应用与现实意义 参考资料 一、两将军问题 1.1 问题描述 两将军问题描述的是…

el-pagination 切换分页条数,会出现两次请求

文章目录 前言一、问题展示二、源码展示 前言 继上一次发现el-pagination在删除的时候pageNum不更新的问题。这次又发现了,切换分页条数,会出现两次请求。网上有很多解决方案,我就不多说了,我就简单记一下为啥会出现两次请求的问…

21. 第21章 算法分析

21. 算法分析 这个附录选自OReilly Media出版的Alen B.Downey的Think Complexity(2012)一书. 当你读完本书之后, 可能会像继续读读那本书.算法分析是计算机科学的一个分支, 研究算法的性能, 尤其是他们的运行时间和空间需求. 参见http://en.wikipedia.org/wiki/Analysis_of_al…

Vue51-插件

一、插件的定义 vue里面的插件,类似于游戏的外挂。 vue中插件的本质:一个对象,里面必须包含install方法。 二、插件的使用 2-1、创建一个插件js文件(写在src中plugins.js) 2-2、应用插件:Vue.use(插件) …

机器真的能思考、学习和智能地行动吗?

In this post, were going to define what machine learning is and how computers think and learn. Were also going to look at some history relevant to the development of the intelligent machine. 在这篇文章中,我们将定义机器学习是什么,以及…

【Java03】Java中数组在内存中的机制

1. 内存中的数组 Java中的数组是一种引用类型,数组变量(引用)和数组元素在内存中是分开的。 Java中的数组变量其实就是指针。 如果想要访问数组元素,只能通过这个数组的引用变量(指针)来访问。 实际数组对…

【stm32-新建工程】

stm32-新建工程 ■ 下载相关STM32Cube官方固件包(F1,F4,F7,H7)■ 1. ST官方搜索STM32Cube■ 2. 搜索 STM32Cube■ 3. 点击获取软件■ 4. 选择对应的版本下载■ 5. 输入账号信息■ 6. 出现下载弹框,等待下载…

刚入职,写接口用了PUT和DELETE方法,结果被同事喷了,感觉自己被针对了

事情是这样,某社交平台上有个兄弟发帖,说自己刚入职国企,写了个借口,用了PUT和DELETE方法,前段说不能用这两个,这位仁兄感觉很委屈,特地发帖吐槽。 其实站在安全的角度来说,真没冤枉…

MySQL 示例数据库大全

前言: 我们练习 SQL 时,总会自己创造一些测试数据或者网上找些案例来学习,其实 MySQL 官方提供了好几个示例数据库,在 MySQL 的学习、开发和实践中具有非常重要的作用,能够帮助初学者更好地理解和应用 MySQL 的各种功…

云计算【第一阶段(14)】Linux的目录和结构

一、Liunx目录结构 1.1、linux目录结构 linux目录结构是树形目录结构 根目录(树根) 所有分区,目录,文件等的位置起点整个树形目录结构中,使用独立的一个"/",表示 1.2、常见的子目录 必须知道 目录路径目…

【探索Linux】P.34(HTTPS协议)

阅读导航 引言一、HTTPS是什么1. 什么是"加密"2. 为什么要加密3. 常见的加密方式(1)对称加密(2)非对称加密 二、证书认证1. CA认证 三、HTTPS的加密底层原理✅非对称加密对称加密证书认证 温馨提示 引言 在上一篇文章中…