以前調(diào)好的程序,連續(xù)測試過幾天都正常,最近我也忘了改了哪里了,或者是其他原因,發(fā)現(xiàn)了這個(gè)問題。 程序一直在接收串口數(shù)據(jù)并緩沖下來,然后用扇區(qū)寫入,連續(xù)測了好多次,基本每次都會(huì)停在出現(xiàn)錯(cuò)誤的那個(gè)while循環(huán)中,并且返回FA,只不過每次的時(shí)間不定。在程序還沒有報(bào)這個(gè)錯(cuò)誤的時(shí)候,我按鍵中斷執(zhí)行更新關(guān)閉文件,發(fā)現(xiàn)保存的文件是正常的。 但是如果程序返回了FA,并且跳轉(zhuǎn)到那個(gè)while循環(huán)后,我主控芯片的按鍵中斷都不響應(yīng)了,是怎么回事???
你監(jiān)視下程序看CH376SecWrite函數(shù)中哪里返回FA?
是SecWrite()函數(shù)返回來的FA
CH376SecWrite函數(shù)中哪里返回FA,再細(xì)致測試下現(xiàn)象?
是CH376SecWrite函數(shù)中的s = CH376DiskWriteSec( buf, StaSec, cnt ); /* 將緩沖區(qū)中的多個(gè)扇區(qū)的數(shù)據(jù)塊寫入U(xiǎn)盤 */ 返回的錯(cuò)誤值,為了方便,我把這個(gè)函數(shù)內(nèi)容放在下面了。 UINT8 CH376DiskWriteSec( PUINT8 buf, UINT32 iLbaStart, UINT8 iSectorCount ) /* 將緩沖區(qū)中的多個(gè)扇區(qū)的數(shù)據(jù)塊寫入U(xiǎn)盤,不支持SD卡 */ /* iLbaStart 是寫入的線起始性扇區(qū)號, iSectorCount 是寫入的扇區(qū)數(shù) */ { UINT8 s, err; UINT16 mBlockCount; for ( err = 0; err != 3; ++ err ) { /* 出錯(cuò)重試 */ xWriteCH376Cmd( CMD5H_DISK_WRITE ); /* 向USB存儲(chǔ)器寫扇區(qū) */ xWriteCH376Data( (UINT8)iLbaStart ); /* LBA的最低8位 */ xWriteCH376Data( (UINT8)( (UINT16)iLbaStart >> 8 ) ); xWriteCH376Data( (UINT8)( iLbaStart >> 16 ) ); xWriteCH376Data( (UINT8)( iLbaStart >> 24 ) ); /* LBA的最高8位 */ xWriteCH376Data( iSectorCount ); /* 扇區(qū)數(shù) */ xEndCH376Cmd( ); for ( mBlockCount = iSectorCount * DEF_SECTOR_SIZE / CH376_DAT_BLOCK_LEN; mBlockCount != 0; -- mBlockCount ) { /* 數(shù)據(jù)塊計(jì)數(shù) */ s = Wait376Interrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( s == USB_INT_DISK_WRITE ) { /* USB存儲(chǔ)器寫數(shù)據(jù)塊,請求數(shù)據(jù)寫入 */ CH376WriteHostBlock( buf, CH376_DAT_BLOCK_LEN ); /* 向USB主機(jī)端點(diǎn)的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ xWriteCH376Cmd( CMD0H_DISK_WR_GO ); /* 繼續(xù)執(zhí)行USB存儲(chǔ)器的寫操作 */ xEndCH376Cmd( ); buf += CH376_DAT_BLOCK_LEN; } else break; /* 返回錯(cuò)誤狀態(tài) */ } if ( mBlockCount == 0 ) { s = Wait376Interrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( s == USB_INT_SUCCESS ) return( USB_INT_SUCCESS ); /* 操作成功 */ } if ( s == USB_INT_DISCONNECT ) return( s ); /* U盤被移除 */ CH376DiskReqSense( ); /* 檢查USB存儲(chǔ)器錯(cuò)誤 */ } return( s ); /* 操作失敗 */ }
這個(gè)函數(shù)內(nèi)只有下面這個(gè)for循環(huán)內(nèi)返回了s狀態(tài), for ( mBlockCount = iSectorCount * DEF_SECTOR_SIZE / CH376_DAT_BLOCK_LEN; mBlockCount != 0; -- mBlockCount ) { /* 數(shù)據(jù)塊計(jì)數(shù) */ s = Wait376Interrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( s == USB_INT_DISK_WRITE ) { /* USB存儲(chǔ)器寫數(shù)據(jù)塊,請求數(shù)據(jù)寫入 */ CH376WriteHostBlock( buf, CH376_DAT_BLOCK_LEN ); /* 向USB主機(jī)端點(diǎn)的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ xWriteCH376Cmd( CMD0H_DISK_WR_GO ); /* 繼續(xù)執(zhí)行USB存儲(chǔ)器的寫操作 */ xEndCH376Cmd( ); buf += CH376_DAT_BLOCK_LEN; } else break; /* 返回錯(cuò)誤狀態(tài) */ }, 請問是怎么回事啊。測試到目前發(fā)現(xiàn)程序仍然是可以運(yùn)行一段時(shí)間,但是不知道過多長時(shí)間還會(huì)出現(xiàn)主題中所說的情況。 另外一個(gè)不懂的地方是扇區(qū)寫入不是一次要寫入512的數(shù)據(jù)嗎,這里為什么循環(huán)發(fā)送0x40的的數(shù)據(jù),不應(yīng)該是0x2h嗎?
底層就是一次寫64個(gè),只是我們函數(shù)幫你做好了,把512分8次寫入 你前面的初始化每次都能過么?DISKMOUNT每次都返回14么? FA可能是中斷超時(shí)那返回的,你把中斷查詢函數(shù)Wait376Interrupt( ); 中的超時(shí)加長點(diǎn)或者把超時(shí)去掉,死等中斷試試
我測試過了,確實(shí)是中斷查詢函數(shù)Wait376Interrupt( )返回的FA,那是什么問題呢,怎么解決? 我的程序中先初始化U盤都能通過,DISKMOUNT也應(yīng)該能通過,因?yàn)樵谖闯霈F(xiàn)這個(gè)錯(cuò)誤之前如果我,停止寫入新數(shù)據(jù)而關(guān)閉刷新文件長度,寫出來的文件是正常的。所以程序中只在最開始的時(shí)候DISKMOUNT過一次,那我讓出錯(cuò)的時(shí)候在DISKMOUNT一次試試, 如果是DISKMOUNT返回值不對, 那應(yīng)該是哪里的問題呢?
還有一個(gè)疑問,在出錯(cuò)后,程序會(huì)跳入下面這個(gè)函數(shù) void mStopIfError(uint8_t iError) { if (iError == USB_INT_SUCCESS) { return; /* 操作成功 */ } // printf("Error: %02X\n", iError ); /* 顯示錯(cuò)誤 */ while(1) { /* LED1閃爍 */ GPIO_ResetBits(GPIOD, GPIO_Pin_6); mDelaymS( 200 ); GPIO_SetBits(GPIOD, GPIO_Pin_6); mDelaymS( 200 ); } }, 此時(shí)現(xiàn)象是實(shí)驗(yàn)板上的燈不斷的閃,但是為什么這是侯用按鍵中斷來跳入其他地方時(shí),按鍵中斷無無響應(yīng)呢?
在程序出現(xiàn)這個(gè)錯(cuò)誤之后,然后在進(jìn)行ch376初始化及u盤檢測,發(fā)現(xiàn)此時(shí)根本檢測不到u盤連接,是ch376工作不穩(wěn)定嗎,發(fā)現(xiàn)u盤略微有些發(fā)熱,此時(shí)將u盤拔下,程序重啟又能恢復(fù)正常,但是執(zhí)行中還會(huì)出錯(cuò)。
出錯(cuò)時(shí),也測過電壓了,分別是4.5v,0v,2.6v,應(yīng)該沒有問題吧?
1、你的電壓是哪里的電壓? 2、按鍵中斷無無響應(yīng)是可能是你單片機(jī)中斷設(shè)置或者按鍵檢測有問題 3、返回FA那必須需要你把超時(shí)時(shí)間加長或者是死等中斷