⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch341dll.pas

📁 南京沁恒电子有限公司USB通用设备接口芯片资料
💻 PAS
📖 第 1 页 / 共 3 页
字号:
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 + -