[求助]CH375 讀取U盤時(shí):返回USB存儲設(shè)備操作不成功

我利用pic單片機(jī)和ch375B讀取U盤數(shù)據(jù),讀取DBR正常,讀取根目錄時(shí)返回中斷狀態(tài)0x1f,即USB存儲設(shè)備操作失敗。請教各位大牛,這個(gè)怎么解決啊?急?。。?


熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

檢查下你讀取的DBR的絕對邏輯扇區(qū)號是多少?如果超過U盤的物理扇區(qū)地址的話,那么讀取的時(shí)候是會返回0X1F的錯誤的。


我的U盤是2G的,LBA地址值是0x01F1=497,沒有超過U盤的物理扇區(qū)地址呀。


剛才寫的不準(zhǔn)確,重新寫過。如下:

U盤量產(chǎn)過,沒有MBR,DBR的LBA地址是0x00,根目錄的LBA是504=8+248*2。讀取時(shí)輸入LBA地址是504。這樣應(yīng)該是對的把,為什么會返回操作失敗呢?

求解答,非常感謝!真的很急!??!


讀取第0號扇區(qū)和第504號扇區(qū)是一樣的啊。需要看下你寫的程序。


用的是PIC16f726單片機(jī),子程序都是自己寫的,沒有用到CH375子程序庫。

UINT8 USB_Init(void)//函數(shù)功能:USB初始化 { UINT8 para=0; UINT8 status=0; UINT8 i=0; i=1; // USB-HOST 主機(jī)模式 para = PARA_MASTER_MODE_07; // PARA_MASTER_MODE== 0x07,命令碼06H表示測試工作狀態(tài) CH375_ExecCmd(CMD_SET_USB_MODE, 1, &para); //para是變量,&para表示指向para的指針。 // CMD_SET_USB_MODE=0x15,數(shù)據(jù)0x06H為模式代 DelayMS(20);

