CH375读大文件

读小文件的时候,我设置: #define FILE_DATA_BUF_LEN 0x2000 相当于是8K的大小,即16个扇区数据 当文件比较大(比如396K)的时候,我采用了一直读写,知道文件读完为止,函数如下: while ( 1 ) {    c = FILE_DATA_BUF_LEN /512;    mCmdParam.Read.mSectorCount = c; // 指定读取的扇区数    CH375FileRead(); //读完后文件指针自动后移处理数据    if ( mCmdParam.Read.mSectorCount < c )      break; //实际读出的扇区数较小则说明文件已经结束 } 可是循环几次就死掉了,程序死在了: void xQueryInterrupt( void ) /* 查询中断状态,等待硬件中断 */ { while ( CH375IntStatus == 0 ); /* 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 */ }函数里面,应该是没有检测到中断了!

如果文件比较小的话,都很正常!

请问各位,这个是什么东西引起的,是不是我的程序有问题? 希望大家能帮帮忙,非常感谢!

你用的是模拟并口吧,会不会是你的三个读写子程序的延时上存在点问题。


模拟并口??? 我采用的是并口方式啊! 你是说 /********************************************************************* * 功 能: 写操作后延时 * 入口参数: 无 * 出口参数: 无 * 作 者: 陈爱华 2007-01-17 *********************************************************************/ #ifndef NO_DEFAULT_DELAY_WRITE /* 在应用程序中定义NO_DEFAULT_DELAY_WRITE可以禁止默认的写操作后延时程序,然后用自行编写的程序代替它 */ void xDelayAfterWrite(void) { INT32U count; for (count = 5000; count != 0; count --); /* 延时200uS左右 */ } #endif//NO_DEFAULT_DELAY_WRITE

/********************************************************************* * 功 能: 延时100uS * 入口参数: 无 * 出口参数: 无 * 作 者: 陈爱华 2007-01-17 *********************************************************************/ #ifndef NO_DEFAULT_DELAY_100US /* 在应用程序中定义NO_DEFAULT_DELAY_100US可以禁止默认的延时100uS子程序,然后用自行编写的程序代替它 */ void xDelay100uS(void) { INT32U count; for (count = 2500; count != 0; count--); /* 延时100uS,2x20nS@50MHz */ } #endif //NO_DEFAULT_DELAY_100US 延时有问题吗?


是延时太短的了吗?


会不会是你单片机的运行速度太快了啊,你能不能将晶振换小点试一试。因为模拟并口的话存在这因为三个读写子程序延时不当会出现这问题。


对于ARM的例子我们提供的都是模拟并口的,你说你是直接挂到总线的,能不能把你的三个读写子程序xWriteCH375Cmd、xWriteCH375Data、xReadCH375Data以及这三个函数中用到的延时程序,发出来看一下。


#define CH375Cmd *(volatile INT8U *)(0x04000001) /*总线方式 BANK2--nGCS2*/ #define CH375Dat *(volatile INT8U *)(0x04000000) void xWriteCH375Cmd(INT8U mCmd ) { mDelay1_2uS( ); mDelay1_2uS( ); CH375Cmd = mCmd; mDelay1_2uS( ); mDelay1_2uS( ); }

void xWriteCH375Data(INT8U mData ) { CH375Dat = mData ; mDelay1_2uS( ); }

INT8U xReadCH375Data(void) { INT8U mData;

mDelay1_2uS( ); mData = (INT8U)CH375Dat; return(mData); } void mDelay1_2uS(void) { INT32U i; for (i = 30; i != 0; i --); }

系统主频为:MCLK = 60000000; 这三个函数有问题吗?


mDelay1_2uS( );的时间有点长哦,换小点试下看看??


我把延时改小了,可是很不稳定,有时候可以成功读出文件,有时候就死了, 而且有时候可以多循环几次,有时候一遍都不能读,总是死在: void xQueryInterrupt( void ) /* 查询中断状态,等待硬件中断 */ { while ( CH375IntStatus == 0 ); /* 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 */ }函数里面! 还是跟延时有关吗? 我感觉应该不完全是,因为把这个延时试了很多数据,都是有时候可以读,有时候又不能读! 所以请问一下大家,这个问题是不是还其他因素有关系呢? 非常感谢!!


延时程序改成了: void mDelay1_2uS(void) { INT32U i; for (i = 10; i != 0; i --);

} 一个U盘连26K的文件常常读不出来,上了100K以上的文件压根就没有读出来过! 而另外一个U盘可以读出15M的文件,读文件的速度大概为213KB/S左右! 请问一下贵公司,是不是还与其他因素有关,而不仅仅是与这个延时有关呢?


自己顶一下


顺便在里面再问一个问题: /* FAT数据区中文件目录信息 */ typedef struct _FAT_DIR_INFO { UINT8 DIR_Name[11]; /* 00H,文件名,共11字节,不足处填空格 */ UINT8 DIR_Attr; /* 0BH,文件属性,参考前面的说明 */ UINT8 DIR_NTRes; /* 0CH */ UINT8 DIR_CrtTimeTenth; /* 0DH,文件创建的时间,以0.1秒单位计数 */ UINT16 DIR_CrtTime; /* 0EH,文件创建的时间 */ UINT16 DIR_CrtDate; /* 10H,文件创建的日期 */ UINT16 DIR_LstAccDate; /* 12H,最近一次存取操作的日期 */ UINT16 DIR_FstClusHI; /* 14H */ UINT16 DIR_WrtTime; /* 16H,文件修改时间,参考前面的宏MAKE_FILE_TIME */ UINT16 DIR_WrtDate; /* 18H,文件修改日期,参考前面的宏MAKE_FILE_DATA */ UINT16 DIR_FstClusLO; /* 1AH */ UINT32 DIR_FileSize; /* 1CH,文件长度 */ } FAT_DIR_INFO; /* 20H */ typedef FAT_DIR_INFO *P_FAT_DIR_INFO;

我在这个结构体中增加一些内容会有影响吗? 比如说,增加文件的访问次数等信息?


这个结构是FAT的历史标准,不能跟改的. 和延时没有多大关系,你仔细检查下硬件,GND,VCC布线,还有U盘的信号线最好不要串电阻.对U盘的供电要稳定.


U盘信号线上没有串接电阻啊,我接了两个保护二极管,是按照"USB芯片的电路及PCB设计的重要注意事项.PDF"里面的第三页设计方案接的!U


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