CH375的寫調試疑問

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

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

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

此幾種情況有只有我發(fā)送的的過程總只是偶爾有一次,有時候17k數(shù)據(jù)能傳輸完成。誤碼17KB內也只有5個不到的0x00。

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

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

程序: /*BUS WAY*/ void mDelay1uS(void) /* 至少延時1uS,根據(jù)單片機主頻調整 */ { NOP();NOP();NOP();NOP();NOP();NOP(); }

void CH375_PORT_INIT(void) /* 由于使用通用I/O模塊并口讀寫時序,所以進行初始化 */ { XMCRA = 0x00; //external memory MCUCR = 0x81;//0x80;0x81--the same to Flash } void CH375_PORT_RETURN(void) { XMCRA = 0x00; //external memory MCUCR = 0x00; } 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 ); } 多次寫部分: 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" ); do {i = CH375FileCreate( );} while(i!=0); }else if (i==ERR_SUCCESS) { mCmdParam.ByteLocate.mByteOffset = 0xffffffff; // delay(2); i = CH375ByteLocate( ); if (i==0) { //while(i!=0); for (i=0;i<(MAX_BYTE_IO>>1);i++) { mCmdParam.ByteWrite.mByteBuffer[2*i]=0x55;//WORD_LO(FlashData[j+i]); mCmdParam.ByteWrite.mByteBuffer[2*i+1]=0x55;//WORD_HI(FlashData[j+i]); } mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;//128 // delay(2); i = CH375ByteWrite( ); if (i==0) {//while(i!=0); DesignFile.SectorProTime++; /* mCmdParam.Modify.mFileAttr = 0xff; mCmdParam.Modify.mFileTime = 0xffff; mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(2007,2,1); mCmdParam.Modify.mFileSize =MAX_BYTE_IO*(INT16U)DesignFile.SectorProTime; i=CH375FileModify(); while(i!=0); mCmdParam.Close.mUpdateLen = 0; */ mCmdParam.Close.mUpdateLen = 1; i= CH375FileClose( ); while(i!=0); } } } CH375Reset(); i=CH375LibInit( ); while( i!=0); // delay(2); }//while USBCE_SET;

修改過延時加長/縮短,手動更新文件長度,每次寫時加延時到200ms等,均無效。

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" ); do {i = CH375FileCreate( );} while(i!=0); }else if (i==ERR_SUCCESS) { mCmdParam.ByteLocate.mByteOffset = 0xffffffff; // delay(2); i = CH375ByteLocate( ); if (i==0) { //while(i!=0); for (i=0;i<(MAX_BYTE_IO>>1);i++) { mCmdParam.ByteWrite.mByteBuffer[2*i]=0x55;//WORD_LO(FlashData[j+i]); mCmdParam.ByteWrite.mByteBuffer[2*i+1]=0x55;//WORD_HI(FlashData[j+i]); } } mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;//128 // delay(2); i = CH375ByteWrite( ); if (i==0) {//while(i!=0); DesignFile.SectorProTime++; /* mCmdParam.Modify.mFileAttr = 0xff; mCmdParam.Modify.mFileTime = 0xffff; mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(2007,2,1); mCmdParam.Modify.mFileSize =MAX_BYTE_IO*(INT16U)DesignFile.SectorProTime; i=CH375FileModify(); while(i!=0); mCmdParam.Close.mUpdateLen = 0; */ mCmdParam.Close.mUpdateLen = 1; i= CH375FileClose( ); while(i!=0); } } } while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤拔出 */ 不需要在將375初始化和U盤的初始化, 要是還不行的話,那你可以使用我們例子程序看會不會出現(xiàn)這種情況.


謝謝,你們的例子程序沒有這樣分多次讀寫的???有的話你能不能提供?

不初始化無法檢測到中斷腳的低電平吧?我先試試。等下!


不初始化我第二次來檢測不到中斷腳的低電平。程序無法向下運行,如果不檢測中斷腳直接向下運行仍然導致以上錯誤。

你們能不能提供多次去讀寫的例子?因為我必須多次去讀寫,讀寫一次后我需要改變片選信號去采集其他數(shù)據(jù),然后再片選CH375,寫數(shù)據(jù),這樣至少要操作128次。你們能不能提供這方面的例子?


這個程序已經(jīng)測試過,可以正常操作,你試下 while(1) { printf("wait disk in\n"); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt(); LED_OUT_ACT(); mDelay100mS(); mDelay100mS(); for( i=0;i<5;i++ ) { mDelay100mS(); printf(" Ready\n"); if ( CH375DiskReady() == ERR_SUCCESS ) break; } while (SectorProTime<128) { printf("open\n"); strcpy( (char *)mCmdParam.Open.mPathName, "\\1.TXT);

i = CH375FileOpen( ); if (i == ERR_MISS_DIR || i == ERR_MISS_FILE) { printf("create\n"); strcpy( (char *)( mCmdParam.Create.mPathName, "\\1.TXT" );

CH375FileCreate( ); }

else if (i==ERR_SUCCESS) { printf("locate\n"); mCmdParam.ByteLocate.mByteOffset = 0xffffffff;

i = CH375ByteLocate( ); mStopIfError(i); }

printf("write\n"); for (i=0;i<(MAX_BYTE_IO>>1);i++) { mCmdParam.ByteWrite.mByteBuffer[2*i+1]=0x55;//WORD_HI(FlashData[j+i]); mCmdParam.ByteWrite.mByteBuffer[2*i]=0x55;//WORD_HI(FlashData[j+i]); } mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;//128 j = CH375ByteWrite( );

SectorProTime++;

mCmdParam.Close.mUpdateLen = 1; CH375FileClose( ); printf("close\n"); } while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); printf("take out\n"); }


關閉文件的時候老出現(xiàn)0xB4的錯誤。


你怎么判斷是關閉文件的時候是B4呢>這個程序根本就沒判斷關閉文件


我自己加的,我想判斷出錯的原因。

現(xiàn)在我完全按你們那個來,程序都運行到了while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); ,等待U盤拔出。此時拔下U盤,數(shù)據(jù)有時候沒寫完全,沒有17K, 寫完整的時候數(shù)據(jù)仍然有誤碼0x00。


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

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