关于读取U盘容量

我也是参考CH375ev0—3.zip的例程自己编的程序。初始化U盘成功后,总是无法成功读取U盘容量,继续执行下去只能读写不到一半的U盘。输入读取U盘容量命令后,是返回的14H,但是再返回长度就不是正常的8。而是32。并且读取不出容量,只能读出14h。请问如果能成功返回容量就能进一步提高兼容性吗?如何正常读取?

读容量是必要步骤,必须成功,无法分析扇区的大小。 估计还是程序问题,先直接用我们的例程,根据你的硬件,修改一下375的地址和中断线,根据单片机主频调整一下微/毫秒延时


你参考CH375EV0.C. 程序不好改动过大,流程是标准的.每一步骤都是必须的,延时也很重要.你在获取容量之前,获取一次中断状态.然后看能否成功. 一般获取磁盘容量能返回成功就可以正确读出数据.


谢谢,我试试


没法,写入获取容量指令后,中断状态是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 ;测试状态是否正常 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 ;读中断状态 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 ;读中断状态 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缓冲区读取数据块 */ STB A,CH375_CMD_PORT

LDB SSI,CH375_DAT_PORT ; /* 后续数据的长度 */\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; ; /* 扇区数 */ MULUB R10,#8 ;叁扇区数×中断数 ; JBC POR2,2,$ MREADS3: LCALL DIS_ZERO_16H ;延时 LDB A,#CMD_GET_STATUS ;读中断状态并获取状态,请求数据写入 STB A,CH375_CMD_PORT LDB A,CH375_DAT_PORT ; 读

CMPB A,#1DH ;是否是读 JNE MREADS

LDB A,#CMD_RD_USB_DATA ; /*往CH375缓冲区写入数据块 */ STB A,CH375_CMD_PORT

LDB SSI,CH375_DAT_PORT ; /* 后续数据的长度 */

MREADS4: MREADS5: LDB A,CH375_DAT_PORT STB A,[W5]+ DJNZ SSI,MREADS5 MREADS6: LDB A,#CMD_DISK_RD_GO ; /* 继续执行USB存储器的读操作 */ STB A,CH375_CMD_PORT

DJNZ R10,MREADS3 ; JBC POR2,2,$ MREADS9: LDB C,#CMD_GET_STATUS ;读中断状态并获取状态,请求数据读出 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; ; /* 扇区数 */ STB C,CH375_DAT_PORT; MULUB C,#8 ;叁扇区数×中断数

MWRIT3: LCALL DIS_ZERO_16H LDB A,#CMD_GET_STATUS ;读中断状态并获取状态,请求数据写入 STB A,CH375_CMD_PORT

LDB A,CH375_DAT_PORT;@ ; 读 CMPB a,#1EH JNE MWRITS

LDB A,#CMD_WR_USB_DATA7 ; /*往CH375缓冲区写入数据块 */ STB A,CH375_CMD_PORT

LDB A,DDI ; /* 后续数据的长度 */ 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 ; /* 继续执行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 ;读中断状态并获取状态,请求数据读出 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盘错误状态的指令。 但是我也是尝试用分析U盘错误状态的指令,但是返回14h 在延时,返回 仍然不行 这种情况到底改如何处理,谢谢


你这个MCU速度是多少的?命令与命令,命令与数据,数据与数据之间要有延时的,你这里面根本一点延时都没有,请参考CH375DS1


12Mhz晶振,状态周期是250ns,请问具体延时方法?


程序做个延时函数就可以了.写完数据,写完命令都是需要加延时.保证命令与命令,命令与数据,之间延时为1.5US,数据与数据之间为0.6US


(1)整个初始化流程与我们的C例程别很大,在未熟悉操作U盘流程之前,请严格按照我们的流程去做。 (2)建议把写命令、写数据、读数据都写成子函数的形式,这三个函数延时方法,例程中都有啊,看看CH375EV0.C中的CH375_WR_CMD_PORT、CH375_WR_DAT_PORT、CH375_RD_DAT_PORT


谢谢,唉,我也加过延时。都是延时2US,好像还是能行的行,不行的还是不行。


记得你们在别的帖子里回答;如果无法返回容量,就执行DISK_R_SENSE命令,然后延时200MS,再读取。请问执行DISK_R_SENSE命令后,是否要读出数据分析错误,或者直接延时后又会去重新执行读取U盘容量的指令


这个不需要你去分析,我们芯片内部自己去分析的。还有一个很重要的问题就是你的MS级的延时也需要相对的准确点,如果出现错误就发送DISK_R_SENSE重新来过。


只有登录才能回复,可以选择微信账号登录