📄 ch341dll.pas
字号:
unit CH341DLL;
interface
// 2004.05.28, 2004.10.20, 2005.01.08, 2005.03.25
//****************************************
//** Copyright (C) W.ch 1999-2005 **
//** Web: http://www.winchiphead.com **
//****************************************
//** DLL for USB interface chip CH341 **
//** C, VC5.0 **
//****************************************
//
// USB总线接口芯片CH341并口应用层接口库 V1.5
// 南京沁恒电子有限公司 作者: W.ch 2005.03
// CH341-DLL V1.5
// 运行环境: Windows 98/ME, Windows 2000/XP
// support USB chip: CH341, CH341A
// USB => Parallel, I2C, SPI, JTAG ...
//
uses SysUtils;
const
FILE_DEVICE_UNKNOWN = $H22;
FILE_ANY_ACCESS = 0;
METHOD_BUFFERED = 0;
mCH341_PACKET_LENGTH = 32; // CH341支持的数据包的长度
mCH341_PKT_LEN_SHORT = 8 ; // CH341支持的短数据包的长度
// WIN32应用层接口命令
// IOCTL_CH341_COMMAND ( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f34 << 2 | METHOD_BUFFERED ) // 专用接口
// mWIN32_COMMAND_HEAD mOFFSET( mWIN32_COMMAND, mBuffer ) // WIN32命令接口的头长度
mCH341_MAX_NUMBER = 16; // 最多同时连接的CH341数
mMAX_BUFFER_LENGTH =$1000; // 数据缓冲区最大长度4096
// mMAX_COMMAND_LENGTH ( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH ) // 最大数据长度加上命令结构头的长度
mDEFAULT_BUFFER_LEN=$0400; // 数据缓冲区默认长度1024
// mDEFAULT_COMMAND_LEN ( mWIN32_COMMAND_HEAD + mDEFAULT_BUFFER_LEN ) // 默认数据长度加上命令结构头的长度
// CH341端点地址
mCH341_ENDP_INTER_UP=$81 ; // CH341的中断数据上传端点的地址
mCH341_ENDP_INTER_DOWN=$01; // CH341的中断数据下传端点的地址
mCH341_ENDP_DATA_UP=$82 ; // CH341的数据块上传端点的地址
mCH341_ENDP_DATA_DOWN=$02 ; // CH341的数据块下传端点的地址
// 设备层接口提供的管道操作命令
mPipeDeviceCtrl=$00000004; // CH341的综合控制管道
mPipeInterUp=$00000005 ; // CH341的中断数据上传管道
mPipeDataUp =$00000006 ; // CH341的数据块上传管道
mPipeDataDown=$00000007 ; // CH341的数据块下传管道
// 应用层接口的功能代码
mFuncNoOperation=$00000000; // 无操作
mFuncGetVersion =$00000001; // 获取驱动程序版本号
mFuncGetConfig =$00000002 ;// 获取USB设备配置描述符
mFuncSetTimeout =$00000009 ;// 设置USB通讯超时
mFuncSetExclusive=$0000000b; // 设置独占使用
mFuncResetDevice =$0000000c ; // 复位USB设备
mFuncResetPipe =$0000000d ; // 复位USB管道
mFuncAbortPipe =$0000000e; // 取消USB管道的数据请求
// CH341并口专用的功能代码
mFuncSetParaMode =$0000000f ; // 设置并口模式
mFuncReadData0 =$00000010 ; // 从并口读取数据块0
mFuncReadData1 =$00000011 ; // 从并口读取数据块1
mFuncWriteData0 =$00000012 ; // 向并口写入数据块0
mFuncWriteData1 =$00000013 ; // 向并口写入数据块1
mFuncWriteRead =$00000014 ; // 先输出再输入
// USB设备标准请求代码
mUSB_CLR_FEATURE =$01;
mUSB_SET_FEATURE =$03 ;
mUSB_GET_STATUS =$00 ;
mUSB_SET_ADDRESS =$05 ;
mUSB_GET_DESCR =$06 ;
mUSB_SET_DESCR =$07 ;
mUSB_GET_CONFIG =$08 ;
mUSB_SET_CONFIG =$09 ;
mUSB_GET_INTERF =$0a ;
mUSB_SET_INTERF =$0b ;
mUSB_SYNC_FRAME =$0c ;
// CH341控制传输的厂商专用请求类型
mCH341_VENDOR_READ =$C0 ; // 通过控制传输实现的CH341厂商专用读操作
mCH341_VENDOR_WRITE =$40 ; // 通过控制传输实现的CH341厂商专用写操作
// CH341控制传输的厂商专用请求代码
mCH341_PARA_INIT =$B1 ; // 初始化并口
mCH341_I2C_STATUS =$52 ; // 获取I2C接口的状态
mCH341_I2C_COMMAND =$53 ; // 发出I2C接口的命令
// CH341并口操作命令代码
mCH341_PARA_CMD_R0 =$AC ; // 从并口读数据0
mCH341_PARA_CMD_R1 =$AD ; // 从并口读数据1
mCH341_PARA_CMD_W0 =$A6 ; // 向并口写数据0
mCH341_PARA_CMD_W1 =$A7 ; // 向并口写数据1
mCH341_PARA_CMD_STS =$A0 ; // 获取并口状态
// CH341A并口操作命令代码
mCH341A_CMD_SET_OUTPUT =$A1; // 设置并口输出
mCH341A_CMD_IO_ADDR =$A2 ; // MEM带地址读写/输入输出,从次字节开始为命令流
mCH341A_CMD_SPI_STREAM =$A8 ; // SPI接口的命令包,从次字节开始为数据流
mCH341A_CMD_SIO_STREAM =$A9 ; // SIO接口的命令包,从次字节开始为数据流
mCH341A_CMD_I2C_STREAM =$AA ; // I2C接口的命令包,从次字节开始为I2C命令流
mCH341A_CMD_UIO_STREAM =$AB ; // UIO接口的命令包,从次字节开始为命令流
// CH341A控制传输的厂商专用请求代码
mCH341A_BUF_CLEAR =$B2 ; // 清除未完成的数据
mCH341A_I2C_CMD_X =$54 ; // 发出I2C接口的命令,立即执行
mCH341A_DELAY_MS =$5E ; // 以亳秒为单位延时指定时间
mCH341A_GET_VER =$5F ; // 获取芯片版本
mCH341_EPP_IO_MAX = ( mCH341_PACKET_LENGTH - 1 ) ; // CH341在EPP/MEM方式下单次读写数据块的最大长度
mCH341A_EPP_IO_MAX =$FF ; // CH341A在EPP/MEM方式下单次读写数据块的最大长度
mCH341A_CMD_IO_ADDR_W =$00 ; // MEM带地址读写/输入输出的命令流:写数据,位6-位0为地址,下一个字节为待写数据
mCH341A_CMD_IO_ADDR_R =$80 ; // MEM带地址读写/输入输出的命令流:读数据,位6-位0为地址,读出数据一起返回
mCH341A_CMD_I2C_STM_STA =$74 ; // I2C接口的命令流:产生起始位
mCH341A_CMD_I2C_STM_STO =$75 ; // I2C接口的命令流:产生停止位
mCH341A_CMD_I2C_STM_OUT =$80 ; // I2C接口的命令流:输出数据,位5-位0为长度,后续字节为数据,0长度则只发送一个字节并返回应答
mCH341A_CMD_I2C_STM_IN =$C0 ; // I2C接口的命令流:输入数据,位5-位0为长度,0长度则只接收一个字节并发送无应答
// mCH341A_CMD_I2C_STM_MAX = ( min( =$3F, mCH341_PACKET_LENGTH ) ); // I2C接口的命令流单个命令输入输出数据的最大长度
mCH341A_CMD_I2C_STM_SET =$60 ; // I2C接口的命令流:设置参数,位2=SPI的I/O数(0=单入单出,1=双入双出),位1位0=I2C速度(00=低速,01=标准,10=快速,11=高速)
mCH341A_CMD_I2C_STM_US =$40 ; // I2C接口的命令流:以微秒为单位延时,位3-位0为延时值
mCH341A_CMD_I2C_STM_MS =$50 ; // I2C接口的命令流:以亳秒为单位延时,位3-位0为延时值
mCH341A_CMD_I2C_STM_DLY =$0F ; // I2C接口的命令流单个命令延时的最大值
mCH341A_CMD_I2C_STM_END =$00 ; // I2C接口的命令流:命令包提前结束
mCH341A_CMD_UIO_STM_IN =$00 ; // UIO接口的命令流:输入数据D7-D0
mCH341A_CMD_UIO_STM_DIR =$40 ; // UIO接口的命令流:设定I/O方向D5-D0,位5-位0为方向数据
mCH341A_CMD_UIO_STM_OUT =$80 ; // UIO接口的命令流:输出数据D5-D0,位5-位0为数据
mCH341A_CMD_UIO_STM_US =$C0 ; // UIO接口的命令流:以微秒为单位延时,位5-位0为延时值
mCH341A_CMD_UIO_STM_END =$20 ; // UIO接口的命令流:命令包提前结束
// CH341并口工作模式
mCH341_PARA_MODE_EPP =$00 ; // CH341并口工作模式为EPP方式
mCH341_PARA_MODE_EPP17 =$00 ; // CH341A并口工作模式为EPP方式V1.7
mCH341_PARA_MODE_EPP19 =$01 ; // CH341A并口工作模式为EPP方式V1.9
mCH341_PARA_MODE_MEM =$02 ; // CH341并口工作模式为MEM方式
// 直接输入的状态信号的位定义
mStateBitERR =$00000100 ; // 只读,ERR#引脚输入状态,1:高电平,0:低电平
mStateBitPEMP =$00000200 ; // 只读,PEMP引脚输入状态,1:高电平,0:低电平
mStateBitINT =$00000400 ; // 只读,INT#引脚输入状态,1:高电平,0:低电平
mStateBitSLCT =$00000800 ; // 只读,SLCT引脚输入状态,1:高电平,0:低电平
mStateBitSDA =$00800000 ; // 只读,SDA引脚输入状态,1:高电平,0:低电平
type
PVOID = Pointer;
PULONG=pcardinal;
Type
mUspValue=record
mUspValueLow : Byte;
mUspValueHigh : Byte;
End;
Type
mUspIndex=record
mUspIndexLow : Byte;
mUspIndexHigh : Byte;
End ;
Type
USB_SETUP_PKT=record
mUspReqType : Byte;
mUspRequest : Byte;
mUspValue : mUspValue;
mUspIndex : mUspIndex;
mLength : Integer;
End ;
Type
WIN32_COMMAND=record //定义WIN32命令接口结构
mFunction : cardinal; //输入时指定功能代码或者管道号
//输出时返回操作状态
mLength : cardinal; //存取长度,返回后续数据的长度
mBuffer:array[0..(mCH341_PACKET_LENGTH-1)] of Byte; //数据缓冲区,长度为0至255B '数据缓冲区,长度为0至255B
End ;
Type mPWIN32_COMMAND=^WIN32_COMMAND;
var
mUSB_SETUP_PKT :USB_SETUP_PKT;
mWIN32_COMMAND : WIN32_COMMAND;
type mPCH341_INT_ROUTINE=Procedure ( // 中断服务程序
iStatus:cardinal );stdcall; // 中断状态数据,见下行
// 位7-位0对应CH341的D7-D0引脚
// 位8对应CH341的ERR#引脚, 位9对应CH341的PEMP引脚, 位10对应CH341的INT#引脚, 位11对应CH341的SLCT引脚
Function CH341OpenDevice( // 打开CH341设备,返回句柄,出错则无效
iIndex :cardinal):integer ;Stdcall; external 'CH341DLL.DLL' ;// 指定CH341设备序号,0对应第一个设备
procedure CH341CloseDevice( // 关闭CH341设备
iIndex :cardinal) ;Stdcall; external 'CH341DLL.DLL';// 指定CH341设备序号
Function CH341GetVersion( ):cardinal;Stdcall; external 'CH341DLL.DLL'; // 获得DLL版本号,返回版本号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -