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

📄 ch375hf4.inc

📁 USB芯片CH372的驱动代码。较为详细
💻 INC
📖 第 1 页 / 共 4 页
字号:
	EXTRN	DATA (CH375LibConfig)	;CH375程序库配置,下行说明
; 位7: CH375的INT#引脚连接方式: 0查询方式,1中断方式 */
; 位6: 该位为1且CH375Version2为1则芯片为CH375B */
; 位5: 在写操作结束后是否延时: 0写后延时,1不延时 */
; 位4: 在添加数据后是否自动更新文件长度: 0不更新,1自动更新 */
; 位3位2: 针对文件读写的多扇区数据的复制方式: 00单DPTR复制, 01单DPTR复制, 10双DPTR复制, 11单DPTR和P2+R0复制 */
; 位1位0: 针对磁盘读写的单扇区数据的复制方式: 00单DPTR复制, 01单DPTR复制, 10双DPTR复制, 11单DPTR和P2+R0复制 */

; 如果CH375的INT#引脚连接到单片机的中断输入引脚并且准备使用中断方式,那么LIB_CFG_INT_EN定义为1,否则定义为0由单片机查询INT#引脚 */
; 由于MCS51单片机复制外部RAM中的数据时比较慢,所以CH375的程序库提供几种优化速度的方式,在LIB_CFG_FILE_IO和LIB_CFG_DISK_IO中定义:
;   方式0:
;   方式1:"单DPTR复制", 最常规的数据复制方式, 使用一个DPTR来回切换, 每传输一个字节需要16个机器周期, 速度最慢, 适用于所有MCS51单片机,
;   方式2:"双DPTR复制", 针对特定硬件的数据复制方式, 使用两个DPTR, 每传输一个字节需要8.5个机器周期, 速度较快, 适用于ATMEL/PHILIPS/SST等具有双DPTR的单片机,
;   方式3:"单DPTR和P2+R0复制", 用P2+R0指向CH375的I/O端口并且用DPTR指向外部RAM进行数据复制, 每传输一个字节需要6.25个机器周期, 速度最快,
;                       适用于所有标准的MCS51单片机, 但是某些单片机在启用内置的外部RAM时会关闭P2+R0的功能, 所以可能不适用,
;   对于文件数据读写,也就是应用程序调用CH375FileReadX和CH375FileWriteX子程序时:
;     在方式1,2,3下,应用程序每次调用CH375FileReadX和CH375FileWriteX时,CH375的程序库都会从指定缓冲区的起始地址开始读写数据,
;     例如: 某文件长度为1K(占用2个扇区), 如果调用CH375FileReadX时读1K(指定mCmdParam.Read.mSectorCount为2), 那么1K数据全读到指定缓冲区中,
;           如果缓冲区较小只有0.5K, 那么分两次读取, 第一次调用CH375FileReadX时读0.5K, 处理完这0.5K数据后再调用CH375FileReadX读下一个0.5K并处理

	EXTRN	DATA (CH375vDiskFat)	;逻辑盘的FAT标志:1=FAT12,2=FAT16,3=FAT32
	EXTRN	DATA (CH375vSecPerClus)	;逻辑盘的每簇扇区数
	EXTRN	DATA (CH375vStartCluster)	;当前文件或者目录的起始簇号,UINT32
	EXTRN	DATA (CH375vFileSize)	;当前文件的长度,UINT32
	EXTRN	DATA (CH375vCurrentOffset)	;当前文件指针,当前读写位置的字节偏移

; FAT数据区中文件目录信息 */
;typedef struct _FAT_DIR_INFO {
;	UINT8	DIR_Name[11];				/* 00H,文件名,共11字节,不足处填空格 */
;	UINT8	DIR_Attr;					/* 0BH,文件属性,参考前面的说明 */
;	UINT8	DIR_NTRes;					/* 0CH */
;	UINT8	DIR_CrtTimeTenth;			/* 0DH,文件创建的时间,以0.1秒单位计数 */
;	UINT16	DIR_CrtTime;				/* 0EH,文件创建的时间 */
;	UINT16	DIR_CrtDate;				/* 10H,文件创建的日期 */
;	UINT16	DIR_LstAccDate;				/* 12H,最近一次存取操作的日期 */
;	UINT16	DIR_FstClusHI;				/* 14H */
;	UINT16	DIR_WrtTime;				/* 16H,文件修改时间,参考前面的宏MAKE_FILE_TIME */
;	UINT16	DIR_WrtDate;				/* 18H,文件修改日期,参考前面的宏MAKE_FILE_DATA */
;	UINT16	DIR_FstClusLO;				/* 1AH */
;	UINT32	DIR_FileSize;				/* 1CH,文件长度 */
;} FAT_DIR_INFO;							/* 20H */

	EXTRN	BIT		(CH375Version2)		;芯片版本:0-CH375,1-CH375A/B
	EXTRN	XDATA	(CH375vDataStart)	;逻辑盘的数据区域的起始LBA,UINT32
	EXTRN	DATA	(CH375vFdtLba)		;当前FDT所在的LBA地址,UINT32
	EXTRN	DATA	(CH375vFdtOffset)	;当前FDT在扇区内的偏移地址,UINT16
	EXTRN	XDATA	(CH375vDiskRoot)	;对于FAT16盘为根目录占用扇区数,对于FAT32盘为根目录起始簇号,UINT32
