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