?? 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 + -