没辙了,无论怎么样做,传过去的总有某几个地方变成了0x00
而且有时候程序关闭文件会出错,说文件已经关闭了。--0xB4
有时候出现错误说磁盘未连接,--0x82
此几种情况有只有我发送的的过程总只是偶尔有一次,有时候17k数据能传输完成。误码17KB内也只有5个不到的0x00。
而且用并口操作的速度也不快,一次写完17k也要1分钟左右。
请问大家有没有办法解决,否则我这个电路板只能作废,在选择其他的方案了。
程序: /*BUS WAY*/ void mDelay1uS(void) /* 至少延时1uS,根据单片机主频调整 */ { 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写数据 */ { 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" ); 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等,均无效。