隨身碟SCSI指令回覆問題?? |
答題得分者是:GGL
|
a3155621
一般會員 發表:3 回覆:7 積分:7 註冊:2007-01-17 發送簡訊給我 |
各位大大你們好!!
小弟想用CPU:CY7C68013A及三星記憶體:K9F5608U0D做一個隨身碟,而目前的進度是已經可以在我的電腦中看到一硬碟的符號了,但卻遇到當電腦發出Write(10)寫入指令後,卻等不到電腦要寫入記憶體的資料輸出,請各位大大這是什麼問題呢? 以下是我部分程式及Bus Hound 5.0抓到的相關資料: 1.解碼SCSI指令的中斷程式: [code cpp] void ISR_Ep2Out() interrupt 12 // 端點2-OUT中斷處理函數 { EZUSB_IRQ_CLEAR(); // 清除USB中斷(INT2) EPIRQ = 0x10; // 清除端點2中斷 for(i=0;i<12;i ) // 取得CBW中的SCSI指令 CBW.CBWCB[i] = EP2FIFOBUF[i 15]; if((EP2FIFOBUF[0] ==0x55) & (EP2FIFOBUF[1] ==0x53) & (EP2FIFOBUF[2] ==0x42) & (EP2FIFOBUF[3] ==0x43)) { switch(CBW.CBWCB[0]) // SCSI指令型態判斷 { case Inquiry :ReturnData(InquiryData,36); break; case Read_Capacity :ReturnData(ReadCapacityData,8); break; case Read_Format_Capacities :ReturnData(ReadFormatcapacitiesData,20); break; case Test_Unit_Ready :SendCSW(0,0); break; case Medium_Removal :SendCSW(0,0); break; case Verify :SendCSW(0,0); break; case Read10 :Read(); break; case Mode_Sense6 :ModeSense(); break; case Write10 :Write(); break; } EP2BCL = 0x80; // 重新配賦端點 } [/code] 2. 記憶體寫入副程式Write()中部分程式: [code cpp] for(i=0;i<8;i ) //寫入一個磁區 { EP2BCH = 0; // 重新配賦端點 EP2BCL = 64; while(EP2468STAT & bmEP2EMPTY); // 判斷端點緩衝區是否已有要寫入記憶體的資料(判斷端點緩衝區是否為空) for(j=0;j<64;j ) { WE=0; Data=EP6FIFOBUF[j]; // 將端點緩衝區的資料傳送給記憶體緩衝區 WE=1; } } [/code] 3. 以下是我在電腦發出寫入命令時,從Bus Hound 5.0抓到的部分資料: 35 CDB 2a 00 00 00 00 00 00 00 01 00 WRITE 759.1.0 34.2 DO 55 53 42 43 50 88 db 88 00 02 00 00 00 00 0a 2a USBCP..........* 760.1.0 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ............... 760.1.16 35 CDB 00 00 00 00 00 00 TEST UNIT READY 761.1.0 35 SSTS 49 timeout 759.2.0 35 SRB 40 00 00 49 00 00 00 00 00 20 0a 12 80 02 20 00 EXEC SCSI 759.3.0 00 02 00 00 0a 00 00 00 e8 35 2d 02 28 23 0a 89 759.3.16 35 SSTS 16 request flushed 761.2.0 35 SRB 40 00 00 16 00 00 00 00 ff 20 06 12 08 01 30 10 EXEC SCSI 761.3.0 00 00 00 00 14 00 00 00 00 00 00 00 08 09 76 89 761.3.16 35 SRB 40 00 15 01 00 00 00 00 00 00 00 00 00 00 00 00 FLUSH QUEUE 762.1.0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 762.1.16 34 RSET 35 CDB 25 00 00 00 00 00 00 00 00 00 READ CAPACITY 764.1.0 35 CDB 00 00 00 00 00 00 TEST UNIT READY 765.1.0 35 CDB 2a 00 00 00 00 00 00 00 01 00 WRITE 766.1.0 34 NSTS 9c 00 00 c0 device data err 763.2.0 34 RSET 767.1.0(2) 34 NSTS 9c 00 00 c0 device data err 767.2.0 35 SSTS 08 no device 764.2.0 35 SRB 40 00 00 08 00 00 00 00 00 20 0a 12 48 01 20 00 EXEC SCSI 764.3.0 00 00 00 00 0a 00 00 00 44 f9 cf ba 98 b9 4d 89 764.3.16 35 SSTS 08 no device 765.2.0 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
From http://en.wikipedia.org/wiki/SCSI_Write_Commands#Write_.2810.29 我看你的code似乎看不到你指令在哪下的,會不會你cdb的值沒用好 例如transfer length、LBA |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
a3155621
一般會員 發表:3 回覆:7 積分:7 註冊:2007-01-17 發送簡訊給我 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
我看你的Bus Hound並沒看到0x2A的指令
你應該沒下成功 還有就是...CBWSignature你好像也沒設定, [code cpp] void ISR_Ep2Out() interrupt 12 // 端點2-OUT中斷處理函數 { EZUSB_IRQ_CLEAR(); // 清除USB中斷(INT2) EPIRQ = 0x10; // 清除端點2中斷 if((EP2FIFOBUF[0] ==0x55) & (EP2FIFOBUF[1] ==0x53) & (EP2FIFOBUF[2] ==0x42) & (EP2FIFOBUF[3] ==0x43)) SCSIDecode(); EP2BCL = 0x80; // 重新配賦端點 } [/code] 雖然你有if判斷是否為USBC,但是我怎麼找不到你的EP2FIFOBUF是什麼時候給值的(或許是我不清楚EP2FIFOBUF這個東西是啥) 你可以參考 www.zxbc.cn/html/20090507/71112.html 內容裡面有對CBW跟CSW做了解釋 你可以在測試看看,是只有Write10(0x2A)不行,還是連0x00或0x12都不行 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |