我現(xiàn)在用的是51單片機(jī)控制ch375對u盤扇區(qū)進(jìn)行讀寫操作。。。 連續(xù)讀寫時(shí)。。經(jīng)常出現(xiàn)在在寫入w_ch375cmd( CMD_DISK_READ ); /* 從USB存儲器讀數(shù)據(jù)塊 */ w_ch375data(start_sector.mchar[3]); /* LBA的最低8位 */ w_ch375data(start_sector.mchar[2]); w_ch375data(start_sector.mchar[1]); w_ch375data(start_sector.mchar[0]); /* LBA的最高8位 */ w_ch375data( iSectorCount ); /* 扇區(qū)數(shù) */ 命令后返回的中斷狀態(tài)是14h而不是USB_INT_DISK_READ。。為什么會這樣啊、、 返回14h說明什么?。?/p>
有人在嗎?給看看啊。。
你在讀之前去獲取一下中斷狀態(tài),(寫CMD_DISK_READ 之前)這可能是由于上次的中斷狀態(tài)沒有被取消所導(dǎo)致的.
不行啊。。還是一樣。。我讀了。。
在前面加了w_ch375cmd( CMD_GET_STATUS); mIntStatus = r_ch375data(); /* 獲取中斷狀態(tài) */ w_ch375cmd( CMD_DISK_READ ); /* 從USB存儲器讀數(shù)據(jù)塊 */ w_ch375data(start_sector.mchar[3]); /* LBA的最低8位 */ w_ch375data(start_sector.mchar[2]); w_ch375data(start_sector.mchar[1]); w_ch375data(start_sector.mchar[0]); /* LBA的最高8位 */ w_ch375data( iSectorCount ); /* 扇區(qū)數(shù) */ 結(jié)果還是一樣。。。前兩次是返回的USB_INT_DISK_READ。。到第三次。。有時(shí)候是第二次就出問題了。。。 想不明白到底為什么啊。。。
我剛查了一下。。發(fā)現(xiàn)是有一個時(shí)鐘信號影響到了ch375的工作。。。 我想問一下ch375工作時(shí)晶振的穩(wěn)定度要很高嗎? 那個時(shí)鐘信號加上時(shí)。。晶振還是12M但是有點(diǎn)晃。?;蔚暮苄?。。但是就是這個時(shí)鐘信號上去之后就讀不了數(shù)據(jù)了。。。。
那把你的代碼貼出來看看流程是否正確.還有對375的讀寫子函數(shù).
行。。。
/* 從U盤讀取多個扇區(qū)的數(shù)據(jù)塊到緩沖區(qū) */ void mReadSector(unsigned char iSectorCount ) /* union long_char start_sector 是準(zhǔn)備讀取的線性起始扇區(qū)號, iSectorCount 是準(zhǔn)備讀取的扇區(qū)數(shù) */ { unsigned int mBlockCount; uchar mLength; w_ch375cmd( CMD_DISK_READ ); /* 從USB存儲器讀數(shù)據(jù)塊 */ w_ch375data(start_sector.mchar[3]); /* LBA的最低8位 */ w_ch375data(start_sector.mchar[2]); w_ch375data(start_sector.mchar[1]); w_ch375data(start_sector.mchar[0]); /* LBA的最高8位 */ w_ch375data( iSectorCount ); /* 扇區(qū)數(shù) */ for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount >0; mBlockCount -- ) /* 數(shù)據(jù)塊計(jì)數(shù) */ {
while(!flag); flag=0; if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存儲器讀數(shù)據(jù)塊,請求數(shù)據(jù)讀出 */ w_ch375cmd( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ mLength = r_ch375data( ); /* 后續(xù)數(shù)據(jù)的長度*/ do {
*p=r_ch375data(); /* 讀出數(shù)據(jù)并保存 */ p++; } while ( -- mLength ); w_ch375cmd( CMD_DISK_RD_GO ); /* 繼續(xù)執(zhí)行USB存儲器的讀操作 */ } else break; /* 返回錯誤狀態(tài) */ } while(!flag); flag=0; /* 等待中斷并獲取狀態(tài) */ _nop_(); _nop_(); } flag是中斷標(biāo)志位。。。我不上一個芯片的時(shí)候。。。中斷申請的狀態(tài)一直都正確。。。但是那個芯片上了之后就不行了。。。對晶振是有一點(diǎn)影響。。但影響很小。。我用3.3v供電的。。。無源晶振。。。。。。 我看有人說用有源晶振會好一點(diǎn)。。是不是這樣啊。。
初始化和對第一個扇區(qū)的讀寫都成。。。上的片子上有時(shí)鐘信號在跑。。。它可以先中斷讀取狀態(tài)都正確。。突然就會出問題了。。。。讀取狀態(tài)就變成了14h。。死了。。