我用375写数据到U盘,如果片选后一次性写进去4096×4个字节,没有问题。 但实际应用中我需要分多次写数据,退出一次读写后更新数据后再进入写程序(改变了片选信号,每次都打开和关闭文件)。发现几个问题如下: 1》每次必须先初始化一下375才能检测到中断引脚开始写数据。否则中断引脚一直为高。
2》2次写入之后发觉出现找不到文件的错误代码0x42,此时再去写当然不对了。每次完成后加200ms的延时也不对。
请问这是什么原因,或者可否提供这样断续读写的例子?
我用375写数据到U盘,如果片选后一次性写进去4096×4个字节,没有问题。 但实际应用中我需要分多次写数据,退出一次读写后更新数据后再进入写程序(改变了片选信号,每次都打开和关闭文件)。发现几个问题如下: 1》每次必须先初始化一下375才能检测到中断引脚开始写数据。否则中断引脚一直为高。
2》2次写入之后发觉出现找不到文件的错误代码0x42,此时再去写当然不对了。每次完成后加200ms的延时也不对。
请问这是什么原因,或者可否提供这样断续读写的例子?
我怀疑是读写的时序有些问题,你的单片机与CH375是采用什么方式连接的?片选信号改变了是指什么?可以的话能否将你的三个读写子程序贴出来看下. 至于读写的例子可以给你提供一个COPY文件的例子
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 ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); do { i=CH375DiskReady( ); }while( i!= ERR_SUCCESS); while (DesignFile.SectorProTime<16) {
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(10); 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; while(CH375FileClose( )!=0); } CH375Reset(); while(CH375LibInit( ) !=0); delay(10); }//while USBCE_SET;
能不能提供多次读写的例子啊?
strcpy( (char *)mCmdParam.Open.mPathName, "1.TXT" ); 改为 strcpy( (char *)mCmdParam.Open.mPathName, "\\1.TXT" ); 试下看试下
老大,你真厉害,终于OK,明天再来分析原因。
一般情况下确实可以写了,但是有时候会出现0x82(磁盘尚未连接,可能磁盘已经断开 )的错误,然后写的文件大小已经正确了,但是在电脑上还是打不开。 why? 另外文件名前面加\\表什么?
对U盘的供电一定要稳定,在写的过程中不能将盘拔除. 加\\表示每次都从跟目录操作,也就是每次都先找到1.TXT,再写数据.如果不加,每次都会从它次及目录开始操作,也就是第一次打开的是1.TXT文件,第二次就变成要打开\1.TXT\1.TXT文件,一直找下去,这个路径肯定不存在,所以就出现42的错误.
哦,谢谢,这个在哪些资料上有说明没有? 因为我前面没有加\\可以操作两次,按你所说应该只能操作一次啊?
CH375EVT/PUB/CH375HF.PDF,在CH375FileOpen()子程序中有介绍. 第一次是正确写进去了,写完之后再打开文件,应该就会返回0x42错误码了