CH347DLL.H 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. #pragma warning(disable: 4828) // 禁用字符编码警告
  2. /*****************************************************************************
  3. ** Copyright (C) WCH 2001-2025 **
  4. ** Web: http://wch.cn **
  5. ******************************************************************************/
  6. // USB总线接口芯片CH341/7并口应用层接口库,CH347/9基于480Mbps高速USB总线扩展UART/SPI/I2C/JTAG/SWD
  7. // CH346基于480Mbps高速USB总线扩展UART/SPI SLAVE,UART/PARALLEL SLAVE
  8. // CH347-DLL V1.5
  9. // 运行环境: Windows 98/ME, Windows 2000/XP, WIN7/8/10/11,and later.
  10. // support USB chip: CH341, CH341A,CH347,CH339W
  11. // USB => Parallel, I2C, SPI, JTAG, SWD, PARALLEL,UART ...
  12. //Notes:
  13. //Copyright (C) 2025 Nanjing Qinheng Microelectronics Co., Ltd.
  14. #ifndef _CH347_DLL_H
  15. #define _CH347_DLL_H
  16. #ifdef __cplusplus
  17. extern "C" {
  18. #endif
  19. #ifdef _WIN64
  20. #define mOFFSET( s, m ) ( (ULONG_PTR) & ( ( ( s * ) 0 ) -> m ) ) // 定义获取结构成员相对偏移地址的宏
  21. #else
  22. #define mOFFSET( s, m ) ( (ULONG) & ( ( ( s * ) 0 ) -> m ) ) // 定义获取结构成员相对偏移地址的宏
  23. #endif
  24. #ifndef max
  25. #define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) // 较大值
  26. #endif
  27. #ifndef min
  28. #define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) // 较小值
  29. #endif
  30. #ifdef ExAllocatePool
  31. #undef ExAllocatePool // 删除带TAG的内存分配
  32. #endif
  33. #ifndef NTSTATUS
  34. typedef LONG NTSTATUS; // 返回状态
  35. #endif
  36. //与CH31DLL合用CH341WDM驱动
  37. #ifndef _CH341_DLL_H
  38. typedef struct _USB_SETUP_PKT { // USB控制传输的建立阶段的数据请求包结构
  39. UCHAR mUspReqType; // 00H 请求类型
  40. UCHAR mUspRequest; // 01H 请求代码
  41. union {
  42. struct {
  43. UCHAR mUspValueLow; // 02H 值参数低字节
  44. UCHAR mUspValueHigh; // 03H 值参数高字节
  45. };
  46. USHORT mUspValue; // 02H-03H 值参数
  47. };
  48. union {
  49. struct {
  50. UCHAR mUspIndexLow; // 04H 索引参数低字节
  51. UCHAR mUspIndexHigh; // 05H 索引参数高字节
  52. };
  53. USHORT mUspIndex; // 04H-05H 索引参数
  54. };
  55. USHORT mLength; // 06H-07H 数据阶段的数据长度
  56. } mUSB_SETUP_PKT, *mPUSB_SETUP_PKT;
  57. typedef struct _WIN32_COMMAND { // 定义WIN32命令接口结构
  58. union {
  59. ULONG mFunction; // 输入时指定功能代码或者管道号
  60. NTSTATUS mStatus; // 输出时返回操作状态
  61. };
  62. ULONG mLength; // 存取长度,返回后续数据的长度
  63. union {
  64. mUSB_SETUP_PKT mSetupPkt; // USB控制传输的建立阶段的数据请求
  65. UCHAR mBuffer[ 512]; // 数据缓冲区,长度为0至255B
  66. };
  67. } mWIN32_COMMAND, *mPWIN32_COMMAND;
  68. // WIN32应用层接口命令
  69. #define IOCTL_CH341_COMMAND ( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f34 << 2 | METHOD_BUFFERED ) // 专用接口
  70. #define mWIN32_COMMAND_HEAD mOFFSET( mWIN32_COMMAND, mBuffer ) // WIN32命令接口的头长度
  71. #define mCH341_MAX_NUMBER 32 // 最多同时连接的CH341/7设备数量
  72. #define mMAX_BUFFER_LENGTH 0x1000 // 数据缓冲区最大长度4096
  73. #define mMAX_COMMAND_LENGTH ( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH ) // 最大数据长度加上命令结构头的长度
  74. #define mDEFAULT_BUFFER_LEN 0x0400 // 数据缓冲区默认长度1024
  75. #define mDEFAULT_COMMAND_LEN ( mWIN32_COMMAND_HEAD + mDEFAULT_BUFFER_LEN ) // 默认数据长度加上命令结构头的长度
  76. // CH341端点地址
  77. #define mCH347_ENDP_DATA_UP 0x86 // CH347的数据块上传端点的地址
  78. #define mCH347_ENDP_DATA_DOWN 0x06 // CH347的数据块下传端点的地址
  79. // 设备层接口提供的管道操作命令
  80. #define mPipeDeviceCtrl 0x00000004 // CH347的综合控制管道
  81. #define mPipeDataUp 0x00000006 // CH347的数据块上传管道
  82. #define mPipeDataDown 0x00000007 // CH347的数据块下传管道
  83. // 应用层接口的功能代码
  84. #define mFuncNoOperation 0x00000000 // 无操作
  85. #define mFuncGetVersion 0x00000001 // 获取驱动程序版本号
  86. #define mFuncGetConfig 0x00000002 // 获取USB设备配置描述符
  87. #define mFuncSetTimeout 0x00000009 // 设置USB通讯超时
  88. #define mFuncSetExclusive 0x0000000b // 设置独占使用
  89. #define mFuncResetDevice 0x0000000c // 复位USB设备
  90. #define mFuncResetPipe 0x0000000d // 复位USB管道
  91. #define mFuncAbortPipe 0x0000000e // 取消USB管道的数据请求
  92. #define mFuncBufferMode 0x00000020 // 设定缓冲上传模式及查询缓冲区中的数据长度
  93. #define mFuncBufferModeDn 0x00000021 // 设定缓冲下传模式及查询缓冲区中的数据长度
  94. #define mFuncGetVersionEx 0x00000022 // 获取驱动程序版本号及芯片型号
  95. // USB设备标准请求代码
  96. #define mUSB_CLR_FEATURE 0x01
  97. #define mUSB_SET_FEATURE 0x03
  98. #define mUSB_GET_STATUS 0x00
  99. #define mUSB_SET_ADDRESS 0x05
  100. #define mUSB_GET_DESCR 0x06
  101. #define mUSB_SET_DESCR 0x07
  102. #define mUSB_GET_CONFIG 0x08
  103. #define mUSB_SET_CONFIG 0x09
  104. #define mUSB_GET_INTERF 0x0a
  105. #define mUSB_SET_INTERF 0x0b
  106. #define mUSB_SYNC_FRAME 0x0c
  107. // CH341控制传输的厂商专用请求类型
  108. #define mCH341_VENDOR_READ 0xC0 // 通过控制传输实现的CH341厂商专用读操作
  109. #define mCH341_VENDOR_WRITE 0x40 // 通过控制传输实现的CH341厂商专用写操作
  110. #define mCH341A_CMD_I2C_STREAM 0xAA // I2C接口的命令包,从次字节开始为I2C命令流
  111. #define mCH341A_CMD_UIO_STREAM 0xAB // UIO接口的命令包,从次字节开始为命令流
  112. #define mCH341A_CMD_PIO_STREAM 0xAE // PIO接口的命令包,从次字节开始为数据流
  113. // CH341A控制传输的厂商专用请求代码
  114. #define mCH341A_BUF_CLEAR 0xB2 // 清除未完成的数据
  115. #define mCH341A_I2C_CMD_X 0x54 // 发出I2C接口的命令,立即执行
  116. #define mCH341A_DELAY_MS 0x5E // 以亳秒为单位延时指定时间
  117. #define mCH341A_GET_VER 0x5F // 获取芯片版本
  118. #define mCH341A_CMD_I2C_STM_STA 0x74 // I2C接口的命令流:产生起始位
  119. #define mCH341A_CMD_I2C_STM_STO 0x75 // I2C接口的命令流:产生停止位
  120. #define mCH341A_CMD_I2C_STM_OUT 0x80 // I2C接口的命令流:输出数据,位5-位0为长度,后续字节为数据,0长度则只发送一个字节并返回应答
  121. #define mCH341A_CMD_I2C_STM_IN 0xC0 // I2C接口的命令流:输入数据,位5-位0为长度,0长度则只接收一个字节并发送无应答
  122. #define mCH341A_CMD_I2C_STM_MAX ( min( 0x3F, mCH341_PACKET_LENGTH ) ) // I2C接口的命令流单个命令输入输出数据的最大长度
  123. #define mCH341A_CMD_I2C_STM_SET 0x60 // I2C接口的命令流:设置参数,位2=SPI的I/O数(0=单入单出,1=双入双出),位1位0=I2C速度(00=低速,01=标准,10=快速,11=高速)
  124. #define mCH341A_CMD_I2C_STM_US 0x40 // I2C接口的命令流:以微秒为单位延时,位3-位0为延时值
  125. #define mCH341A_CMD_I2C_STM_MS 0x50 // I2C接口的命令流:以亳秒为单位延时,位3-位0为延时值
  126. #define mCH341A_CMD_I2C_STM_DLY 0x0F // I2C接口的命令流单个命令延时的最大值
  127. #define mCH341A_CMD_I2C_STM_END 0x00 // I2C接口的命令流:命令包提前结束
  128. #define mCH341A_CMD_UIO_STM_IN 0x00 // UIO接口的命令流:输入数据D7-D0
  129. #define mCH341A_CMD_UIO_STM_DIR 0x40 // UIO接口的命令流:设定I/O方向D5-D0,位5-位0为方向数据
  130. #define mCH341A_CMD_UIO_STM_OUT 0x80 // UIO接口的命令流:输出数据D5-D0,位5-位0为数据
  131. #define mCH341A_CMD_UIO_STM_US 0xC0 // UIO接口的命令流:以微秒为单位延时,位5-位0为延时值
  132. #define mCH341A_CMD_UIO_STM_END 0x20 // UIO接口的命令流:命令包提前结束
  133. #define MAX_DEVICE_PATH_SIZE 128 // 设备名称的最大字符数
  134. #define MAX_DEVICE_ID_SIZE 64 // 设备ID的最大字符数
  135. #endif _CH341_DLL_H
  136. // 驱动接口
  137. #define CH347_USB_VENDOR 0
  138. #define CH347_USB_HID 2
  139. #define CH347_USB_VCP 3
  140. // CH347_USB_VENDOR支持CH341/CH347T/CH347F/CH339W
  141. #define CHIP_TYPE_CH341 0
  142. #define CHIP_TYPE_CH347 1
  143. #define CHIP_TYPE_CH347F 2
  144. #define CHIP_TYPE_CH339W 3
  145. #define CHIP_TYPE_CH347T CHIP_TYPE_CH347
  146. // 芯片功能接口类型
  147. #define CH347_FUNC_UART 0
  148. #define CH347_FUNC_SPI_IIC 1
  149. #define CH347_FUNC_JTAG_IIC 2
  150. #define CH347_FUNC_JTAG_IIC_SPI 3 // CH347F同时支持SPI\I2C\JTAG接口
  151. #define DEFAULT_READ_TIMEOUT 500 // 默认读超时毫秒数
  152. #define DEFAULT_WRITE_TIMEOUT 500 // 默认写超时毫秒数
  153. #define mCH347_PACKET_LENGTH 512 // CH347支持的数据包的长度
  154. #pragma pack(1)
  155. //SPI控制器配置
  156. typedef struct _SPI_CONFIG{
  157. UCHAR iMode; // 0-3:SPI Mode0/1/2/3
  158. UCHAR iClock; // 0=60MHz, 1=30MHz, 2=15MHz, 3=7.5MHz, 4=3.75MHz, 5=1.875MHz, 6=937.5KHz,7=468.75KHz
  159. UCHAR iByteOrder; // 0=低位在前(LSB), 1=高位在前(MSB)
  160. USHORT iSpiWriteReadInterval; // SPI接口常规读取写入数据命令,单位为uS
  161. UCHAR iSpiOutDefaultData; // SPI读数据时默认输出数据
  162. ULONG iChipSelect; // 片选控制, 位7为0则忽略片选控制, 位7为1则参数有效: 位1位0为00/01分别选择CS1/CS2引脚作为低电平有效片选
  163. UCHAR CS1Polarity; // 位0:片选CS1极性控制:0:低电平有效;1:高电平有效;
  164. UCHAR CS2Polarity; // 位0:片选CS2极性控制:0:低电平有效;1:高电平有效;
  165. USHORT iIsAutoDeativeCS; // 操作完成后是否自动撤消片选
  166. USHORT iActiveDelay; // 设置片选后执行读写操作的延时时间,单位us
  167. ULONG iDelayDeactive; // 撤消片选后执行读写操作的延时时间,单位us
  168. }mSpiCfgS,*mPSpiCfgS;
  169. //设备信息
  170. typedef struct _DEV_INFOR{
  171. UCHAR iIndex; // 当前打开序号
  172. UCHAR DevicePath[MAX_PATH]; // 设备链接名,用于CreateFile
  173. UCHAR UsbClass; // 驱动类别 0:CH347_USB_CH341, 2:CH347_USB_HID, 3:CH347_USB_VCP
  174. UCHAR FuncType; // 功能类别 0:CH347_FUNC_UART, 1:CH347_FUNC_SPI_I2C, 2:CH347_FUNC_JTAG_I2C, 3:CH347_FUNC_JTAG_IIC_SPI
  175. CHAR DeviceID[64]; // USB\VID_xxxx&PID_xxxx
  176. UCHAR ChipMode; // 芯片工作模式,0:Mode0(UART0/1); 1:Mode1(Uart1+SPI+I2C); 2:Mode2(HID Uart1+SPI+I2C) 3:Mode3(Uart1+Jtag) 4:CH347F(Uart*2+Jtag/SPI/IIC)
  177. HANDLE DevHandle; // 设备句柄
  178. USHORT BulkOutEndpMaxSize; // 批量上传端点大小
  179. USHORT BulkInEndpMaxSize; // 批量下传端点大小
  180. UCHAR UsbSpeedType; // USB速度类型,0:FS,1:HS,2:SS
  181. UCHAR CH347IfNum; // USB接口号 CH347T: MODE0: 0:UART0; 2:UART1
  182. // MODE1: 0:UART1; 2:SPI/IIC/GPIO
  183. // MODE2: 0:UART0; 1:SPI/IIC/GPIO
  184. // MODE3: 0:UART1; 2:JTAG
  185. // CH347F: 0:UART0; 2:UART1; 4:SPI/IIC/JTAG/GPIO
  186. // CH339W: 0:UART; 2:SPI/IIC/JTAG
  187. UCHAR DataUpEndp; // 批量上传端点地址
  188. UCHAR DataDnEndp; // 批量下传端点地址
  189. CHAR ProductString[64]; // USB产品字符串
  190. CHAR ManufacturerString[64]; // USB厂商字符串
  191. ULONG WriteTimeout; // USB写超时
  192. ULONG ReadTimeout; // USB读超时
  193. CHAR FuncDescStr[64]; // 接口功能描述符
  194. UCHAR FirewareVer; // 固件版本,十六进制值
  195. }mDeviceInforS,*mPDeviceInforS;
  196. #pragma pack()
  197. // CH347各模式公用函数,支持CH347所有模式下的打开、关闭、USB读、USB写,包含HID
  198. //打开USB设备
  199. HANDLE WINAPI CH347OpenDevice(ULONG DevI); // 指定设备序号
  200. //关闭USB设备
  201. BOOL WINAPI CH347CloseDevice(ULONG iIndex); // 指定设备序号
  202. // 获取设备USB序列号
  203. BOOL WINAPI CH347GetSerialNumber(ULONG iIndex, // 指定设备序号
  204. PUCHAR iSerialNumberStr); // 指向获取到的设备序列号
  205. // 获取设备信息
  206. BOOL WINAPI CH347GetDeviceInfor(ULONG iIndex, // 指定设备序号
  207. mDeviceInforS *DevInformation); // 指向获取到的设备信息
  208. // 获取CH347芯片类型:0:CHIP_TYPE_CH341;1:CHIP_TYPE_CH347/CHIP_TYPE_CH347T,2:CHIP_TYPE_CH347F;3:CHIP_TYPE_CH339W
  209. UCHAR WINAPI CH347GetChipType(ULONG iIndex ); // 指定设备序号
  210. // 获取驱动版本、库版本、设备版本、芯片类型(CH341(FS)/CH347HS)
  211. BOOL WINAPI CH347GetVersion(ULONG iIndex,
  212. PUCHAR iDriverVer,
  213. PUCHAR iDLLVer,
  214. PUCHAR ibcdDevice,
  215. PUCHAR iChipType); //CHIP_TYPE_CH341/7
  216. typedef VOID ( CALLBACK * mPCH347_NOTIFY_ROUTINE ) ( // 设备插拔通知事件回调程序
  217. ULONG iEventStatus ); // 设备插拔事件和当前状态(在下行定义): 0=设备拔出事件, 3=设备插入事件
  218. #define CH347_DEVICE_ARRIVAL 3 // 设备插入事件,已经插入
  219. #define CH347_DEVICE_REMOVE_PEND 1 // 设备将要拔出
  220. #define CH347_DEVICE_REMOVE 0 // 设备拔出事件,已经拔出
  221. // 设定设备事件通知程序
  222. BOOL WINAPI CH347SetDeviceNotify(ULONG iIndex, // 指定设备序号,0对应第一个设备
  223. PCHAR iDeviceID, // 可选参数,指向字符串,指定被监控的设备的ID,字符串以\0终止
  224. mPCH347_NOTIFY_ROUTINE iNotifyRoutine ); // 指定设备事件回调程序,为NULL则取消事件通知,否则在检测到事件时调用该程序
  225. // 读取USB数据块
  226. BOOL WINAPI CH347ReadData( ULONG iIndex, // 指定设备序号
  227. PVOID oBuffer, // 指向一个足够大的缓冲区,用于保存读取的数据
  228. PULONG ioLength ); // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
  229. // 写取USB数据块
  230. BOOL WINAPI CH347WriteData(ULONG iIndex, // 指定设备序号
  231. PVOID iBuffer, // 指向一个缓冲区,放置准备写出的数据
  232. PULONG ioLength ); // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度
  233. // 设置USB数据读写的超时
  234. BOOL WINAPI CH347SetTimeout(ULONG iIndex, // 指定设备序号
  235. ULONG iWriteTimeout, // 指定USB写出数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  236. ULONG iReadTimeout ); // 指定USB读取数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  237. /***************SPI********************/
  238. // SPI控制器初始化
  239. BOOL WINAPI CH347SPI_Init(ULONG iIndex, // 指定设备序号
  240. mSpiCfgS *SpiCfg); // 指向SPI配置结构体
  241. // 设置SPI时钟频率,调用该接口后需重新调用CH347SPI_Init进行初始化
  242. // 支持时钟频率如下(若设置频率无对应则就近选择):
  243. // 60 MHz, 48 MHz, 36 MHz, 30 MHz, 28 MHz, 24 MHz, 18 MHz, 15 MHz, 14 MHz, 12 MHz, 9 MHz, 7.5 MHz,
  244. // 7 MHz, 6 MHz, 4.5 MHz, 3.75 MHz, 3.5 MHz, 3 MHz, 2.25 MHz, 1.875 MHz, 1.75 MHz, 1.5 MHz, 1.125 MHz,
  245. // 937.5 KHz, 875 KHz, 750 KHz, 562.5 KHz, 468.75 KHz, 437.5 KHz, 375 KHz, 281.25 KHz, 218.75 KHz
  246. BOOL WINAPI CH347SPI_SetFrequency(ULONG iIndex, // 指定设备序号
  247. ULONG iSpiSpeedHz);// 设置SPI时钟,单位为HZ
  248. // 设置SPI数据位数
  249. BOOL WINAPI CH347SPI_SetDataBits(ULONG iIndex, // 指定设备序号
  250. UCHAR iDataBits); // 0=8bit,1=16bit
  251. // 获取SPI控制器配置信息
  252. BOOL WINAPI CH347SPI_GetCfg(ULONG iIndex,mSpiCfgS *SpiCfg);
  253. // 设置片选状态,使用前需先调用CH347SPI_Init对CS进行设置
  254. BOOL WINAPI CH347SPI_ChangeCS(ULONG iIndex, // 指定设备序号
  255. UCHAR iStatus); // 0=撤消片选,1=设置片选
  256. // 设置SPI片选
  257. BOOL WINAPI CH347SPI_SetChipSelect(ULONG iIndex, // 指定设备序号
  258. USHORT iEnableSelect, // 低八位为CS1,高八位为CS2; 字节值为1=设置CS,为0=忽略此CS设置
  259. USHORT iChipSelect, // 低八位为CS1,高八位为CS2;片选输出,0=撤消片选,1=设置片选
  260. ULONG iIsAutoDeativeCS, // 低16位为CS1,高16位为CS2;操作完成后是否自动撤消片选
  261. ULONG iActiveDelay, // 低16位为CS1,高16位为CS2;设置片选后执行读写操作的延时时间,单位us
  262. ULONG iDelayDeactive); // 低16位为CS1,高16位为CS2;撤消片选后执行读写操作的延时时间,单位us
  263. // SPI4写数据
  264. BOOL WINAPI CH347SPI_Write(ULONG iIndex, // 指定设备序号
  265. ULONG iChipSelect, // 片选控制, 位7为0则忽略片选控制, 位7为1进行片选操作
  266. ULONG iLength, // 准备传输的数据字节数
  267. ULONG iWriteStep, // 准备读取的单个块的长度
  268. PVOID ioBuffer); // 指向一个缓冲区,放置准备从MOSI写出的数据
  269. // SPI4读数据.无需先写数据,效率较CH347SPI_WriteRead高很多
  270. BOOL WINAPI CH347SPI_Read(ULONG iIndex, // 指定设备序号
  271. ULONG iChipSelect, // 片选控制, 位7为0则忽略片选控制, 位7为1进行片选操作
  272. ULONG oLength, // 准备发出的字节数
  273. PULONG iLength, // 准备读入的数据字节数
  274. PVOID ioBuffer); // 指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据
  275. // 处理SPI数据流,4线接口
  276. BOOL WINAPI CH347SPI_WriteRead(ULONG iIndex, // 指定设备序号
  277. ULONG iChipSelect, // 片选控制, 位7为0则忽略片选控制, 位7为1则操作片选
  278. ULONG iLength, // 准备传输的数据字节数
  279. PVOID ioBuffer ); // 指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据
  280. // 处理SPI数据流,4线接口
  281. BOOL WINAPI CH347StreamSPI4(ULONG iIndex, // 指定设备序号
  282. ULONG iChipSelect, // 片选控制, 位7为0则忽略片选控制, 位7为1则参数有效
  283. ULONG iLength, // 准备传输的数据字节数
  284. PVOID ioBuffer ); // 指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据
  285. /***************JTAG********************/
  286. // JTAG接口初始化,设置JTAG通信速度
  287. BOOL WINAPI CH347Jtag_INIT(ULONG iIndex, // 指定设备序号
  288. UCHAR iClockRate); // 通信速度;0=468.75KHz,1=937.5KHz,2=1.875MHz,3=3.75MHz,4=7.5MHz,5=15MHz,6=30MHz,7=60MHz
  289. // 获取Jtag速度设置
  290. BOOL WINAPI CH347Jtag_GetCfg(ULONG iIndex, // 指定设备序号
  291. UCHAR *ClockRate); // 通信速度;有效值为0-7,值越大通信速度越快
  292. // 改变TMS的值来进行状态切换
  293. BOOL WINAPI CH347Jtag_TmsChange(ULONG iIndex, // 设备序号
  294. PUCHAR tmsValue, // 进行切换的TMS位值,以字节为单位
  295. ULONG Step, // tmsValue内存储的TMS有效位数
  296. ULONG Skip); // 有效起始位
  297. // 在Shift-DR/IR状态进行读写,执行完切至Exit DR/IR
  298. // 状态机:Shift-DR/IR.RW.->Exit DR/IR
  299. BOOL WINAPI CH347Jtag_IoScan(ULONG iIndex,
  300. PUCHAR DataBits, //需要进行传输的数据位
  301. ULONG DataBitsNb, //需要传输数据的位数
  302. BOOL IsRead); //是否需要读取数据
  303. // 切至Shift-DR/IR状态进行读写,执行完成后,如是最后一包,则切换状态至Exit DR/IR;如果不是,则停在Shift-DR/IR状态
  304. // 状态机:Shift-DR/IR.RW..->[Exit DR/IR]
  305. BOOL WINAPI CH347Jtag_IoScanT(ULONG iIndex, // 指定设备序号
  306. PUCHAR DataBits, // 需要进行传输的数据位
  307. ULONG DataBitsNb, // 需要传输数据的位数
  308. BOOL IsRead, // 是否需要读取数据
  309. BOOL IsLastPkt); // 是否为最后一包
  310. // JTAG复位Tap状态函数.连续六个以上TCK且TMS为高将可将状态机置为Test-Logic Reset状态
  311. ULONG WINAPI CH347Jtag_Reset(ULONG iIndex); // 指定设备序号
  312. // 操作TRST完成硬件复位
  313. BOOL WINAPI CH347Jtag_ResetTrst(ULONG iIndex, // 指定设备序号
  314. BOOL iLevel); // 0=设置为低,1=设置为高
  315. // 位带方式JTAG IR/DR数据读写.适用于少量数据的读写。如指令操作、状态机切换等控制类传输。如批量数据传输,建议使用CH347Jtag_WriteRead_Fast
  316. // 命令包以4096字节为单位批量读写
  317. // 状态机:Run-Test->Shift-IR/DR..->Exit IR/DR -> Run-Test
  318. BOOL WINAPI CH347Jtag_WriteRead(ULONG iIndex, // 指定设备序号
  319. BOOL IsDR, // =TRUE: DR数据读写,=FALSE:IR数据读写
  320. ULONG iWriteBitLength, // 写长度,准备写出的长度
  321. PVOID iWriteBitBuffer, // 指向一个缓冲区,放置准备写出的数据
  322. PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的长度
  323. PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  324. // JTAG IR/DR数据批量读写,用于多字节连续读写。如JTAG固件下载操作。因硬件有4K缓冲区,如先写后读,长度不超过4096字节。缓冲区大小可自行调整
  325. // 状态机:Run-Test->Shift-IR/DR..->Exit IR/DR -> Run-Test
  326. BOOL WINAPI CH347Jtag_WriteRead_Fast(ULONG iIndex, // 指定设备序号
  327. BOOL IsDR, // =TRUE: DR数据读写,=FALSE:IR数据读写
  328. ULONG iWriteBitLength, // 写长度,准备写出的长度
  329. PVOID iWriteBitBuffer, // 指向一个缓冲区,放置准备写出的数据
  330. PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的长度
  331. PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  332. // 位带方式JTAG IR/DR数据读写.适用于少量数据的读写。如指令操作、状态机切换等控制类传输。如批量数据传输,建议使用CH347Jtag_WriteRead_Fast
  333. // 命令包以4096字节为单位批量读写
  334. // 状态机:Run-Test-> Shift-IR/DR..->Exit IR/DR -> Run-Test
  335. BOOL WINAPI CH347Jtag_WriteReadEx(ULONG iIndex, // 指定设备序号
  336. BOOL IsInDrOrIr, // =TRUE: 在SHIFT-DR/IR状态进行数据交互 ==FALSE: Run-Test->Shift-IR/DR.进行数据交互.->Exit IR/DR -> Run-Test
  337. BOOL IsDR, // =TRUE: DR数据读写,=FALSE:IR数据读写
  338. ULONG iWriteBitLength, // 写长度,准备写出的长度
  339. PVOID iWriteBitBuffer, // 指向一个缓冲区,放置准备写出的数据
  340. PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的长度
  341. PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  342. // JTAG IR/DR数据批量读写,用于多字节连续读写。如JTAG固件下载操作。因硬件有4K缓冲区,如先写后读,长度不超过4096字节。缓冲区大小可自行调整
  343. // 状态机:Run-Test->Shift-IR/DR..->Exit IR/DR -> Run-Test
  344. BOOL WINAPI CH347Jtag_WriteRead_FastEx(ULONG iIndex, // 指定设备序号
  345. BOOL IsInDrOrIr, // =TRUE: 在SHIFT-DR/IR状态进行数据交互 ==FALSE: Run-Test->Shift-IR/DR.进行数据交互.->Exit IR/DR -> Run-Test
  346. BOOL IsDR, // =TRUE: DR数据读写,=FALSE:IR数据读写
  347. ULONG iWriteBitLength, // 写长度,准备写出的长度
  348. PVOID iWriteBitBuffer, // 指向一个缓冲区,放置准备写出的数据
  349. PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的长度
  350. PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  351. // 单步切换JTAG状态机,需按照顺序执行
  352. BOOL WINAPI CH347Jtag_SwitchTapState(UCHAR TapState); // 指定切换到的状态
  353. // 0:Test-Logic Reset,1:Run-Test/Idle,2:Run-Test/Idle -> Shift-DR,3:Shift-DR -> Run-Test/Idle
  354. // 4:Run-Test/Idle -> Shift-IR, 5:Shift-IR -> Run-Test/Idle, 6:Exit1-DR/IR -> Update-DR/IR -> Run-Test/Idle
  355. // 单步切换JTAG状态机,可指定操作设备iIndex
  356. BOOL WINAPI CH347Jtag_SwitchTapStateEx(ULONG iIndex, // 指定设备序号
  357. UCHAR TapState); // 指定切换到的状态
  358. // JTAG DR写,以字节为单位,用于多字节连续读写。如JTAG固件下载操作。
  359. // 状态机:Run-Test->Shift-DR..->Exit DR -> Run-Test
  360. BOOL WINAPI CH347Jtag_ByteWriteDR(ULONG iIndex, // 指定设备序号
  361. ULONG iWriteLength, // 写长度,准备写出的字节长度
  362. PVOID iWriteBuffer); // 指向一个缓冲区,放置准备写出的数据
  363. // JTAG DR读,以字节为单位,多字节连续读。
  364. // 状态机:Run-Test->Shift-DR..->Exit DR -> Run-Test
  365. BOOL WINAPI CH347Jtag_ByteReadDR(ULONG iIndex, // 指定设备序号
  366. PULONG oReadLength, // 指向长度单元,返回后为实际读取的字节长度
  367. PVOID oReadBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  368. // JTAG IR写,以字节为单位,多字节连续写。
  369. // 状态机:Run-Test->Shift-IR..->Exit IR -> Run-Test
  370. BOOL WINAPI CH347Jtag_ByteWriteIR(ULONG iIndex, // 指定设备序号
  371. ULONG iWriteLength, // 写长度,准备写出的字节长度
  372. PVOID iWriteBuffer); // 指向一个缓冲区,放置准备写出的数据
  373. // JTAG IR读,以字节为单位,多字节连续读写。
  374. // 状态机:Run-Test->Shift-IR..->Exit IR -> Run-Test
  375. BOOL WINAPI CH347Jtag_ByteReadIR(ULONG iIndex, // 指定设备序号
  376. PULONG oReadLength, // 指向长度单元,返回后为实际读取的字节长度
  377. PVOID oReadBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  378. // 位带方式JTAG DR数据写.适用于少量数据的读写。如指令操作、状态机切换等控制类传输。如批量数据传输,建议使用USB20Jtag_ByeWriteDR
  379. // 状态机:Run-Test->Shift-DR..->Exit DR -> Run-Test
  380. BOOL WINAPI CH347Jtag_BitWriteDR(ULONG iIndex, // 指定设备序号
  381. ULONG iWriteBitLength, // 指向长度单元,返回后为实际读取的字节长度
  382. PVOID iWriteBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  383. // 位带方式JTAG IR数据写.适用于少量数据的读写。如指令操作、状态机切换等控制类传输。如批量数据传输,建议使用USB20Jtag_ByteWriteIR
  384. // 状态机:Run-Test->Shift-IR..->Exit IR -> Run-Test
  385. BOOL WINAPI CH347Jtag_BitWriteIR(ULONG iIndex, // 指定设备序号
  386. ULONG iWriteBitLength, // 指向长度单元,返回后为实际读取的字节长度
  387. PVOID iWriteBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  388. // 位带方式JTAG IR数据读.适用于少量数据的读写。如指令操作、状态机切换等。如批量数据传输,建议使用USB20Jtag_ByteReadIR
  389. // 状态机:Run-Test->Shift-IR..->Exit IR -> Run-Test
  390. BOOL WINAPI CH347Jtag_BitReadIR(ULONG iIndex, // 指定设备序号
  391. PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的字节长度
  392. PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  393. // 位带方式JTAG DR数据读.适用于少量数据的读写。如批量和高速数据传输,建议使用USB20Jtag_ByteReadDR
  394. // 状态机:Run-Test->Shift-DR..->Exit DR -> Run-Test
  395. BOOL WINAPI CH347Jtag_BitReadDR(ULONG iIndex, // 指定设备序号
  396. PULONG oReadBitLength, // 指向长度单元,返回后为实际读取的字节长度
  397. PVOID oReadBitBuffer ); // 指向一个足够大的缓冲区,用于保存读取的数据
  398. /***************GPIO********************/
  399. // 获取CH347的GPIO方向和引脚电平值
  400. BOOL WINAPI CH347GPIO_Get(ULONG iIndex, // 指定设备序号
  401. UCHAR *iDir, // 引脚方向:GPIO0-7对应位0-7, 0=输入;1=输出
  402. UCHAR *iData); // GPIO0电平:GPIO0-7对应位0-7,0=低电平;1=高电平)
  403. // 设置CH347的GPIO方向和引脚电平值
  404. BOOL WINAPI CH347GPIO_Set(ULONG iIndex, // 指定设备序号
  405. UCHAR iEnable, // 数据有效标志:对应位0-7,对应GPIO0-7.
  406. UCHAR iSetDirOut, // 设置I/O方向,某位清0则对应引脚为输入,某位置1则对应引脚为输出.GPIO0-7对应位0-7.
  407. UCHAR iSetDataOut); // 输出数据,如果I/O方向为输出,那么某位清0时对应引脚输出低电平,某位置1时对应引脚输出高电平
  408. typedef VOID ( CALLBACK * mPCH347_INT_ROUTINE ) ( // 中断服务程序
  409. PUCHAR iStatus ); // 中断状态数据,参考下面的位说明
  410. // 8个字节GPIO0-7引脚状态.每字节位定义如下:
  411. // 位7:当前的GPIO0方向,0:输入;1:输出;
  412. // 位6:当前的GPIO0电平,0:低电平;1:高电平;
  413. // 位5:当前的GPIO0是否设置为中断,0:查询模式;1:中断模式;
  414. // 位4-3:设置GPIO0的中断模式,00:下降沿触发;01:上升沿触发;10:双边沿触发;11: 保留;
  415. // 位2-0:保留;
  416. // 设定GPIO中断服务程序
  417. BOOL WINAPI CH347SetIntRoutine(ULONG iIndex, // 指定设备序号
  418. UCHAR Int0PinN, // 中断0 GPIO引脚号,大于7:不启用此中断源; 为0-7对应gpio0-7
  419. UCHAR Int0TripMode, // 中断0类型: 00:下降沿触发; 01:上升沿触发; 02:双边沿触发; 03:保留;
  420. UCHAR Int1PinN, // 中断1 GPIO引脚号,大于7则不启用此中断源,为0-7对应gpio0-7
  421. UCHAR Int1TripMode, // 中断1类型: 00:下降沿触发; 01:上升沿触发; 02:双边沿触发; 03:保留;
  422. mPCH347_INT_ROUTINE iIntRoutine );// 指定中断服务程序,为NULL则取消中断服务,否则在中断时调用该程序
  423. // 读取中断数据
  424. BOOL WINAPI CH347ReadInter(ULONG iIndex, // 指定设备序号
  425. PUCHAR iStatus ); // 指向8字节单元,分别为GPIO0-7引脚状态,每个字节位说明参考中断服务程序iStatus位说明
  426. // 放弃中断数据读操作
  427. BOOL WINAPI CH347AbortInter(ULONG iIndex ); // 指定设备序号
  428. // 进入IAP固件升级模式
  429. BOOL WINAPI CH347StartIapFwUpate(ULONG iIndex,
  430. ULONG FwSize); // 固件长度
  431. /**************HID/VCP串口**********************/
  432. // 打开串口
  433. HANDLE WINAPI CH347Uart_Open(ULONG iIndex); // 指定设备序号
  434. // 关闭串口
  435. BOOL WINAPI CH347Uart_Close(ULONG iIndex); // 指定设备序号
  436. // 设定设备事件通知程序
  437. BOOL WINAPI CH347Uart_SetDeviceNotify( // 设定设备事件通知程序
  438. ULONG iIndex, // 指定设备序号,0对应第一个设备
  439. PCHAR iDeviceID, // 可选参数,指向字符串,指定被监控的设备的ID,字符串以\0终止
  440. mPCH347_NOTIFY_ROUTINE iNotifyRoutine ); // 指定设备事件回调程序,为NULL则取消事件通知,否则在检测到事件时调用该程序
  441. // 获取UART硬件配置
  442. BOOL WINAPI CH347Uart_GetCfg(ULONG iIndex, // 指定设备序号
  443. PULONG BaudRate, // 波特率
  444. PUCHAR ByteSize, // 数据位数(5,6,7,8,16)
  445. PUCHAR Parity, // 校验位(0:None; 1:Odd; 2:Even; 3:Mark; 4:Space)
  446. PUCHAR StopBits, // 停止位数(0:1停止位; 1:1.5停止位; 2:2停止位);
  447. PUCHAR ByteTimeout); // 字节超时
  448. // 设置UART配置
  449. BOOL WINAPI CH347Uart_Init(ULONG iIndex, // 指定设备序号
  450. DWORD BaudRate, // 波特率
  451. UCHAR ByteSize, // 数据位数(5,6,7,8,16)
  452. UCHAR Parity, // 校验位(0:None; 1:Odd; 2:Even; 3:Mark; 4:Space)
  453. UCHAR StopBits, // 停止位数(0:1停止位; 1:1.5停止位; 2:2停止位);
  454. UCHAR ByteTimeout);// 字节超时时间,单位100uS
  455. // 设置USB数据读写的超时
  456. BOOL WINAPI CH347Uart_SetTimeout(ULONG iIndex, // 指定设备序号
  457. ULONG iWriteTimeout, // 指定USB写出数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  458. ULONG iReadTimeout ); // 指定USB读取数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  459. // 串口读
  460. BOOL WINAPI CH347Uart_Read(ULONG iIndex, // 指定设备序号
  461. PVOID oBuffer, // 指向一个足够大的缓冲区,用于保存读取的数据
  462. PULONG ioLength );// 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
  463. // 串口写
  464. BOOL WINAPI CH347Uart_Write(ULONG iIndex, // 指定设备序号
  465. PVOID iBuffer, // 指向一个缓冲区,放置准备写出的数据
  466. PULONG ioLength );// 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度
  467. // 查询读缓冲区有多少字节未取(适用于HID模式串口)
  468. BOOL WINAPI CH347Uart_QueryBufUpload(ULONG iIndex, // 指定设备序号
  469. LONGLONG *RemainBytes); // 读缓冲区未取字节数
  470. // 获取设备信息
  471. BOOL WINAPI CH347Uart_GetDeviceInfor(ULONG iIndex,mDeviceInforS *DevInformation);
  472. /********I2C***********/
  473. // I2C设置
  474. BOOL WINAPI CH347I2C_Set(ULONG iIndex, // 指定设备序号
  475. ULONG iMode ); // 指定模式,见下行
  476. // 位0-位2: I2C接口速度/SCL频率, 000=低速/20KHz,001=标准/100KHz(默认值),010=快速/400KHz,011=高速/750KHz,100=低速/50KHz,101=标准/200KHz,110=快速/1MHz
  477. // 其它保留,必须为0
  478. // 设置I2C时钟延展功能
  479. BOOL WINAPI CH347I2C_SetStretch(ULONG iIndex, // 指定设备序号
  480. BOOL iEnable); // 0=关闭时钟延展功能(默认关闭);1=开启时钟延展功能
  481. // 设置硬件异步延时,调用后很快返回,而在下一个流操作之前延时指定毫秒数
  482. BOOL WINAPI CH347I2C_SetDelaymS(ULONG iIndex, // 指定设备序号
  483. ULONG iDelay); // 指定延时的毫秒数
  484. // 设置I2C引脚驱动模式
  485. BOOL WINAPI CH347I2C_SetDriverMode(ULONG iIndex, // 指定设备序号
  486. UCHAR iMode); // 0=开漏模式;1=推挽模式
  487. // 处理I2C数据流,2线接口,时钟线为SCL引脚,数据线为SDA引脚
  488. // 写操作:CH347StreamI2C(iIndex, iWriteLength, iWriteBuffer, 0, NULL)
  489. // 读操作:CH347StreamI2C(iIndex, iWriteLength, iWriteBuffer, iReadLength, oReadBuffer)
  490. // iWriteBuffer指定I2C设备地址+待操作寄存器地址,iWriteLength则为iWriteBuffer的实际数据长度
  491. BOOL WINAPI CH347StreamI2C( ULONG iIndex, // 指定设备序号
  492. ULONG iWriteLength, // 准备写出的数据字节数
  493. PVOID iWriteBuffer, // 指向一个缓冲区,放置准备写出的数据,首字节通常是I2C设备地址,次字节是操作寄存器地址
  494. ULONG iReadLength, // 准备读取的数据字节数
  495. PVOID oReadBuffer ); // 指向一个缓冲区,返回后是读入的数据
  496. // 处理I2C数据流,2线接口,时钟线为SCL引脚,数据线为SDA引脚
  497. BOOL WINAPI CH347StreamI2C_RetACK( // 处理I2C数据流,2线接口,时钟线为SCL引脚,数据线为SDA引脚(准双向I/O),速度约56K字节,并返回主机端获取到的ACK数量
  498. ULONG iIndex, // 指定设备序号
  499. ULONG iWriteLength, // 准备写出的数据字节数
  500. PVOID iWriteBuffer, // 指向一个缓冲区,放置准备写出的数据,首字节通常是I2C设备地址及读写方向位
  501. ULONG iReadLength, // 准备读取的数据字节数
  502. PVOID oReadBuffer, // 指向一个缓冲区,返回后是读入的数据
  503. PULONG rAckCount); // 指向读写返回的ACK值
  504. // 设置I2C应答机制(CH347T专用)
  505. BOOL WINAPI CH347I2C_SetIgnoreNack(ULONG iIndex, // 指定设备序号
  506. UCHAR iMode); // 0=传输接收到NACK即停止,1=传输忽略设备NACK信号,继续发送数据
  507. #ifndef _CH341_DLL_H
  508. typedef enum _EEPROM_TYPE {// EEPROM型号
  509. ID_24C01,
  510. ID_24C02,
  511. ID_24C04,
  512. ID_24C08,
  513. ID_24C16,
  514. ID_24C32,
  515. ID_24C64,
  516. ID_24C128,
  517. ID_24C256,
  518. ID_24C512,
  519. ID_24C1024,
  520. ID_24C2048,
  521. ID_24C4096
  522. } EEPROM_TYPE;
  523. #endif
  524. // 从EEPROM中读取数据块
  525. BOOL WINAPI CH347ReadEEPROM(ULONG iIndex, // 指定设备序号
  526. EEPROM_TYPE iEepromID, // 指定EEPROM型号
  527. ULONG iAddr, // 指定数据单元的地址
  528. ULONG iLength, // 准备读取的数据字节数
  529. PUCHAR oBuffer ); // 指向一个缓冲区,返回后是读入的数据
  530. // 向EEPROM中写入数据块
  531. BOOL WINAPI CH347WriteEEPROM(ULONG iIndex, // 指定设备序号
  532. EEPROM_TYPE iEepromID, // 指定EEPROM型号
  533. ULONG iAddr, // 指定数据单元的地址
  534. ULONG iLength, // 准备写出的数据字节数
  535. PUCHAR iBuffer ); // 指向一个缓冲区,放置准备写出的数据
  536. //设置第8位时钟低周期延时时间,仅适用于CH347T
  537. BOOL WINAPI CH347I2C_SetAckClk_DelayuS(ULONG iIndex, // 指定设备序号
  538. ULONG iDelay); // 指定延时的微秒数
  539. // 该函数用于查询指定索引的CH339W芯片当前各个接口功能的启用状态。
  540. // 返回值位定义:
  541. // 位7 (0x80): USB转JTAG使能状态(1=使能,0=禁用)
  542. // 位6 (0x40): USB转SPI使能状态(1=使能,0=禁用)
  543. // 位5 (0x20): USB转UART使能(不带流控)(1=使能,0=禁用)
  544. // 位4 (0x10): USB转UART流控使能(1=使能,0=禁用)
  545. // 位3 (0x08): USB转I2C使能状态(1=使能,0=禁用)
  546. // 位2-位0: 保留位
  547. UCHAR WINAPI CH339GetChipFuncState( ULONG iIndex ); // 指定设备序号
  548. #ifdef __cplusplus
  549. }
  550. #endif
  551. #endif // _CH347_DLL_H