關(guān)于單片機(jī)讀取從U盤傳輸?shù)紺H375緩沖區(qū)的數(shù)據(jù)相關(guān)問題

請大家看一下我對讀U盤數(shù)據(jù)步驟的一些理解對不對: 1.單片機(jī)首先發(fā)出要求讀U盤數(shù)據(jù)的命令后,再連續(xù)分四次發(fā)出LBA地址 2.如果CH375收到從U盤上傳輸來的相關(guān)數(shù)據(jù),CH375向單片機(jī)發(fā)出中斷 3.單片機(jī)收到中斷后發(fā)出要求讀CH375中斷狀態(tài)的命令 4.單片機(jī)分析中斷狀態(tài)并確認(rèn)有效后就連續(xù)分四次從CH375的緩沖區(qū)中讀取數(shù)據(jù)并保存.

我的問題是:在第4步中,當(dāng)單片機(jī)確認(rèn)后,是連續(xù)地從數(shù)據(jù)總線上四次讀數(shù)據(jù)并保存,在這期間,CH375怎么知道單片機(jī)已從數(shù)據(jù)總線上讀走了數(shù)據(jù),從而的下一個(gè)字節(jié)的數(shù)據(jù)發(fā)到數(shù)據(jù)總路線上的呢?

1、發(fā)完LBA地址之后,還得發(fā)需要讀取的扇區(qū)數(shù); 2、一個(gè)扇區(qū)分8次進(jìn)行讀取,每讀取一次64個(gè)字節(jié)后,會發(fā)CMD_DISK_RD_GO繼續(xù)讀取; 具體如下:

/* 從U盤讀取多個(gè)扇區(qū)的數(shù)據(jù)塊到緩沖區(qū) */ unsigned char mReadSector( unsigned long iLbaStart, unsigned char iSectorCount ) /* iLbaStart 是準(zhǔn)備讀取的線性起始扇區(qū)號, iSectorCount 是準(zhǔn)備讀取的扇區(qū)數(shù) */ { unsigned char mIntStatus; unsigned char *mBufferPoint; unsigned int mBlockCount; unsigned char mLength; CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 從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 = DATA_BUFFER; /* 指向緩沖區(qū)起始地址 */ for ( mBlockCount = iSectorCount * CH375_BLK_PER_SEC; mBlockCount != 0; mBlockCount -- ) { /* 數(shù)據(jù)塊計(jì)數(shù) */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存儲器讀數(shù)據(jù)塊,請求數(shù)據(jù)讀出 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ mLength = CH375_RD_DAT_PORT( ); /* 后續(xù)數(shù)據(jù)的長度 */ while ( mLength ) { /* 根據(jù)長度讀取數(shù)據(jù) */ *mBufferPoint = CH375_RD_DAT_PORT( ); /* 讀出數(shù)據(jù)并保存 */ mBufferPoint ++; mLength --; } CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 繼續(xù)執(zhí)行USB存儲器的讀操作 */ } else break; /* 返回錯(cuò)誤狀態(tài) */ } if ( mBlockCount == 0 ) { mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } return( mIntStatus ); /* 操作失敗 */ }

至于最低層是怎么執(zhí)行的,你得看UFI協(xié)議了。


就是這里: CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ mLength = CH375_RD_DAT_PORT( ); /* 后續(xù)數(shù)據(jù)的長度 */ while ( mLength ) { /* 根據(jù)長度讀取數(shù)據(jù) */ *mBufferPoint = CH375_RD_DAT_PORT( ); /* 讀出數(shù)據(jù)并保存 */ mBufferPoint ++; mLength --; } 中的*mBufferPoint= CH375_RD_DAT_PORT(); mBufferPoint ++; mLength --; 單片機(jī)是根據(jù)之前所讀數(shù)據(jù)的長度來連續(xù)循環(huán)從數(shù)據(jù)總線上讀數(shù)據(jù),那CH375是怎么知道一次循環(huán)中單片機(jī)已讀了數(shù)據(jù),再把下一個(gè)數(shù)據(jù)放到總線的呢?


實(shí)際是根據(jù)你的RD的上升延來判斷下一個(gè)數(shù)據(jù)的準(zhǔn)備,也就是說在芯片內(nèi)部,前一個(gè)RD的上升沿做為后一個(gè)數(shù)據(jù)寫到數(shù)據(jù)端口的一個(gè)標(biāo)志,實(shí)際處理的時(shí)候可能比這個(gè)還要復(fù)雜點(diǎn),這里只是一個(gè)簡單的說明


謝謝啦


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

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