ch375 U盘对拷速度问题

用两片CH375做的u盘对拷模块,51单片机控制,32k外扩ram,程序用的是版上提供的对拷例程。现在对拷200k左右的数据感觉比较慢,要40s左右,请问这种硬件条件下最快的速度能达到多少? 主要应该改进硬件或软件上哪些方面呢?我现在程序里是一次读40扇区的数据然后切换u盘再写40扇区

if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { break; } else { /* 找到文件或者出错 */ mStopIfError( i ); i=CH375FileQuery(); mStopIfError( i );

mCmdParam.SaveVariable.mSaveVariable=1; //为0时恢复变量,为1时保存变量 mCmdParam.SaveVariable.mBuffer=copy_mCmdParam; //指向要保存的缓冲区 CH375SaveVariable();

NewSize=CH375vFileSize; TotalLen=(NewSize+511)>>9;

Change_Bit=0x02; mCmdParam.SaveVariable.mSaveVariable=0; //为0时恢复变量,为1时保存变量 mCmdParam.SaveVariable.mBuffer=copy_mCmdParam_u0; //指向要保存的缓冲区 CH375SaveVariable();

CH375DirtyBuffer();

i=memcpy(mCmdParam.Open.mPathName,*(file_name+10*page+num),sizeof( *(file_name+10*page+num))); //mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, *(file_name+10*page+num)); /* 文件名,该文件在根目录下 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) {i = CH375FileCreate( ); } mStopIfError( i );

mCmdParam.SaveVariable.mSaveVariable=1; //为0时恢复变量,为1时保存变量 mCmdParam.SaveVariable.mBuffer=copy_mCmdParam_u0; //指向要保存的缓冲区 CH375SaveVariable();

while(1){ Change_Bit=0x01;//设备1 mCmdParam.SaveVariable.mSaveVariable=0; //为0时恢复变量,为1时保存变量 mCmdParam.SaveVariable.mBuffer=copy_mCmdParam; //指向要保存的缓冲区

CH375SaveVariable(); CH375DirtyBuffer();

mCmdParam.Read.mSectorCount = 40; /* 读取全部数据,如果超过60个扇区则只读取60个扇区 */ CH375vFileSize += 511; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */ i = CH375FileRead( ); /* 从文件读取数据 */ mStopIfError( i ); CH375vFileSize -= 511; /* 恢复原文件长度 */

mCmdParam.SaveVariable.mSaveVariable=1; //为0时恢复变量,为1时保存变量 mCmdParam.SaveVariable.mBuffer=copy_mCmdParam; //指向要保存的缓冲区

CH375SaveVariable();

Change_Bit=0x02; //设备2 mCmdParam.SaveVariable.mSaveVariable=0; //为0时恢复变量,为1时保存变量 mCmdParam.SaveVariable.mBuffer=copy_mCmdParam_u0; //指向要保存的缓冲区

CH375SaveVariable(); CH375DirtyBuffer(); mCmdParam.Write.mSectorCount = 40; /* 写入所有扇区的数据 */ i = CH375FileWrite( ); /* 向文件写入数据 */

mCmdParam.SaveVariable.mSaveVariable=1; //为0时恢复变量,为1时保存变量 mCmdParam.SaveVariable.mBuffer=copy_mCmdParam_u0; //指向要保存的缓冲区

CH375SaveVariable();

if(TotalLen<40)break; TotalLen-=40; } Change_Bit=0x02; mCmdParam.SaveVariable.mSaveVariable=0; //为0时恢复变量,为1时保存变量 mCmdParam.SaveVariable.mBuffer=copy_mCmdParam_u0; //指向要保存的缓冲区

CH375SaveVariable(); CH375DirtyBuffer(); mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改 */ mCmdParam.Modify.mFileTime = 0xffff; /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2004, 5, 18 ); /* 输入参数: 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */ i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */ mStopIfError( i ); mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 */ i = CH375FileClose( );

mStopIfError( i ); Change_Bit=0x01; mCmdParam.SaveVariable.mSaveVariable=0; //为0时恢复变量,为1时保存变量 mCmdParam.SaveVariable.mBuffer=copy_mCmdParam; //指向要保存的缓冲区

CH375SaveVariable(); CH375DirtyBuffer(); mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 */ i = CH375FileClose( ); mStopIfError( i ); break; }


单片机速度太慢了。如果你用的总线方式,就不太好优化了。如果非总线方式则把看看你的读写函数是怎么写的。MCU的频率是多少的?


是用的总线啊,单片机+375读写速度不是也应该在100k以上么?单片机频率20m左右,有仿真器调的


看了一下论坛上说一次读写16扇区的倍数比较好,那是不是32扇区会快一点?


现在速度算起来只有个位数。。。


是51单片机吗?如果是51单片机的话,那么速度肯定快不了,本身你单片机速度慢,我们使用STM32F103单片机+CH374芯片,拷贝的速度在200K字节/秒左右。


但是论坛下的评估板说明里mcs51单片机+单dptr复制方法速度可以达到100k以上啊


至少应该有个50k吧


这个复制和你这个拷贝U盘是两码事。 而且这个速度是指读U盘的速度,写U盘的速度要打折。肯定倒不到50KB/S。


怎么会不一样呢?两个u盘,一读一写,跟读写一个u盘差很多吗?不可能速度折扣这么大吧。。。


难道切换u盘的操作占用太多时间?这个速度差距太大了


单dptr复制这个概念你理解错了。是指单片机的RAM访问的方式。不是指复制U盘。 而且你说的速度100KB以上,是指读U盘的速度。而不是指写U盘的速度。


这个我是理解的,我就是问我这种情况,拷贝切换u盘的操作会占用这么多时间吗?这个速度不太正常吧?我版搜了一下,单片机+375对u盘的写操作也应该有100k左右啊


单片机速度慢, 如果要求速度比较高 建议使用高速单片机+CH374


ls能举个例子吗?下午调了一下,30m晶振下,250k数据拷贝大概能到12s左右


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