字节模式写U盘误码问题

我现在用字节模式写U盘大约17KB大小的一个文件,基本上可以操作正确,但有时候会出现0x82的错误,说磁盘未连接。

另外我发觉写过去的文件中间会有一定的误码,这个怎么解决,因为实际应用中我传输的数据是工艺文件,必须完全无误才行。

另外字节模式是不是没有扇区模式好使?用扇区模式好像没有字节模式这样容易操作吧?

写程序等如下: 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写数据 */ { CH375_DAT_PORT = mData; /*通过并口直接读写CH375而非普通I/O模拟 */ mDelay1uS( ); mDelay1uS( ); /* 至少延时1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; mData =CH375_DAT_PORT; /*通过并口直接读写CH375而非普通I/O模拟 */ return( mData ); }

UINT8 xReadCH375Cmd( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { 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" ); 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盘的供电稳定,电压足够,再就是晶振可能有影响,你的晶振是多少? 字节模式和扇区模式都容易操作,要是写小文件不考虑速度就用字节方式,大文件或是考虑速度建议用扇区方式. 将修改文件信息这段程序加进去试下看可不可以 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() ;


供电电压我有电源检测中断程序,仿真发觉只要不拔下U盘。没有进中断(4.8V)

我使用的仍然为字节模式,不过我改宏定义为#define MAX_BYTE_IO 128

重复写了128次这个有没有影响?

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


还是有误码啊!!

这样玩不下去了啊。还有没有其他高招啊?

晶震用的无源晶体12M的。


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


void mDelay1uS(void) /* 至少延时1uS,根据单片机主频调整 */ { UINT8 i; for ( i = 3; i != 0; i -- ); } 使用AVR单片机,16M晶震


你这样做下测试,给你的RAM附值,接着在将RAM的值读出来,看下是不是你写进去的数据,把你的延时加大点试下看 void mDelay1uS(void) /* 至少延时1uS,根据单片机主频调整 */ { UINT8 i; for ( i = 10; i != 0; i -- ); }


试过了,我仿真一次次发,发之前检察了数组里面的数据,没有错误,但是到U盘上面就有错误了。

是不是要校验才行,但是资料上说明usb内部已经做了CRC校验啊?

我在把延时加大看看。


没辙了,无论怎么样做,传过去的总有某几个地方变成了0x00

而且有时候程序关闭文件会出错,说文件已经关闭了。

有时候出现错误说磁盘未连接,

此几种情况有只有我发送的国过程总偶尔有一次,误码17KB也只有5个不到的0x00。

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

有没有办法解决,否则我这个电路板只能作废,在选择其他的方案了。


我怀疑会不会你的RAM会不会有问题啊,你把你的完整的程序发到我们技术信箱里面,我们拿到这个程序,我们来测试下看,会不会出现你所说的问题.


我的USB部分的程序就这样一点点。没有其他啊,使用你们的库文件,只改了#define MAX_BYTE_IO 128


只有登录才能回复,可以选择微信账号登录