if(CH375_ReadData(&status) == TURE) { if(status == ERR_SUCCESS) // ERR_SUCCESS==0x51, 操作成功 { para = PARA_MASTER_MODE_06; // PARA_MASTER_MODE== 0x06,表示測試工作狀態(tài) CH375_ExecCmd(CMD_SET_USB_MODE, 1, &para); //para是變量,&para表示指向para的指針。 DelayMS(20); if(CH375_ReadData(&status) == TURE) { if(status == ERR_SUCCESS) // ERR_SUCCESS==0x51, 操作成功 { return TURE ; } } } } return FALSE; }

/******************************************************************************************** * 函數(shù)名稱:static UINT8 USB_InitDisk(void) * 函數(shù)功能:存儲設(shè)備(U盤)初始化 * 入口參數(shù):無 * 出口參數(shù):無 * 說 明:(U盤)初始化成功則返回TURE,失敗則返回FALSE *********************************************************************************************/ static UINT8 USB_InitDisk(void) { UINT8 status=0; status = CH375_GetStatus(); //獲取375中斷狀態(tài)并通知375取消中斷請求 if(status == ERR_INT_DISCONNECT || status == FALSE) { return FALSE; }

CH375_ExecCmd(CMD_DISK_INIT, 0, 0); //CMD_DISK_INIT==51H if(CH375_CheckISR() != ERR_INT_SUCCESS) //USB 事務(wù)或者傳輸操作不成功, { return FALSE; } return TURE; // 初始化USB存儲設(shè)備成功。 }

/******************************************************************************************** * 函數(shù)名稱:UINT8 USB_CheckDiskReady(void) * 函數(shù)功能:檢查 USB 存儲設(shè)備是否就緒,并讀取磁盤容量到BufRead * 入口參數(shù):無 * 出口參數(shù):BufRead[0]~[7]:磁盤容量 * 說 明:可讀寫返回TURE,反之返回FALSE *********************************************************************************************/ UINT8 USB_CheckDiskReady(void) { if(USB_InitDisk() == FALSE) { return FALSE; }

CH375_ExecCmd(CMD_DISK_READY, 0, 0);//CMD_DISK_READY==0x59,檢查 USB 存儲設(shè)備是否就緒,該命令會產(chǎn)生中斷 if(CH375_CheckISR() != ERR_INT_SUCCESS) //0x14==ERR_INT_SUCCESS,USB 事務(wù)或者傳輸操作成功 { return FALSE; }

if(USB_GetDiskSize(BufRead) != TURE) { return FALSE; }

return TURE; }

/******************************************************************************************** * 函數(shù)名稱:static UINT8 USB_ReadStream(UINT8 *buf) * 函數(shù)功能:數(shù)據(jù)流讀取,從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊, * 入口參數(shù):無 * 出口參數(shù):*buf:讀取緩存,該命令輸出數(shù)據(jù)長度和數(shù)據(jù)流, * 說 明:讀取成功則返回?cái)?shù)據(jù)長度len(byte),失敗則返回FALSE *********************************************************************************************/ static UINT8 USB_ReadStream(UINT8 *buf) { UINT8 len=0; UINT8 count=0; CH375_ExecCmd(CMD_RD_USB_DATA, 0, 0);//CMD_RD_USB_DATA==0x28,從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊, if(CH375_ReadData(&len) == TURE) // 讀取數(shù)據(jù)長度。函數(shù)原型:UNIT8 CH375_ReadData(UNIT8 *data)。將len的地址傳給指針*data變量,使data指向len,實(shí)現(xiàn)改形參的同時(shí)更改實(shí)參 { count = len; //讀首字節(jié),代表數(shù)據(jù)長度。 len表示數(shù)據(jù)流長度 while(count--) { if(CH375_ReadData(buf) == TURE) { buf++; } else { return FALSE; // 讀取數(shù)據(jù)出錯 } }// 完成數(shù)據(jù)讀取 return len; //返回?cái)?shù)據(jù)長度len(byte) } else { return FALSE; // 讀取數(shù)據(jù)長度失敗 } }

/******************************************************************************************** * 函數(shù)名稱:UINT8 USB_GetDiskSize(UINT8 *size) * 函數(shù)功能:讀取磁盤容量 * 入口參數(shù):無 * 出口參數(shù):*size:磁盤容量,前4byte為設(shè)備的總扇區(qū)數(shù),后4byte為每扇區(qū)字節(jié)數(shù) * 說 明:讀取成功則返回TURE,失敗則返回FALSE *********************************************************************************************/ UINT8 USB_GetDiskSize(UINT8 *size) { CH375_ExecCmd(CMD_DISK_SIZE, 0, 0); //CMD_DISK_SIZE=0x53,該命令會產(chǎn)生中斷 //if(CH375_CheckISR() == ERR_INT_SUCCESS) if(CH375_GetStatus() == ERR_INT_SUCCESS) { if(USB_ReadStream(size) == 8) { return TURE; } }

return FALSE; }

/******************************************************************************************** * 函數(shù)名稱:UINT8 USB_ReadBlock(UINT16 blockNum, UINT8 firstReadFlag, UINT8 *para) * 函數(shù)功能:讀取以para前四字節(jié)為起始地址(32位)的第blockNum個(gè)64字節(jié) * 入口參數(shù):blockNum:需要讀取的數(shù)據(jù)塊(以64字節(jié)為一塊)的序號; firstReadFlag:第一次讀取數(shù)據(jù)塊標(biāo)志; *para::參數(shù) * 出口參數(shù):BufRead:讀取緩存 * 說 明:數(shù)據(jù)塊序號從0開始。讀取成功則返回TURE,失敗則返回FALSE *********************************************************************************************/ static UINT8 USB_ReadBlock(UINT16 blockNum, UINT8 firstReadFlag, UINT8 *para) { UINT8 status=0; //中斷狀態(tài)變量 static UINT16 count=0; // 成功讀取數(shù)據(jù)塊的次數(shù),將其設(shè)置為static是因?yàn)? UINT8 falseCnt=10; //讀取錯誤時(shí),軟件設(shè)定的重復(fù)讀取次數(shù)

if(count > blockNum) { count = 0; firstReadFlag = 1; }

while(falseCnt) { /* 第一次讀取的寫扇區(qū)地址操作 */ if(firstReadFlag == 1) { firstReadFlag = 0; count = 0; CH375_ExecCmd(CMD_DISK_READ, 5, para); //"5"為參數(shù)長度,“para”為參數(shù)數(shù)組 Delay5US( ); } else { CH375_ExecCmd(CMD_DISK_RD_GO, 0, 0); // 繼續(xù)讀, Delay5US( ); }

/* 等待中斷并獲取狀態(tài) */ //讀取數(shù)據(jù)塊時(shí),375產(chǎn)生中斷請求具有特定的規(guī)律:正常情況時(shí),每讀取64B,產(chǎn)生中斷請求0x1D,所有數(shù)據(jù)讀取完之后產(chǎn)生中斷請求0x14。//

/////////////////////////////////如果不是這樣,375將產(chǎn)生中斷0x1F,從而提前結(jié)束讀操作。////////// status = CH375_CheckISR(); if(status ==ERR_INT_DISK_ERR) //ERR_INT_DISK_ERR==0x1f ,USB 存儲設(shè)備操作失敗 { CH375_ExecCmd(CMD_DISK_R_SENSE, 0, 0); // 檢查USB存儲設(shè)備的錯誤,CMD_DISK_R_SENSE=0x5A, status = CH375_CheckISR(); return FALSE; } ////////////////////////////////////////////////////////////////////////////////////////////////

if(status == ERR_INT_DISK_READ) { USB_ReadStream(BufRead); //讀取從當(dāng)前緩沖區(qū)中一次性讀取64字節(jié)的數(shù)據(jù)

count++; if(count == blockNum+1) { return TURE; } } else if(status == ERR_INT_SUCCESS ) { break; // 讀取結(jié)束 } else { /* 讀取出錯處理,讀取失敗則重復(fù)讀10次,10次錯誤后返回FALSE */ firstReadFlag = 1; count = 0; falseCnt--; } }

return FALSE; } /******************************************************************************************** * 函數(shù)名稱:UINT8 USB_ReadDisk(void) * 函數(shù)功能:讀取磁盤數(shù)據(jù) * 入口參數(shù):無 * 出口參數(shù):無 * 說 明:該函數(shù)讀取的是文件系統(tǒng)的啟動過程為:PBR--->文件導(dǎo)引。磁盤可讀取返回讀取數(shù)據(jù)長度,否則返回FALSE *********************************************************************************************/ UINT8 USB_ReadDisk(void) { /* 讀取 PBP@DBR, 放在 BufRead中。BPB(Bios Parameter Block) */ UINT8 para[5]={0, 0, 0, 0, 1}; if(USB_ReadBlock(0, 1, para) == FALSE) //"1"為 首次讀取數(shù)據(jù)標(biāo)志,“para”中的“1”表示一個(gè)扇區(qū)。先讀出FAT16文件系統(tǒng)的0號扇區(qū),并判斷讀取是否成功 { return FALSE; }

if( (BufRead[61] == 0x20) &&(BufRead[60]== 0x20) &&( BufRead[59] == 0x20 )&&( BufRead[58] == 0x36 )&&( BufRead[57] == 0x31 )&&( BufRead[56] == 0x54 )&&( BufRead[55] == 0x41 )&&( BufRead[54] == 0x46 ) ) { return USB_ReadFileFat16( ); // fileSystem = FAT16; } else { return FALSE; // 不可讀 } }

/******************************************************************************************** * 函數(shù)名稱:UINT8 USB_ReadFileFat16(void) *


現(xiàn)在傳主程序:

int main() { UINT8 status=0;

// initial modules InitSystem(); InitStdio(); CH375_Init();

// close globle interrupt GIE = 0; PEIE = 0; DelayMS(100);

USB_Init();

IntCount = 0;

while(1) { if(USB_CheckDiskReady() == TURE) { ready_ok_cnt++; status = USB_ReadDisk(); } IntCount++; CH375_Reset(); DelayMS(100); while(CH375_CheckISR() != ERR_INT_SUCCESS) //USB 事務(wù)或者傳輸操作成功,0x14==ERR_INT_SUCCESS, continue; // USB復(fù)位失敗 while(USB_Init() == FALSE) continue; usb_init_cnt++; } return 0; }


CH375_ExecCmd()這個(gè)函數(shù)沒找到。估計(jì)是你發(fā)的邏輯扇區(qū)號的位置寫反了。你拿我的這個(gè)例子去測試看是否有問題: #include #include "CH375INC.H" /* 定義CH375命令代碼及返回狀態(tài) */ #include /* 以下定義適用于MCS-51單片機(jī),其它單片機(jī)參照修改 */ #define UINT8 unsigned char #define UINT16 unsigned short #define UINT32 unsigned long #define UINT8X unsigned char xdata #define UINT8VX unsigned char volatile xdata UINT8VX CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ UINT8VX CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */ #define CH375_INT_WIRE INT0 /* P3.2, 連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ UINT8X DISK_BUFFER[512] _at_ 0x0000; /* 外部RAM數(shù)據(jù)緩沖區(qū)的起始地址,長度不少于一次讀寫的數(shù)據(jù)長度 */

UINT32 DiskStart; /* 邏輯盤的起始絕對扇區(qū)號LBA */ UINT8 SecPerClus; /* 邏輯盤的每簇扇區(qū)數(shù) */ UINT8 RsvdSecCnt; /* 邏輯盤的保留扇區(qū)數(shù) */ UINT16 FATSz16; /* FAT16邏輯盤的FAT表占用的扇區(qū)數(shù) */

/* ********** 硬件USB接口層,無論如何這層省不掉,單片機(jī)總要與CH375接口吧 ************************************************************ */

void mDelaymS( UINT8 delay ) { /* 以毫秒為單位延時(shí),不精確,適用于24MHz時(shí)鐘MCS51 */ UINT8 i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ } }

void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機(jī)較快則延時(shí) */ CH375_CMD_PORT=cmd; for ( cmd = 2; cmd != 0; cmd -- ); /* 發(fā)出命令碼前后應(yīng)該各延時(shí)2uS,對于MCS51可以不需要延時(shí) */ } void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ CH375_DAT_PORT=dat; /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) */ } UINT8 CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ return( CH375_DAT_PORT ); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) */ } UINT8 mWaitInterrupt( void ) { /* 等待CH375中斷并獲取狀態(tài),主機(jī)端等待操作完成,返回操作狀態(tài) */ while( CH375_INT_WIRE ); /* 查詢等待CH375操作完成中斷(INT#低電平) */ CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷,獲取中斷狀態(tài) */ return( CH375_RD_DAT_PORT( ) ); }

/* ********** BulkOnly傳輸協(xié)議層,被CH375內(nèi)置了,無需編寫單片機(jī)程序 ************************************************************ */

/* ********** RBC/SCSI命令層,雖然被CH375內(nèi)置了,但是要寫程序發(fā)出命令及收發(fā)數(shù)據(jù) ************************************************************ */

UINT8 mInitDisk( void ) { /* 初始化磁盤 */ 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è)備斷開 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲器 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯誤 */ while(1){j++; CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯誤 */ /*這里需要加上這個(gè)之后才可以,正確的做法也是這樣*/ 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( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯誤 */ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 獲取USB存儲器的容量 */ mDelaymS( 250 ); } return( 0 ); /* U盤已經(jīng)成功初始化 */ }

UINT8 mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer ) { /* 從U盤讀取數(shù)據(jù)塊到緩沖區(qū) */ /* iLbaStart 起始扇區(qū)號, iSectorCount 扇區(qū)數(shù), oDataBuffer 緩沖區(qū)起址 */ UINT16 mBlockCount; UINT8 c; CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 從USB存儲器讀數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( (UINT8)iLbaStart ); /* LBA的最低8位 */ CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 8 ) ); CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 16 ) ); CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 24 ) ); /* LBA的最高8位 */ CH375_WR_DAT_PORT( iSectorCount ); /* 扇區(qū)數(shù) */ for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) { /* 數(shù)據(jù)塊計(jì)數(shù) */ c = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( c == USB_INT_DISK_READ ) { /* 等待中斷并獲取狀態(tài),USB存儲器讀數(shù)據(jù)塊,請求數(shù)據(jù)讀出 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ c = CH375_RD_DAT_PORT( ); /* 后續(xù)數(shù)據(jù)的長度 */ while ( c -- ) *oDataBuffer++ = CH375_RD_DAT_PORT( ); /* 根據(jù)長度讀取數(shù)據(jù)并保存 */ CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 繼續(xù)執(zhí)行USB存儲器的讀操作 */ } else break; /* 返回錯誤狀態(tài) */ } if ( mBlockCount == 0 ) { c = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( c== USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } return( c ); /* 操作失敗 */ }

