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

📄 ch375hf4.inc

📁 USB芯片CH375EVT 资料源程序
💻 INC
📖 第 1 页 / 共 4 页
字号:
;   方式3:"单DPTR和P2+R0复制", 用P2+R0指向CH375的I/O端口并且用DPTR指向外部RAM进行数据复制, 每传输一个字节需要6.25个机器周期, 速度最快,
;                       适用于所有标准的MCS51单片机, 但是某些单片机在启用内置的外部RAM时会关闭P2+R0的功能, 所以可能不适用,
;   对于文件数据读写,也就是应用程序调用CH375FileReadX和CH375FileWriteX子程序时:
;     在方式0下,由应用程序在xWriteToExtBuf和xReadFromExtBuf子程序中自行管理缓冲区,设定缓冲区初值等,
;     在方式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
	EXTRN	DATA	(CH375vDataStart)	;逻辑盘的数据区域的起始LBA,UINT32
	EXTRN	DATA	(CH375vFdtLba)		;当前FDT所在的LBA地址,UINT32
	EXTRN	DATA	(CH375vFdtOffset)	;当前FDT在扇区内的偏移地址,UINT16
	EXTRN	XDATA	(CH375vDiskRoot)	;对于FAT16盘为根目录占用扇区数,对于FAT32盘为根目录起始簇号,UINT32

	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都可能会用到磁盘数据缓冲区DISK_BASE_BUF,
;  并且有可能在DISK_BASE_BUF中保存了磁盘信息, 所以必须保证DISK_BASE_BUF不被用于其它用途,
;  如果RAM较少, 要将DISK_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地址 */
	EXTRN	XDATA (DISK_BASE_BUF)		; 外部RAM的磁盘数据缓冲区,缓冲区长度为一个扇区的长度 */
#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地址 */
	PUBLIC	DISK_BASE_BUF				; 外部RAM的磁盘数据缓冲区,缓冲区长度为一个扇区的长度 */
#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地址 */

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

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

; ********************************************************************************************************************* */
; 外部定义的被CH375程序库调用的子程序
	PUBLIC	xQueryInterrupt				; 外部定义的被CH375程序库调用的子程序,查询CH375中断并更新中断状态 */
	PUBLIC	xDelay100uS					; 外部定义的被CH375程序库调用的子程序,延时100uS */
#ifdef EN_DISK_WRITE
	PUBLIC	xDelayAfterWrite			; 外部定义的被CH375程序库调用的子程序,写操作后延时 */
#endif
	PUBLIC	xFileNameEnumer				; 外部定义的被CH375程序库调用的子程序,文件名枚举回调子程序 */
#ifdef FILE_DATA_BUF_LEN
	PUBLIC	_xWriteToExtBuf				; 外部定义的被CH375程序库调用的子程序,从CH375读取文件数据到外部缓冲区 */
#ifdef EN_DISK_WRITE
	PUBLIC	_xReadFromExtBuf			; 外部定义的被CH375程序库调用的子程序,从外部缓冲区读取文件数据到CH375 */
#endif
#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可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */
; 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中断并更新中断状态
xQueryInterrupt:	JB   	CH375_INT_WIRE,$		; 该子程序用于"查询方式",查询CH375的INT#引脚,如果CH375的中断引脚输出高电平则等待
xQueryInterrupt_1:	MOV  	DPTR,#CH375_CMD_PORT
					MOV  	A,#CMD_GET_STATUS
					MOVX 	@DPTR,A					; 获取当前中断状态 */
					INC     DPTR
					INC     DPTR					; 操作无意义,用于至少延时2uS */
					INC     DPTR
					MOV  	DPTR,#CH375_DAT_PORT
					MOVX 	A,@DPTR					; 获取中断状态 */
					MOV  	CH375IntStatus,A

⌨️ 快捷键说明

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