字節(jié)模式寫U盤誤碼問題

我現(xiàn)在用字節(jié)模式寫U盤大約17KB大小的一個文件,基本上可以操作正確,但有時候會出現(xiàn)0x82的錯誤,說磁盤未連接。

另外我發(fā)覺寫過去的文件中間會有一定的誤碼,這個怎么解決,因為實際應用中我傳輸?shù)臄?shù)據(jù)是工藝文件,必須完全無誤才行。

另外字節(jié)模式是不是沒有扇區(qū)模式好使?用扇區(qū)模式好像沒有字節(jié)模式這樣容易操作吧?

寫程序等如下: void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調用的子程序,向CH375寫命令 */ { mDelay1uS( ); mDelay1uS( ); /* 至少延時1uS */ CH375_CMD_PORT = mCmd; /*通過并口直接讀寫CH375而非普通I/O模擬 */ mDelay1uS( ); mDelay1uS( ); /* 至少延時2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調用的子程序,向CH375寫數(shù)據(jù) */ { CH375_DAT_PORT = mData; /*通過并口直接讀寫CH375而非普通I/O模擬 */ mDelay1uS( ); mDelay1uS( ); /* 至少延時1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; mData =CH375_DAT_PORT; /*通過并口直接讀寫CH375而非普通I/O模擬 */ return( mData ); }

UINT8 xReadCH375Cmd( void ) /* 外部定義的被CH375程序庫調用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mCmd; mCmd =CH375_CMD_PORT; /*通過并口直接讀寫CH375而非普通I/O模擬 */ return( mCmd ); } /*多次寫數(shù)據(jù)函數(shù)*/ USBCE_CLR; while (DesignFile.SectorProTime<128) { while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); do { i=CH375DiskReady( ); }while( i!= ERR_SUCCESS); strcpy( (char *)mCmdParam.Open.mPathName, "\\1.TXT" ); // delay(10); i = CH375FileOpen( ); if (i == ERR_MISS_DIR || i == ERR_MISS_FILE) { strcpy( (char *)mCmdParam.Open.mPathName, "\\1.TXT" ); i = CH375FileCreate( ); while(i!=0); }else if (i==ERR_SUCCESS) { mCmdParam.ByteLocate.mByteOffset = 0xffffffff; i = CH375ByteLocate( ); while(i!=0); delay(1); for (i=0;i<(MAX_BYTE_IO>>1);i++) { mCmdParam.ByteWrite.mByteBuffer[2*i]=0x00;//WORD_LO(FlashData[j+i]); mCmdParam.ByteWrite.mByteBuffer[2*i+1]=0x01;//WORD_HI(FlashData[j+i]); } mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;//128 i = CH375ByteWrite( ); // delay(10); while(i!=0); DesignFile.SectorProTime++; mCmdParam.Close.mUpdateLen = 1; i= CH375FileClose( ); while(i!=0); } CH375Reset(); i=CH375LibInit( ); while( i!=0); // delay(10); }

首先要使U盤的供電穩(wěn)定,電壓足夠,再就是晶振可能有影響,你的晶振是多少? 字節(jié)模式和扇區(qū)模式都容易操作,要是寫小文件不考慮速度就用字節(jié)方式,大文件或是考慮速度建議用扇區(qū)方式. 將修改文件信息這段程序加進去試下看可不可以 mCmdParam.Modify.mFileAttr = 0xff; mCmdParam.Modify.mFileTime = 0xffff; mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(2007,2,1); mCmdParam.Modify.mFileSize =MAX_BYTE_IO; i=CH375FileModify() ; mStopIfError(i); mCmdParam.Close.mUpdateLen = 0; i=CH375FileClose() ;


供電電壓我有電源檢測中斷程序,仿真發(fā)覺只要不拔下U盤。沒有進中斷(4.8V)

我使用的仍然為字節(jié)模式,不過我改宏定義為#define MAX_BYTE_IO 128

重復寫了128次這個有沒有影響?

我先試試你提供的方法。wait!


還是有誤碼?。?!

這樣玩不下去了啊。還有沒有其他高招啊?

晶震用的無源晶體12M的。


把你的延時子程序帖出來看下,也就是:mDelay1uS( );


void mDelay1uS(void) /* 至少延時1uS,根據(jù)單片機主頻調整 */ { UINT8 i; for ( i = 3; i != 0; i -- ); } 使用AVR單片機,16M晶震


你這樣做下測試,給你的RAM附值,接著在將RAM的值讀出來,看下是不是你寫進去的數(shù)據(jù),把你的延時加大點試下看 void mDelay1uS(void) /* 至少延時1uS,根據(jù)單片機主頻調整 */ { UINT8 i; for ( i = 10; i != 0; i -- ); }


試過了,我仿真一次次發(fā),發(fā)之前檢察了數(shù)組里面的數(shù)據(jù),沒有錯誤,但是到U盤上面就有錯誤了。

是不是要校驗才行,但是資料上說明usb內部已經(jīng)做了CRC校驗?。?/p>

我在把延時加大看看。


沒轍了,無論怎么樣做,傳過去的總有某幾個地方變成了0x00

而且有時候程序關閉文件會出錯,說文件已經(jīng)關閉了。

有時候出現(xiàn)錯誤說磁盤未連接,

此幾種情況有只有我發(fā)送的國過程總偶爾有一次,誤碼17KB也只有5個不到的0x00。

而且用并口操作的速度也不快,一次寫完17k也要1分鐘左右。

有沒有辦法解決,否則我這個電路板只能作廢,在選擇其他的方案了。


我懷疑會不會你的RAM會不會有問題啊,你把你的完整的程序發(fā)到我們技術信箱里面,我們拿到這個程序,我們來測試下看,會不會出現(xiàn)你所說的問題.


我的USB部分的程序就這樣一點點。沒有其他啊,使用你們的庫文件,只改了#define MAX_BYTE_IO 128


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

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