ch375编程求助

做了一块pcb 功能是51单片机通过ch375读写u盘 扩展的ram是62256 读的过程没有问题 多次连续读写大数据量刷新外部ram

调试写u盘程序时遇到奇怪问题:

部分程序如下(参考的例程改的):

LED_WR_ACT( ); /* 写操作 */

mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/NEWFILE2.TXT" ); /* 新文件名,在根目录下 */

i = CH375FileOpen( ); /* 打开文件 */

mCmdParam.Locate.mSectorOffset =0xffffffff; CH375FileLocate( ); mCmdParam.WriteX.mSectorCount = 2; /* 写入所有扇区的数据 */ mCmdParam.WriteX.mDataBuffer = &FILE_DATA_BUF[0]; i = CH375FileWriteX( ); /* 向文件写入数据 */ mStopIfError( i );

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; /* 不要自动计算文件长度,如果自动计算,那么该长度总是CH375vSectorSize的倍数 */ i = CH375FileClose( ); mStopIfError( i ); LED_WR_INACT( );

程序的问题是:外部ram里已经有数据了(从u盘的一个文件读出来的),我想达到的功能是在u盘的NEWFILE2.TXT文件里把外部ram中的部分数据添加进去,就是想从向已有文件追加数据,现在问题是这段程序执行后CH375FileLocate( )函数没有起到作用,指定mCmdParam.WriteX.mSectorCount = 2也没有用,结果是ram里的所有数据都顺序写到了NEWFILE2.TXT文件中,并覆盖了原数据,与下面一段程序结果一样,这是什么原因呢?应该怎么调试?

LED_WR_ACT( ); /* 写操作 */

mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/NEWFILE3.TXT" ); /* 新文件名,在根目录下 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */

mStopIfError( i );

mCmdParam.Write.mSectorCount =2; /* 写入所有扇区的数据 */

i = CH375FileWrite( ); /* 向文件写入数据 */ mStopIfError( i );

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; /* 不要自动计算文件长度,如果自动计算,那么该长度总是CH375vSectorSize的倍数 */ i = CH375FileClose( ); mStopIfError( i ); LED_WR_INACT( );

mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/NEWFILE2.TXT" ); /* 新文件名,在根目录下 */

i = CH375FileOpen( ); /* 打开文件 */

mCmdParam.Locate.mSectorOffset =0xffffffff; CH375FileLocate( );

mCmdParam.WriteX.mSectorCount = 2; /* 写入所有扇区的数据 */ mCmdParam.WriteX.mDataBuffer = &FILE_DATA_BUF[0]; i = CH375FileWriteX( ); /* 向文件写入数据 */ mStopIfError( i );

简单讲就是这样的程序功能不应该是尾部添加数据吗?为什么执行出来结果是顺序覆盖原数据呢? 很苦恼调试了很久都没进展


移动文件指针到末尾没起到作用,指定写入扇区数也没起到作用,两段小程序的结果都是覆盖顺序写入文件


移动文件指针函数返回值是多少?


这个我没注意看 下午试试


可能是什么原因呢?应该怎么调试?


需要注意一个问题就是当你的文件里面存在一个不足一个扇区的数据的时候,使用FILE-LOCATE只会跳到正扇区的末尾,而非正扇区的数据会被覆盖掉,所以正确的做法是先跳到文件末尾,把CH375vFileSize+=511,在读取一个扇区的数据,然后把这个扇区的数据和你要写的数据结合起来在写下去,这样就不会出现你所说的问题了。


谢谢ls 还是不太明白 我的想法是ram假如有10k左右的数据如果要写到已存在的文件NEWFILE2.TXT中 文件中原数据不足一个扇区FILElocate函数就不起作用吗?


文件只能偏移到扇区的整数倍的地方。比如513个字节的文件,只能偏移到512,如果你要追加数据,则把不足的地方先读出来,然后正确偏移后,将所有要写的数据在写到文件里就可以了


mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/NEWFILE2.TXT" ); /* 新文件名,在根目录下 */

i = CH375FileOpen( ); /* 打开文件 */

mCmdParam.Locate.mSectorOffset =0xffffffff; i = CH375FileLocate( ); mStopIfError( i ); CH375vFileSize += CH375vSectorSize - 1; mCmdParam.WriteX.mSectorCount = SecCount; /* 写入所有扇区的数据 */ mCmdParam.WriteX.mDataBuffer = &FILE_DATA_BUF[0]; i = CH375FileWriteX( ); /* 向文件写入数据 */ mStopIfError( i );

改成这样了 还是不行 直接覆盖了


一定要读出来吗 还是只读出不足一扇区的部分?


只读出最后不足一个扇区的部分,把这部分数据放到缓冲区的前部。连同你要写的数据写进去就可以了。相当于把最后一个不足的部分再写一次


mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/NEWFILE2.TXT" ); /* 新文件名,在根目录下 */

i = CH375FileOpen( ); /* 打开文件 */

mCmdParam.Locate.mSectorOffset =0xffffffff; i = CH375FileLocate( ); mStopIfError( i ); CH375vFileSize += CH375vSectorSize - 1;

mCmdParam.ReadX.mDataBuffer = 0x7800; i=CH375FileReadX();

mCmdParam.WriteX.mDataBuffer = 0x7800; i = CH375FileWriteX( ); /* 向文件写入数据 */ mStopIfError( i ); mCmdParam.WriteX.mSectorCount = SecCount; /* 写入所有扇区的数据 */ mCmdParam.WriteX.mDataBuffer = &FILE_DATA_BUF[0]; i = CH375FileWriteX( ); /* 向文件写入数据 */ mStopIfError( i );

改成这样了 我单独划出一部分ram从0x7800开始存放不足一扇区的数据 结果还是不正常


读写的时候是不是一定要指定 mCmdParam.WriteX.mSectorCount呢


能不能指点一下这段程序应该怎么写? 我把不足一扇区的数据先读出来 是不是下面这样: i = CH375FileOpen( ); /* 打开文件 */

CH375vFileSize += CH375vSectorSize - 1; mCmdParam.Locate.mSectorOffset =0xffffffff; i = CH375FileLocate( ); mStopIfError( i );

mCmdParam.ReadX.mSectorCount = 1; mCmdParam.ReadX.mDataBuffer = 0x7800; i=CH375FileReadX(); mStopIfError( i );

改成这样程序结果还是全部覆盖掉,不足一扇区的话mCmdParam.ReadX.mSectorCount = 1不对吗?


你先按照整扇区的方式操作吧。 unsigned short cnt;

mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/NEW.TXT" ); /* 新文件名,在根目录下 */

i = CH375FileCreate( ); /* 打开文件 */

for(cnt=0;cnt!=512;cnt++) FILE_DATA_BUF[cnt] = 0x31;

mCmdParam.WriteX.mSectorCount = 1; /* 写入所有扇区的数据 */ mCmdParam.WriteX.mDataBuffer = &FILE_DATA_BUF[0]; i = CH375FileWriteX( ); /* 向文件写入数据 */ mStopIfError( i );

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

mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/NEW.TXT" ); /* 新文件名,在根目录下 */

i = CH375FileOpen( ); /* 打开文件 */

mCmdParam.Locate.mSectorOffset =0xffffffff; i = CH375FileLocate( ); mStopIfError( i );

for(cnt=0;cnt!=512;cnt++) FILE_DATA_BUF[cnt] = 0x32;

mCmdParam.WriteX.mSectorCount = 1; /* 写入所有扇区的数据 */ mCmdParam.WriteX.mDataBuffer = FILE_DATA_BUF; i = CH375FileWriteX( ); /* 向文件写入数据 */ mStopIfError( i );

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


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