#ifdef EN_SEC_SIZE_AUTO
	EXTRN	XDATA	(CH375vSectorSize)	;磁盘的扇区大小,UINT16
#else
#define	CH375vSectorSize	512			;磁盘的扇区大小
#endif
	EXTRN	DATA	(pDISK_BASE_BUF)	;指向外部RAM的磁盘数据缓冲区,缓冲区长度不小于CH375vSectorSize,由应用程序初始化,UINT16,PUINT8X

	EXTRN	CODE	(CH375ReadBlock)	; 从磁盘读取多个扇区的数据到外部接口交换区 */
#ifdef EN_DISK_WRITE
	EXTRN	CODE	(CH375WriteBlock)	; 将外部接口交换区的多个扇区的数据块写入磁盘 */
#endif

#ifndef LIB_CFG_VALUE
#define	LIB_CFG_VALUE			05H		; CH375程序库配置值 */
#endif

; ********************************************************************************************************************* */
; 子程序库中提供的子程序, 操作完成后返回状态码在R7中 */
; 下述子程序中, 文件操作子程序CH375File*和磁盘查询子程序CH375DiskQuery都可能会用到磁盘数据缓冲区pDISK_BASE_BUF,
;   并且有可能在pDISK_BASE_BUF中保存了磁盘信息, 所以必须保证pDISK_BASE_BUF不被用于其它用途,
;   如果RAM较少, 要将pDISK_BASE_BUF临时用于其它用途, 那么在临时用完后必须调用CH375DirtyBuffer清除磁盘缓冲区
	EXTRN	CODE (CH375GetVer)			; 获取当前子程序库的版本号 */
	EXTRN	CODE (CH375Reset)			; 复位CH375 */
	EXTRN	CODE (CH375Init)			; 初始化CH375 */
	EXTRN	CODE (CH375DiskConnect)		; 检查磁盘是否连接 */
	EXTRN	CODE (CH375DiskReady)		; 查询磁盘是否准备好 */
	EXTRN	CODE (CH375DirtyBuffer)		; 清除磁盘缓冲区 */
	EXTRN	CODE (CH375FileOpen)		; 打开文件或者枚举文件 */
	EXTRN	CODE (CH375FileClose)		; 关闭当前文件 */
#ifdef EN_DISK_WRITE
	EXTRN	CODE (CH375FileErase)		; 删除文件并关闭 */
	EXTRN	CODE (CH375FileCreate)		; 新建文件并打开,如果文件已经存在则先删除后再新建 */
#endif
	EXTRN	CODE (CH375FileModify)		; 查询或者修改当前文件的信息 */
	EXTRN	CODE (CH375FileLocate)		; 移动当前文件指针 */
	EXTRN	CODE (CH375FileReadX)		; 从当前文件读取数据到指定缓冲区 */
#ifdef EN_DISK_WRITE
	EXTRN	CODE (CH375FileWriteX)		; 向当前文件写入指定缓冲区的数据 */
#endif
#ifdef EN_BYTE_ACCESS
	EXTRN	CODE (CH375ByteLocate)		; 以字节为单位移动当前文件指针 */
	EXTRN	CODE (CH375ByteRead)		; 以字节为单位从当前位置读取数据块 */
#ifdef EN_DISK_WRITE
	EXTRN	CODE (CH375ByteWrite)		; 以字节为单位向当前位置写入数据块 */
#endif
#endif
	EXTRN	CODE (CH375DiskSize)		; 查询磁盘容量 */
	EXTRN	CODE (CH375DiskQuery)		; 查询磁盘信息 */
#ifdef EN_SAVE_VARIABLE
	EXTRN	CODE (CH375SaveVariable)	; 备份/保存/恢复子程序库的变量,用于子程序库在多个CH375芯片之间进行切换 */
#endif
	EXTRN	CODE (CH375BulkOnlyCmd)		; 执行基于BulkOnly协议的命令 */
	EXTRN	CODE (CH375sDiskReady)		; 查询磁盘是否准备好,支持CH375S */

; 该头文件可以为CH375子程序库分配必要的I/O及内存资源,并产生必要的与硬件有关的目标代码,
; 如果该文件是被工程项目的多个源程序包含作为头文件,那么应该只允许一个头文件分配资源和产生代码,
; 除此之外的头文件应该被事先定义CH375HF_NO_CODE,从而禁止该头文件产生重复的目标代码,例如:
; #define	CH375HF_NO_CODE		1
; $include	(CH375HF?.INC)

#ifdef CH375HF_NO_CODE

	EXTRN	IDATA (mCmdParam)			; 命令参数 */
	EXTRN	XDATA (CH375_CMD_PORT)		; CH375命令端口的I/O地址 */
	EXTRN	XDATA (CH375_DAT_PORT)		; CH375数据端口的I/O地址 */
#ifdef DISK_BASE_BUF_LEN
	EXTRN	XDATA (DISK_BASE_BUF)		; 外部RAM的磁盘数据缓冲区,缓冲区长度为一个扇区的长度 */
#endif
#ifdef FILE_DATA_BUF_LEN
	EXTRN	XDATA (FILE_DATA_BUF)		; 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
	EXTRN	CODE (CH375FileRead)		; 从当前文件读取数据 */
#ifdef EN_DISK_WRITE
	EXTRN	CODE (CH375FileWrite)		; 向当前文件写入数据 */
#endif
#endif
#ifndef NO_DEFAULT_CH375_F_ENUM
	EXTRN	CODE (CH375FileEnumer)		; 枚举文件 */
#endif
#ifndef NO_DEFAULT_CH375_F_QUERY
	EXTRN	CODE (CH375FileQuery)		; 查询当前文件的信息 */
#endif
	EXTRN	CODE (xQueryInterrupt)		; 外部定义的被CH375程序库调用的子程序,查询CH375中断并更新中断状态 */
	EXTRN	CODE (xDelay100uS)			; 外部定义的被CH375程序库调用的子程序,延时100uS */
#ifdef EN_DISK_WRITE
	EXTRN	CODE (xDelayAfterWrite)		; 外部定义的被CH375程序库调用的子程序,写操作后延时 */
#endif
	EXTRN	CODE (xFileNameEnumer)		; 外部定义的被CH375程序库调用的子程序,文件名枚举回调子程序 */
	EXTRN	CODE (CH375LibInit)			; 初始化CH375程序库和CH375芯片

#else

; ********************************************************************************************************************* */
; 外部定义的被CH375程序库调用的变量
	PUBLIC	mCmdParam					; 命令参数 */
	PUBLIC	CH375_CMD_PORT				; CH375命令端口的I/O地址 */
	PUBLIC	CH375_DAT_PORT				; CH375数据端口的I/O地址 */
#ifdef DISK_BASE_BUF_LEN
	PUBLIC	DISK_BASE_BUF				; 外部RAM的磁盘数据缓冲区,缓冲区长度为一个扇区的长度 */
#endif
#ifdef FILE_DATA_BUF_LEN
	PUBLIC	FILE_DATA_BUF				; 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
#endif

; ********************************************************************************************************************* */
; 变量定义
	RSEG  CH375LIB_IDATA
 mCmdParam:   DS   MAX_PATH_LEN			; 命令参数 */

	XSEG  AT  CH375_CMD_PORT_ADDR
 CH375_CMD_PORT:   DS   1				; CH375命令端口的I/O地址 */

	XSEG  AT  CH375_DAT_PORT_ADDR
 CH375_DAT_PORT:   DS   1				; CH375数据端口的I/O地址 */

#ifdef DISK_BASE_BUF_LEN
	XSEG  AT  DISK_BASE_BUF_ADDR
  DISK_BASE_BUF:   DS   DISK_BASE_BUF_LEN	; 外部RAM的磁盘数据缓冲区,缓冲区长度为一个扇区的长度 */
#endif

