我也是參考CH375ev0—3.zip的例程自己編的程序。初始化U盤成功后,總是無法成功讀取U盤容量,繼續(xù)執(zhí)行下去只能讀寫不到一半的U盤。輸入讀取U盤容量命令后,是返回的14H,但是再返回長度就不是正常的8。而是32。并且讀取不出容量,只能讀出14h。請問如果能成功返回容量就能進一步提高兼容性嗎?如何正常讀???
讀容量是必要步驟,必須成功,無法分析扇區(qū)的大小。 估計還是程序問題,先直接用我們的例程,根據你的硬件,修改一下375的地址和中斷線,根據單片機主頻調整一下微/毫秒延時
你參考CH375EV0.C. 程序不好改動過大,流程是標準的.每一步驟都是必須的,延時也很重要.你在獲取容量之前,獲取一次中斷狀態(tài).然后看能否成功. 一般獲取磁盤容量能返回成功就可以正確讀出數據.
謝謝,我試試
沒法,寫入獲取容量指令后,中斷狀態(tài)是14h,但是讀出的長度顯然不對,仍然是14h,我寫入R_SENCES后,延時200MS,再寫入獲取容量指令。結果還是一樣
把你的讀寫函數貼出來看看,可能是讀寫函數時序不對.你有沒有做過測試命令?測試命令能正確返回嗎
行,測試命令做了,能返回相反的數字 ;***************************************************************************** MININTDISK: ;初始化U盤 LDB A,#CMD_SET_USB_MODE ;設定工作模式6 STB A,CH375_CMD_PORT
LDB A,#06H STB A,CH375_DAT_PORT;
LCALL delay50ms; ;僅僅為了延時 LDB A,CH375_DAT_PORT;@
CMPB A,#51H ;是否操作成功 JNE MININTDISK
MININTDISK2: LDB A,#CMD_SET_CHK_EXIST STB A,CH375_CMD_PORT
LDB A,#57H STB A,CH375_DAT_PORT; LDB A,CH375_DAT_PORT ; ;變反與F0比,并返回值
CMPB A,#0A8H ;測試狀態(tài)是否正常 JNE MININTDISK2
MININTDISK3: LDB A,#CMD_SET_USB_MODE ;設定工作模式7 STB A,CH375_CMD_PORT LDB A,#07H STB A,CH375_DAT_PORT;
LCALL delay50ms;DIS_ZERO_16H ;僅僅為了延時 LDB A,#CMD_SET_USB_MODE ;設定工作模式6 STB A,CH375_CMD_PORT LDB A,#06H STB A,CH375_DAT_PORT; ; LCALL DIS_ZERO_16H ;僅僅為了延時 ;USB存儲設備復位 MININTDISK4:
LDB A,#CMD_DISK_INIT ;初始化USB STB A,CH375_CMD_PORT
; JBC POR2,2,$ LDB A,#CMD_GET_STATUS ;讀中斷狀態(tài) STB A,CH375_CMD_PORT LDB A,CH375_DAT_PORT;@ ; 讀 CMPB A,#14H JNE MININTDISK4 MININTDISK5:
LDB A,#CMD_DISK_SIZE ;獲取U盤容量 STB A,CH375_CMD_PORT
; JBC POR2,2,$ LDB A,#CMD_GET_STATUS ;讀中斷狀態(tài) STB A,CH375_CMD_PORT LDB A,CH375_DAT_PORT;@ ; 讀 CMPB A,#14H JNE MININTDISK5 MININTDISK6: LD W5,#AR_DATA LDB A,#CMD_RD_USB_DATA ; /*從CH375緩沖區(qū)讀取數據塊 */ STB A,CH375_CMD_PORT
LDB SSI,CH375_DAT_PORT ; /* 后續(xù)數據的長度 */\CMPB LCALL DELAY50MS LCALL DELAY50MS LCALL DELAY50MS LCALL DELAY50MS CMPB SSI,#8 ;判斷是否數據長度是8 JE MININTDISK7 lcall delay50ms ;否則延時200ms,再重新來 lcall delay50ms lcall delay50ms lcall delay50ms
SJMP MININTDISK5
MININTDISK7: LDB A,CH375_DAT_PORT STB A,[W5]+ DJNZ SSI,MININTDISK7 LD CHA_ZB,#30*10+8 ;坐標(5,9):縱向第5行、橫向第9列 ;O K LDB R5,#10 ;字符串 長度 LD DDX,#OKZF ;字符串內碼位置 LCALL CHAR0 ;調用寫字符子程序
RET
;*************************/* 從USB存儲器讀數據塊 */************************ MREADS:
LDB R10,C
LDB A,#CMD_DISK_READ ;讀數據 STB A,CH375_CMD_PORT MREADS2: ;/* LBA的最低8位 */ STB W1,CH375_DAT_PORT; STB W2,CH375_DAT_PORT; STB W3,CH375_DAT_PORT; STB W4,CH375_DAT_PORT; STB R10,CH375_DAT_PORT; ; /* 扇區(qū)數 */ MULUB R10,#8 ;叁扇區(qū)數×中斷數 ; JBC POR2,2,$ MREADS3: LCALL DIS_ZERO_16H ;延時 LDB A,#CMD_GET_STATUS ;讀中斷狀態(tài)并獲取狀態(tài),請求數據寫入 STB A,CH375_CMD_PORT LDB A,CH375_DAT_PORT ; 讀
CMPB A,#1DH ;是否是讀 JNE MREADS
LDB A,#CMD_RD_USB_DATA ; /*往CH375緩沖區(qū)寫入數據塊 */ STB A,CH375_CMD_PORT
LDB SSI,CH375_DAT_PORT ; /* 后續(xù)數據的長度 */
MREADS4: MREADS5: LDB A,CH375_DAT_PORT STB A,[W5]+ DJNZ SSI,MREADS5 MREADS6: LDB A,#CMD_DISK_RD_GO ; /* 繼續(xù)執(zhí)行USB存儲器的讀操作 */ STB A,CH375_CMD_PORT
DJNZ R10,MREADS3 ; JBC POR2,2,$ MREADS9: LDB C,#CMD_GET_STATUS ;讀中斷狀態(tài)并獲取狀態(tài),請求數據讀出 STB C,CH375_CMD_PORT LDB C,CH375_DAT_PORT CMPB C,#14H JNE MREADS9
MREADS7: RET ;*************************/* 向USB存儲器寫數據塊 */************************ MWRITS: LDB A,#CMD_DISK_WRITE ;讀數據 STB A,CH375_CMD_PORT
MWRIT2: ;/* LBA的最低8位 */ STB W1,CH375_DAT_PORT; STB W2,CH375_DAT_PORT; STB W3,CH375_DAT_PORT; STB W4,CH375_DAT_PORT; ; /* 扇區(qū)數 */ STB C,CH375_DAT_PORT; MULUB C,#8 ;叁扇區(qū)數×中斷數
MWRIT3: LCALL DIS_ZERO_16H LDB A,#CMD_GET_STATUS ;讀中斷狀態(tài)并獲取狀態(tài),請求數據寫入 STB A,CH375_CMD_PORT
LDB A,CH375_DAT_PORT;@ ; 讀 CMPB a,#1EH JNE MWRITS
LDB A,#CMD_WR_USB_DATA7 ; /*往CH375緩沖區(qū)寫入數據塊 */ STB A,CH375_CMD_PORT
LDB A,DDI ; /* 后續(xù)數據的長度 */ STB A,CH375_DAT_PORT
LD adI,ddi MWRIT4: MWRIT5: LDB A,[W5]+ STB A,CH375_DAT_PORT ; LCALL delay50ms; ; LD AD_VAL,#09a1h DJNZ adI,MWRIT5 ; LD AD_VAL,#0a2h ; LCALL DIS_ZERO_16H ; LCALL INT16H MWRIT6: LDB A,#CMD_DISK_WR_GO ; /* 繼續(xù)執(zhí)行USB存儲器的讀操作 */ STB A,CH375_CMD_PORT ; LCALL delay50ms; DJNZ C,MWRIT3 LD AD_VAL,#09a3h LCALL DIS_ZERO_16H ; LCALL INT16H ; JBC POR2,2,$ MWRIT9: LDB C,#CMD_GET_STATUS ;讀中斷狀態(tài)并獲取狀態(tài),請求數據讀出 STB C,CH375_CMD_PORT LDB C,CH375_DAT_PORT CMPB C,#14H JNE MWRIT9 ;返回A=0操作成功 LD AD_VAL,#09a4h LCALL DIS_ZERO_16H MWRIT7: RET ;*********************************************************************************************
該程序中在返回長度不是8時, 我直接延時200ms就又重新返回讀U盤容量, 而沒有用分析U盤錯誤狀態(tài)的指令。 但是我也是嘗試用分析U盤錯誤狀態(tài)的指令,但是返回14h 在延時,返回 仍然不行 這種情況到底改如何處理,謝謝
你這個MCU速度是多少的?命令與命令,命令與數據,數據與數據之間要有延時的,你這里面根本一點延時都沒有,請參考CH375DS1
12Mhz晶振,狀態(tài)周期是250ns,請問具體延時方法?
程序做個延時函數就可以了.寫完數據,寫完命令都是需要加延時.保證命令與命令,命令與數據,之間延時為1.5US,數據與數據之間為0.6US
(1)整個初始化流程與我們的C例程別很大,在未熟悉操作U盤流程之前,請嚴格按照我們的流程去做。 (2)建議把寫命令、寫數據、讀數據都寫成子函數的形式,這三個函數延時方法,例程中都有啊,看看CH375EV0.C中的CH375_WR_CMD_PORT、CH375_WR_DAT_PORT、CH375_RD_DAT_PORT
謝謝,唉,我也加過延時。都是延時2US,好像還是能行的行,不行的還是不行。
記得你們在別的帖子里回答;如果無法返回容量,就執(zhí)行DISK_R_SENSE命令,然后延時200MS,再讀取。請問執(zhí)行DISK_R_SENSE命令后,是否要讀出數據分析錯誤,或者直接延時后又會去重新執(zhí)行讀取U盤容量的指令
這個不需要你去分析,我們芯片內部自己去分析的。還有一個很重要的問題就是你的MS級的延時也需要相對的準確點,如果出現錯誤就發(fā)送DISK_R_SENSE重新來過。