我最近拿到一個(gè)U盤(pán),發(fā)現(xiàn)CMD_DISK_READY指令無(wú)法通過(guò),發(fā)出該指令后,等待中斷獲得的狀態(tài)碼為0x1f,前面我對(duì)U盤(pán)進(jìn)行CMD_DISK_INIT指令時(shí)成功的,返回0x14。
你按照下面的例子程序來(lái)進(jìn)行操作看可以不可以: UINT8 mInitDisk( void ) { /* 初始化磁盤(pán) */ UINT8 Status,i,j=0; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ Status = CH375_RD_DAT_PORT( ); if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB設(shè)備斷開(kāi) */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲(chǔ)器 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯(cuò)誤 */ while(1){j++; CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯(cuò)誤 */ /*這里需要加上這個(gè)之后才可以,正確的做法也是這樣*/ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* */ mDelaymS( 250 ); if(j==5) return(Status); } Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ){ /* 出現(xiàn)錯(cuò)誤 */ for(i=0;i!=5;i++){ printf("Ready\n"); CH375_WR_CMD_PORT( CMD_DISK_READY ); /* */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯(cuò)誤 */ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* */ mDelaymS( 250 ); } } return( 0 ); /* U盤(pán)已經(jīng)成功初始化 */ }
這個(gè)問(wèn)題暫時(shí)沒(méi)法解決了,U盤(pán)燒掉了>_
不明白為什么要獲取USB存儲(chǔ)容量?而且為什么不能獲得這個(gè)值U盤(pán)就算初始化失敗呢?
實(shí)際上之所以這樣說(shuō)實(shí)際是和U盤(pán)的協(xié)議和U盤(pán)制造廠商寫(xiě)的程序有關(guān)系的,U盤(pán)協(xié)議里面計(jì)算機(jī)都是先獲取U盤(pán)廠商信息(12H命令),然后獲取U盤(pán)容量(25H命令)在計(jì)算機(jī)上面顯示U盤(pán)總?cè)萘浚ㄒ簿褪悄憧梢渣c(diǎn)擊U盤(pán)屬性看到的容量),完了之后發(fā)送DISK-READY(00H命令),然后才開(kāi)始讀取U盤(pán)的扇區(qū)。很多U盤(pán)廠商在做程序的時(shí)候如果前面的步驟不按照這樣來(lái)做的話讀取U盤(pán)物理扇區(qū)(或者寫(xiě))是無(wú)法進(jìn)行的,這就解釋了你上面所說(shuō)的問(wèn)題。 如果自己做一個(gè)U盤(pán)的話你可以前面所有的都不做,只要你CH375發(fā)送讀取U盤(pán)物理扇區(qū)的話你也可以給其返回。當(dāng)然你在計(jì)算機(jī)上面要是需要工作的話還是需要按照上面所說(shuō)的操作步驟來(lái)符合其流程。
哦,明白了。謝謝