[求助]自己写的程序有点问题.

由于自己用的单片机只有128个字节的内存,没法用提供的文件级接口,只好自己写低层的程序,但老出问题,

CH375_WR EQU P3.6 ;0,写 CH375_RD EQU P3.7 ;0,读 CH375_A0 EQU P2.0 ;1,命令 0,数据 CH375_CS EQU P2.2 CH375_IN EQU 33H CH375_OUT EQU R5

CH375_INPUT_CMD: SETB CH375_RD CLR CH375_WR SETB CH375_A0 LCALL OPEAN_CH375 MOV P1,CH375_IN NOP LCALL CLOSE_CH375 NOP LCALL CLOSE_CH375 RET

CH375_INPUT_DATA: SETB CH375_RD CLR CH375_WR CLR CH375_A0 LCALL OPEAN_CH375 MOV P1,CH375_IN NOP LCALL CLOSE_CH375 RET

CH375_READ_DATA:MOV P1,#0FFH SETB CH375_WR CLR CH375_RD CLR CH375_A0 LCALL OPEAN_CH375 LCALL DEL_5UMS MOV CH375_OUT,P1 NOP LCALL CLOSE_CH375 RET

OPEAN_CH375:CLR CH375_CS NOP RET

CLOSE_CH375:SETB CH375_CS RET 以上是基本的函数,再开始设置ch375工作状态

     MOV CH375_IN,#15H LCALL CH375_INPUT_CMD

MOV CH375_IN,#06H LCALL CH375_INPUT_DATA

LCALL DEL_10UMS LCALL DEL_10UMS

LCALL CH375_READ_DATA 先写入 #15H 的命令,再写入 #06H 的数据,再读时,得到的是 14H ,而不是 51H,或 5FH,不知道为什么? [Emot]1[/Emot]

读写子函数有点问题: CH375_INPUT_CMD: MOV P1,CH375_IN SETB CH375_A0 SETB CH375_RD LCALL OPEAN_CH375 CLR CH375_WR NOP //对于高速单片机,该指令用于延时,以便向CH375_WR产生宽度至少为80nS的低电平脉冲 SET CH375_WR LCALL CLOSE_CH375 CLR CH375_A0 LCALL DELAY2US -------------延时2um左右 RET CH375_INPUT_DATA: MOV P1,CH375_IN SETB CH375_RD LCALL OPEAN_CH375 CLR CH375_WR NOP SET CH375_WR LCALL CLOSE_CH375 LCALL DELAY2US RET CH375_READ_DATA: MOV P1,#0FFH LCALL OPEAN_CH375 SETB CH375_WR CLR CH375_RD LCALL OPEAN_CH375 //用来延时 MOV CH375_OUT,P1 SET CH375_RD LCALL CLOSE_CH375 RET


先做测试命令CHECK-EXIST命令成功之后在设置模式


谢谢,设置模式成功了!


测试命令CHECK-EXIST命令也成功了,谢谢指点!


在设置模式成功后,联上U盘,应该会产生中断吧? 接下来进行的磁盘初始化不能成功,请高手指点,谢谢! USB_INT:JB INT0,$ SETB INT0     MOV CH375_IN,#22H     LCALL CH375_INPUT_CMD     NOP     LCALL CH375_READ_DATA     CJNE CH375_OUT,#15H,USB_INT     MOV CH375_IN,#51H     LCALL CH375_INPUT_CMD     JB INT0,$ SETB INT0     MOV CH375_IN,#22H     LCALL CH375_INPUT_CMD     NOP     LCALL CH375_READ_DATA     CJNE CH375_OUT,#14H,U_I_STP  /*显示成功*/     MOV DPTR,#LOOP3     LCALL PUTSTR     RET U_I_STP:MOV DPTR,#LOOP4      /*显示失败*/     LCALL PUTSTR     RET


初始化U盘按照下面的流程来操作: UINT8 mInitDisk( void ) { /* 初始化磁盘 */ UINT8 Status,i,j=0; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ Status = CH375_RD_DAT_PORT( ); if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB设备断开 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出现错误 */ while(1){j++; CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ) break; /* 出现错误 */ mDelaymS( 250 ); if(j==5) return(Status); } CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 获取USB存储器的容量 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ){ /* 出现错误 */ for(i=0;i!=5;i++){ printf("Ready\n"); CH375_WR_CMD_PORT( CMD_DISK_READY ); /* 获取USB存储器的容量 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ) break; /* 出现错误 */ } } return( 0 ); /* U盘已经成功初始化 */ }


请问,我对USB进行初始化时,不获取USB存储器的容量可以吗?


输入初始化命令后,总是得到 2CH,不知道,这是什么状态?


2CH是返回超时了,主要有下面几种情况: 1,UD+,UD-串接的电阻太大,从而导致USB的UD+和UD-的电压降的太多,从而不工作 2,中断脚没有连接的时候也是会出现这种情况的


但是,在UD+,UD-上,我没串接电阻。 有时输入初始化命令后,得到 20H。 有什么解决方法?


20H也是超时状态, 先在确定U盘连接后加数百毫秒延时


延时了400ms还是显示2cH


哪位高手能帮帮忙,谢谢!


将你的程序发到技术信箱看下:tech@wch.cn


会不会是时序上的问题,我的U盘初始化的测试程序已经发过去了。

还有硬件上的连接会不会引起U盘初始化失败,我将CH375焊在通用板上,再于单片机模块连接,布线不是很简洁,D+,D-与CH375的连线就有点长。

请指教!


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