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

📄 ch375hfa.inc

📁 CH375接口程序示例(3),对于单片机读写U盘有帮助,对单片机播放MP3和MP4有帮助.
💻 INC
📖 第 1 页 / 共 3 页
字号:
	EXTRN	CODE (CH375ByteRead)		; 以字节为单位从当前位置读取数据块 */
#ifdef EN_DISK_WRITE
	EXTRN	CODE (CH375ByteWrite)		; 以字节为单位向当前位置写入数据块 */
#endif
#endif
	EXTRN	CODE (CH375BulkOnlyCmd)		; 执行基于BulkOnly协议的命令 */
	EXTRN	CODE (CH375DiskReady)		; 查询磁盘是否准备好 */
	EXTRN	CODE (CH375DiskConnect)		; 检查磁盘是否连接 */

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

#ifdef CH375HF_NO_CODE

	EXTRN	XDATA (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
	EXTRN	CODE (xQueryInterrupt)		; 外部定义的被CH375程序库调用的子程序,查询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的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
	PUBLIC	CH375FileRead				; 从当前文件读取数据 */
#ifdef EN_DISK_WRITE
	PUBLIC	CH375FileWrite				; 向当前文件写入数据 */
#endif
#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	_xWriteToExtBuf				; 外部定义的被CH375程序库调用的子程序,从CH375读取文件数据到外部缓冲区 */
#ifdef EN_DISK_WRITE
	PUBLIC	_xReadFromExtBuf			; 外部定义的被CH375程序库调用的子程序,从外部缓冲区读取文件数据到CH375 */
#endif

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

#ifdef FILE_DATA_BUF_LEN
; 从当前文件读取数据
CH375FileRead:		MOV		DPTR,#mCmdParam+8			;mCmdParam.ReadX.mDataBuffer
					MOV		A,#HIGH FILE_DATA_BUF		;指向文件数据缓冲区
					MOVX	@DPTR,A
					INC		DPTR
					MOV		A,#LOW FILE_DATA_BUF
					MOVX	@DPTR,A
					JMP		CH375FileReadX
#ifdef EN_DISK_WRITE
; 向当前文件写入数据
CH375FileWrite:		MOV		DPTR,#mCmdParam+8			;mCmdParam.WriteX.mDataBuffer
					MOV		A,#HIGH FILE_DATA_BUF		;指向文件数据缓冲区
					MOVX	@DPTR,A
					INC		DPTR
					MOV		A,#LOW FILE_DATA_BUF
					MOVX	@DPTR,A
					JMP		CH375FileWriteX
#endif
#endif
;
; CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断
;xQueryInterrupt:	MOV		DPTR,#CH375IntStatus	; 该子程序用于"中断方式",查询中断状态,等待硬件中断
;					MOVX	A,@DPTR
;					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  	DPTR,#CH375IntStatus
					MOVX    @DPTR,A
					MOV  	DPTR,#CH375DiskStatus
					CJNE 	A,#ERR_USB_DISCON,QUERY_INT_DISCON
					MOV  	A,#DISK_DISCONNECT		; 检测到USB设备断开事件 */
					MOVX    @DPTR,A
					RET
QUERY_INT_DISCON:	CJNE 	A,#ERR_USB_CONNECT,QUERY_INT_CONNECT
					MOV  	A,#DISK_CONNECT			; 检测到USB设备连接事件 */
					MOVX    @DPTR,A
					RET
QUERY_INT_CONNECT:	RET
;
; 该子程序由CH375的子程序库调用,用于从CH375读取文件数据到外部缓冲区,被CH375FileReadX调用 */
_xWriteToExtBuf:	RET								;如果文件读写的数据的复制方式不是"外部子程序",则不会调用该子程序
;
; 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWriteX调用 */
_xReadFromExtBuf:	RET								;如果文件读写的数据的复制方式不是"外部子程序",则不会调用该子程序
;
; ********************************************************************************************************************* */
; 供主程序调用的子程序
	PUBLIC	CH375LibInit
; 初始化CH375程序库和CH375芯片, 操作完成后返回状态码在R7中, 操作成功返回0
CH375LibInit:		MOV  	A,SP
					SETB  	C
					SUBB 	A,#0F0H					; CH375子程序库最多可能有7级子程序,查询方式最多需要14字节的堆栈空间,建议提供余量
					JC  	CH375LibInit_SP			; 单片机的堆栈空间不够
					MOV  	R7,#0FCH				; 当前子程序库的版本号太低则返回错误
					RET
CH375LibInit_SP:	MOV     DPTR,#CH375LibConfig
					MOV  	A,#LIB_CFG_VALUE		; CH375程序库配置值
					MOVX    @DPTR,A
					MOV     DPTR,#DISK_BASE_BUF
					MOVX    A,@DPTR					; 该操作无意义,只是为了防止编译器优化时不产生DISK_BASE_BUF缓冲区
					LCALL	CH375GetVer				; 获取当前子程序库的版本号
					MOV  	A,R7
					CLR  	C
					SUBB 	A,#CH375_LIB_VER
					JNC  	CH375LibInit_GOON
					MOV  	R7,#0FFH				; 当前子程序库的版本号太低则返回错误
					RET
CH375LibInit_GOON:	LCALL	CH375Init				; 初始化CH375
					RET  	
;
; ********************************************************************************************************************* */
; 以下被CH375程序库用到的子程序,来自C51的程序库C51S.LIB
; 如果没有下面这些子程序(将其注释掉), 那么链接方法是: LX51  CH375HFT.OBJ , CH375HF4.LIB, C51S.LIB
; 如果有下面这些子程序, 那么链接方法是: LX51  CH375HFT.OBJ , CH375HF4.LIB
; 建议, 如果应用程序也用到C51S.LIB中的子程序, 那么将下面这些内容注释掉, 防止链接时出现同名冲突
	PUBLIC	?C?ULCMP
?C?ULCMP:			MOV   A,R3
					SUBB  A,R7
					MOV   B,A
					MOV   A,R2
					SUBB  A,R6
					ORL   B,A
					MOV   A,R1
					SUBB  A,R5
					ORL   B,A
					MOV   A,R0
					SUBB  A,R4
					ORL   A,B
					RET
	PUBLIC	?C?ULSHR
?C?ULSHR:			MOV   A,R0
					JZ    ?C?ULSHR_RET
?C?ULSHR_LOOP:		MOV   A,R4
					CLR   C
					RRC   A
					MOV   R4,A
					MOV   A,R5
					RRC   A
					MOV   R5,A
					MOV   A,R6
					RRC   A
					MOV   R6,A
					MOV   A,R7
					RRC   A
					MOV   R7,A
					DJNZ  R0,?C?ULSHR_LOOP
?C?ULSHR_RET:		RET
	PUBLIC	?C?LSHL
?C?LSHL:			MOV   A,R0
					JZ    ?C?LSHL_RET
?C?LSHL_LOOP:		MOV   A,R7
					CLR   C
					RLC   A
					MOV   R7,A
					MOV   A,R6
					RLC   A
					MOV   R6,A
					MOV   A,R5
					RLC   A
					MOV   R5,A
					MOV   A,R4
					RLC   A
					MOV   R4,A
					DJNZ  R0,?C?LSHL_LOOP
?C?LSHL_RET:		RET
	PUBLIC	?C?LSTXDATA
?C?LSTXDATA:		MOV   A,R4
					MOVX  @DPTR,A
					INC   DPTR
					MOV   A,R5
					MOVX  @DPTR,A
					INC   DPTR
					MOV   A,R6
					MOVX  @DPTR,A
					INC   DPTR
					MOV   A,R7
					MOVX  @DPTR,A
					RET
	PUBLIC	?C?LSTKXDATA
?C?LSTKXDATA:		MOV   R0,DPL
					MOV   B,DPH
					POP   DPH
					POP   DPL
					LCALL ?C?LSTKXDAT_BYTE
					LCALL ?C?LSTKXDAT_BYTE
					LCALL ?C?LSTKXDAT_BYTE
					LCALL ?C?LSTKXDAT_BYTE
					CLR   A
					JMP   @A+DPTR
?C?LSTKXDAT_BYTE:	CLR   A
					MOVC  A,@A+DPTR
					INC   DPTR
					XCH   A,DPH
					XCH   A,B
					XCH   A,DPH
					XCH   A,R0
					XCH   A,DPL
					XCH   A,R0
					MOVX  @DPTR,A
					INC   DPTR
					XCH   A,DPH
					XCH   A,B
					XCH   A,DPH
					XCH   A,R0
					XCH   A,DPL
					XCH   A,R0
					RET
; 以上是被CH375程序库用到的子程序,来自C51的程序库C51S.LIB,如果去掉这些子程序,那么链接时要加上C51S.LIB
;
#endif
;

⌨️ 快捷键说明

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