375读写文件问题

#if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */ printf( "Too large sector size\n" ); while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelay100mS( ); continue; 例程中的这段程序总是过不去 ,显示Too large sector size就不往下走了 我的RAM为1280 怎么能读出磁盘扇区的物理值 程序中只能读出总大小怎么算扇区大小

DISK_BASE_BUF_LEN定义多少?不能小于512.这个物理值在初始化磁盘的时候,有磁盘返回的。具体可以查看bulkonly协议


定义的是4096!! 物理值和设置的多少没关系? 是初始化返回的物理值? 磁盘缓冲区和外部数据缓冲区有什么关系么,


CH375vSectorSize是在初始化U盘的时候获取到的。CH375DiskReady有没有正常通过?是指返回成功。 这个数值设置只是为了兼容大扇区的U盘,这类U盘很少。DISK_BASE_BUF_LEN可以不定义。你可以监视一下 CH375vSectorSize 是多少? 磁盘缓冲区是用来分析文件系统的。数据缓冲区是用来读写文件做数据缓冲的。 不知道以上解释您是否明白? 具体您可以下载CH375EVT.ZIP,查看CH375HF.PDF


我把这段去掉 if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */ printf( "Too large sector size\n" ); while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelay100mS( ); continue;

错误码 是1F, USB存储器操作失败


CH375DiskReady有没有正常通过? 把你的主函数贴出来看看。你要按照我们的流程区做!


main( ) { UINT8 i, month, hour; UINT16 date, adc, len; CH375_PORT_INIT( ); /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ // LED_OUT_INIT( ); LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */ mDelay100mS( ); /* 延时100毫秒 */ LED_OUT_INACT( ); mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ printf( "Start\n" );

#if DISK_BASE_BUF_LEN == 0 pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定义CH375的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */ #endif

i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它电路初始化 */

while ( 1 ) { printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ LED_OUT_ACT( ); /* LED亮 */ mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( );

/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } #if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */ printf( "Too large sector size\n" ); while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelay100mS( ); continue; } #endif /* 查询磁盘物理容量 */ // printf( "DiskSize\n" ); // i = CH375DiskSize( ); // mStopIfError( i ); // printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * (CH375vSectorSize/512) / 2048 ) ); // 显示为以MB为单位的容量 // 原计算方法 (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * CH375vSectorSize / 1000000 ) 有可能前两个数据相乘后导致溢出, 所以修改成上式

// LED_RUN_ACT( ); /* 开始操作U盘 */

/* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */ printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,该文件在根目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ printf( "File size = %ld\n", CH375vFileSize ); /* V1.5以上子程序库在成功打开文件后,全局变量CH375vFileSize中是文件当前长度 */ printf( "Locate tail\n" ); mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */ i = CH375ByteLocate( ); mStopIfError( i ); } else if ( i == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */ // LED_WR_ACT( ); /* 写操作 */ printf( "Create\n" ); // mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/MY_ADC.TXT" ); /* 文件名,该文件在根目录下,刚才已经提供给CH375FileOpen */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); }

CH375DiskReady应该是正常通过;了 这个就是例程 我就把IO口该成和我单片机的对应的IO没改过别的


请您验证CH375DiskReady是否通过。你不能保证你修改的是完全正确的。CH375vSectorSize就是在这一步被赋值的。所以你要检测这个函数是否正常通过。这个很有必要。请按照我提供的流程检测,这样才能更快的找出问题。 另外MCU的RAM是1280,而Disk_Base_Buf_Len定义了4096,已经超出RAM的大小,这样肯定是有问题的。


CH375DiskReady 返回值为0


那就是你的RAM溢出了。 MCU的RAM是1280,而Disk_Base_Buf_Len定义了4096,已经超出RAM的大小,这样肯定是有问题的。


#define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ #define DISK_BASE_BUF_LEN 512 /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */ /* 由于单片机内置的外部RAM只有1KB, 有些单片机还要去掉256字节内部RAM, 只剩下768字节的外部RAM, 其中前512字节由CH375子程序用于磁盘数据缓冲 */ #define FILE_DATA_BUF_LEN 0x0800 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */

改成512也是一样的效果


#define FILE_DATA_BUF_LEN 0x0800 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */ 还是会超出,把这个屏蔽掉先 你看一下编译出来的RAM是多少,是否超过的MCU的RAM


这个弱弱的问一下怎么看!!新手 麻烦了


你用的什么编译器?keil? 编译完毕后会显示DATA=XXXX,XDATA=XXXX,CODE=XXXX 最通用的方法是看MAP文件。


DATA=121.5,XDATA=2587,CODE=11429 好象是益处了


我们尽力的提供完善的技术支持,请您详细的看一下我前面回复的帖子,这样可以对我们的技术支持减小工作量。谢谢配合。 怎么修改不会溢出,请查看11楼的帖子。


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