工程师,你好!请教一个问题,在检测到U盘并延时几百毫秒后,对设备发送DISK_READY命令后返回的中断状态怎么没有变化,不是USB_INT_SUCCESS,而是之前的USB_INT_CONNECT?由于毕设时间较为紧张,希望工程师能尽快帮帮我。谢谢。
首先你需要做的是DISK-INIT这个命令,操作成功之后在做DISK-SIZE命令,最后才操作DISK-READY,如果返回不是SUCESS的话,那么你可以使用R-SENSE这个命令,延时200MS之后在重新做DISK-READY。
如果你需要对文件操作,建议你还是用我们提供的库来做。 操作物理磁盘,你可以参考CH375EVT.ZIP,里面有一个文件CH375EV0.C
谢谢两位的回复。我是采用CH375HF4.lib API来设计程序的,只是出现问题才想使用直接写命令查看具体的问题是什么。我是先调用了CH375LibInit,并且能够检测USB连接,然后按照1楼的次序写命令DISK_SIZE,CH375IntStatus的值还是连接USB设备的返回值(0x15),然后写命令DISK_READY就返回一个USB存储器操作失败的值(0x1F),这是什么问题?
既然用库了,就不要再用底层的测试命令去分析问题了,出错只要监控库函数的返回值是多少,大部分在头文件中有说明,现在是哪步出错了
你可以按照下面的程序来初始化U盘应该就可以了,还有不建议你使用CH375HF4.LIB,建议你使用CH375HF6.LIB这个库来调试: 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; /* 出现错误 */ /*这里需要加上这个之后才可以,正确的做法也是这样*/ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 获取USB存储器的容量 */ mDelaymS( 250 ); if(j==5) return(Status); } 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; /* 出现错误 */ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 获取USB存储器的容量 */ mDelaymS( 250 ); } return( 0 ); /* U盘已经成功初始化 */ }
用楼上的方法还是有问题,当执行到err = CH375DiskReady();时,仍像原来的一样不能往下运行,而一直在xQueryInterrupt函数里面查询中断的状态,根本没法监控函数的返回值。 for (i = 0; i < 5; i++) { delay_ms(200); err = CH375DiskReady(); if (ERR_SUCCESS == err) break; }
CH375_INT_WIRE定义与硬件连接是否一致
USB信号线有没有接反VCC,D-,D+,GND, U盘连接之后,D+在3V左右,D-在0V左右。