/* 將緩沖區(qū)中的多個(gè)扇區(qū)的數(shù)據(jù)塊寫入U(xiǎn)盤 */ unsigned char mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount,unsigned char *mBufferPoint ) /* iLbaStart 是寫入的線起始性扇區(qū)號, iSectorCount 是寫入的扇區(qū)數(shù) */ { unsigned char mIntStatus; unsigned int mBlockCount; unsigned char mLength; CH375_WR_CMD_PORT( CMD_DISK_WRITE ); /* 向USB存儲器寫數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位 */ CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) ); CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) ); CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */ CH375_WR_DAT_PORT( iSectorCount ); /* 扇區(qū)數(shù) */ // mBufferPoint = DISK_BUFFER; /* 指向緩沖區(qū)起始地址 */ for ( mBlockCount = iSectorCount *8; mBlockCount != 0; mBlockCount -- ) { /* 數(shù)據(jù)塊計(jì)數(shù) */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus == USB_INT_DISK_WRITE ) { /* USB存儲器寫數(shù)據(jù)塊,請求數(shù)據(jù)寫入 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向CH375緩沖區(qū)寫入數(shù)據(jù)塊 */ mLength = 64; CH375_WR_DAT_PORT( mLength ); /* 后續(xù)數(shù)據(jù)的長度 */ do { CH375_WR_DAT_PORT( *mBufferPoint ); mBufferPoint ++; } while ( -- mLength ); CH375_WR_CMD_PORT( CMD_DISK_WR_GO ); /* 繼續(xù)執(zhí)行USB存儲器的寫操作 */ } else break; /* 返回錯誤狀態(tài) */ } if ( mBlockCount == 0 ) { mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } return( mIntStatus ); /* 操作失敗 */ }