#ifdef FILE_DATA_BUF_LEN
	XSEG  AT  FILE_DATA_BUF_ADDR
  FILE_DATA_BUF:   DS   FILE_DATA_BUF_LEN	; 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
#endif

; ********************************************************************************************************************* */
; 默认的被CH375程序库调用的子程序定义
; 以下程序可以根据需要修改, 相关详细内容可以参考C程序头文件CH375HF6.H
	RSEG  CH375LIB_CODE

#ifdef FILE_DATA_BUF_LEN
	PUBLIC	CH375FileRead				; 从当前文件读取数据 */
; 从当前文件读取数据
CH375FileRead:		MOV		R0,#mCmdParam+8			;mCmdParam.ReadX.mDataBuffer
					MOV		@R0,#HIGH FILE_DATA_BUF	;指向文件数据缓冲区
					INC		R0
					MOV		@R0,#LOW FILE_DATA_BUF
					LJMP	CH375FileReadX
#ifdef EN_DISK_WRITE
	PUBLIC	CH375FileWrite				; 向当前文件写入数据 */
; 向当前文件写入数据
CH375FileWrite:		MOV		R0,#mCmdParam+8			;mCmdParam.WriteX.mDataBuffer
					MOV		@R0,#HIGH FILE_DATA_BUF	;指向文件数据缓冲区
					INC		R0
					MOV		@R0,#LOW FILE_DATA_BUF
					LJMP	CH375FileWriteX
#endif
#endif
;
#ifndef NO_DEFAULT_CH375_F_ENUM
; 在应用程序中定义NO_DEFAULT_CH375_F_ENUM可以禁止默认的枚举文件程序,然后用自行编写的程序代替它 */
	PUBLIC	CH375FileEnumer				; 枚举文件 */
; 枚举文件
CH375FileEnumer:	LCALL	CH375FileOpen
					CJNE	R7,#ERR_FOUND_NAME,CH375FileEnumer_0
					MOV		R7,#ERR_SUCCESS		; 操作成功 */
CH375FileEnumer_0:	RET
#endif
;
#ifndef NO_DEFAULT_CH375_F_QUERY
; 在应用程序中定义NO_DEFAULT_CH375_F_QUERY可以禁止默认的查询当前文件的信息程序,然后用自行编写的程序代替它 */
	PUBLIC	CH375FileQuery				; 查询当前文件的信息 */
; 查询当前文件的信息
CH375FileQuery:		MOV		R0,#mCmdParam
					MOV		R7,#10
CH375FileQuery_1:	MOV		@R0,#0FFH	; 输入参数全部无效,仅查询不修改 */
					INC		R0
					DJNZ	R7,CH375FileQuery_1
					LJMP	CH375FileModify
#endif
;
#ifndef NO_DEFAULT_CH375_INT
; 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */
	PUBLIC	xQueryInterrupt				; 外部定义的被CH375程序库调用的子程序,查询CH375中断并更新中断状态 */
; CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断
;xQueryInterrupt:	MOV		A,CH375IntStatus		; 该子程序用于"中断方式",查询中断状态,等待硬件中断
;					JZ		xQueryInterrupt			; 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回
;					RET
InterruptHandle:	PUSH    PSW						; 中断服务程序,如果使用"中断方式",请在中断向量处执行一个跳转到此
					PUSH    ACC
					PUSH    DPL
					PUSH    DPH
					CALL    xQueryInterrupt_1
					POP     DPH
					POP     DPL
					POP     ACC
					POP     PSW
					RETI
; 查询CH375中断并更新中断状态
#ifdef CH375_INT_WIRE
xQueryInterrupt:	JB   	CH375_INT_WIRE,$		; 该子程序用于"查询方式",查询CH375的INT#引脚,如果CH375的中断引脚输出高电平则等待
#else
xQueryInterrupt:	MOV  	DPTR,#CH375_CMD_PORT	; 该子程序用于"查询方式",查询CH375的INT#引脚,如果CH375的中断引脚输出高电平则等待
					MOVX  	A,@DPTR					; 对于CH375B芯片还可以查询命令端口的位7
					JB   	ACC.7,xQueryInterrupt	; 查询CH375B的命令端口的位7为1说明中断引脚输出高电平则等待
#endif
xQueryInterrupt_1:	MOV  	DPTR,#CH375_CMD_PORT
					MOV  	A,#CMD_GET_STATUS
					MOVX 	@DPTR,A					; 获取当前中断状态 */
					INC     DPTR
					INC     DPTR					; 操作无意义,用于至少延时2uS */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -