CH375的写调试疑问

没辙了,无论怎么样做,传过去的总有某几个地方变成了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等,均无效。

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中断并更新中断状态,等待U盘拔出 */ 不需要在将375初始化和U盘的初始化, 要是还不行的话,那你可以使用我们例子程序看会不会出现这种情况.


谢谢,你们的例子程序没有这样分多次读写的啊?有的话你能不能提供?

不初始化无法检测到中断脚的低电平吧?我先试试。等下!


不初始化我第二次来检测不到中断脚的低电平。程序无法向下运行,如果不检测中断脚直接向下运行仍然导致以上错误。

你们能不能提供多次去读写的例子?因为我必须多次去读写,读写一次后我需要改变片选信号去采集其他数据,然后再片选CH375,写数据,这样至少要操作128次。你们能不能提供这方面的例子?


这个程序已经测试过,可以正常操作,你试下 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"); }


关闭文件的时候老出现0xB4的错误。


你怎么判断是关闭文件的时候是B4呢>这个程序根本就没判断关闭文件


我自己加的,我想判断出错的原因。

现在我完全按你们那个来,程序都运行到了while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); ,等待U盘拔出。此时拔下U盘,数据有时候没写完全,没有17K, 写完整的时候数据仍然有误码0x00。


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