/* ********** FAT文件系統(tǒng)層,這層程序量實(shí)際較大,不過,該程序僅演示極簡單的功能,所以精簡 ************************************************************ */

UINT16 mGetPointWord( UINT8X *iAddr ) { /* 獲取字?jǐn)?shù)據(jù),因?yàn)镸CS51是大端格式,U盤FAT通常是小端格式,所以轉(zhuǎn)換 */ return( iAddr[0] | (UINT16)iAddr[1] << 8 ); }

UINT8 mIdenDisk( void ) { /* 識別分析當(dāng)前邏輯盤 */ UINT8 Status; DiskStart = 0; /* 以下是非常簡單的FAT文件系統(tǒng)的分析,正式應(yīng)用絕對不應(yīng)該如此簡單,否則兼容性和容錯性差 */ Status = mReadSector( 0, 1, DISK_BUFFER ); /* 讀取邏輯盤引導(dǎo)信息 */printf("1\n"); if ( Status != 0 ) return( Status ); if ( DISK_BUFFER[0] != 0xEB && DISK_BUFFER[0] != 0xE9 ) { /* 不是邏輯引導(dǎo)扇區(qū) */ DiskStart = DISK_BUFFER[0x1C6] | (UINT16)DISK_BUFFER[0x1C7] << 8 | (UINT32)DISK_BUFFER[0x1C8] << 16 | (UINT32)DISK_BUFFER[0x1C9] << 24; Status = mReadSector( DiskStart, 1, DISK_BUFFER ); /* 根據(jù)新的起始扇區(qū)號讀取邏輯盤引導(dǎo)信息 */ if ( Status != 0 ) return( Status ); } SecPerClus = DISK_BUFFER[0x0D]; /* 每簇扇區(qū)數(shù) */ RsvdSecCnt = DISK_BUFFER[0x0E]; /* 邏輯盤的保留扇區(qū)數(shù) */ FATSz16 = mGetPointWord( &DISK_BUFFER[0x16] ); /* FAT表占用扇區(qū)數(shù) */ return( 0 ); /* 成功 */ }

