📄 ch375hfa.inc
字号:
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 + -