UINT16 mLinkCluster( UINT16 iCluster ) { /* 獲得指定簇號的鏈接簇 */ /* 輸入: iCluster 當(dāng)前簇號, 返回: 原鏈接簇號, 如果為0則說明錯誤 */ UINT8 Status; Status = mReadSector( DiskStart + RsvdSecCnt + iCluster / 256, 1, DISK_BUFFER


程序待會再試,先謝謝!

問一個(gè)問題,就是讀取一個(gè)扇區(qū)時(shí),是不是一定要將整個(gè)扇區(qū)都讀完?可不可以只讀一個(gè)扇區(qū)的第一個(gè)64字節(jié),然后立馬重新輸入命令讀其他的扇區(qū)?

我現(xiàn)在就是這樣做的,但返回的中斷指示操作失?。?/p>


不可以,一定要讀取完之后在讀取下一個(gè)扇區(qū)。否則你發(fā)送讀取下一個(gè)扇區(qū)的命令的時(shí)候U盤是無響應(yīng)的。這些都是遵循U盤的協(xié)議UFI協(xié)議來操作的。


問題已經(jīng)解決,非常感謝!

不過還想在問一下,既然必須讀完一個(gè)扇區(qū),那么375的字節(jié)讀取模式的實(shí)現(xiàn)原理是什么?。?/p>

謝謝!


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频