我的U盘是4G的,我格式化了,就用ch375创建个文本文件,里面写几个中文, 结果出来是对的,但是花了很长时间啊,特别是创建文件, 我用的是内部固件。 请问这是为什么,代码延时什么的也不是很长,估计不是这个原因。
简单的说一下你的MCU资源,速度。 另外把读写函数贴出来看看。 文件系统是用我们提供的库还是你自己编写的?
MCU是atmega128,应该挺快的。 下面是代码,我只要能实现向一个文本文件写入东西就行。代码我乱改了,见笑
while ( 1 ) { printf( "等待U盘插入\n" ); while ( CH375DiskStatus < DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */ mDelaymS( 100 ); } mDelaymS( 250 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS( 100 ); printf( "U盘准备完毕 ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } #if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */ printf( "扇区太大\n" ); while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelaymS( 100 ); continue; } #endif
/* 查看是否有目标目录 */ printf( "打开U盘\n" ); strcpy( (char *)mCmdParam.Open.mPathName, "\\C51" ); /* 找这个目录 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_MISS_DIR) { send_string("没有找到目录"); /* 没有找到文件目录,要新建 */ } else { /* 找到文件或者出错 */ mStopIfError( i ); send_string("找到目录"); }
#ifdef EN_DISK_WRITE /* 子程序库支持写操作 */ /* 产生新文件 */ printf( "创建新文件\n" ); strcpy( (char *)mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目录下 */ i = CH375FileCreate(); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); printf( "写入数据\n" ); for(i=0;i<100;i++)FILE_DATA_BUF[i]='a'; FILE_DATA_BUF[99]=0; //strcpy(FILE_DATA_BUF, "郑泽凯\n郑泽凯郑泽凯\n郑泽凯\t郑泽凯郑\n泽凯" ); mCmdParam.Write.mSectorCount = 1; i = CH375FileWrite(); /* 向文件写入数据 */ mStopIfError( i ); printf( "属性\n" ); mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改 */ mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( 11, 11, 11 ); /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 1111, 11, 11 ); /* 输入参数: 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */ i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */ mStopIfError( i ); printf( "关闭\n" ); mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是CH375vSectorSize的倍数 */ i = CH375FileClose( ); mStopIfError( i );
#endif printf( "退出U盘\n" ); while ( CH375DiskStatus >= DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘拔出 */ if ( CH375DiskConnect( ) != ERR_SUCCESS ) break; mDelaymS( 100 ); } mDelaymS( 200 ); }
用的是内部固件,ch375hfb
主程序上面没什么问题,主要看你三个读写子函数。还有单片机晶振是多少?
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1uS( ); mDelay1uS( ); /* 至少延时1uS */ A0(1);mDelaymS(1); /* 输出A0=1 */ PORTA = mCmd;mDelaymS(1); /* 向CH375的并口输出数据 */ DDRA = 0xFF;mDelaymS(1); /* 并口D0-D7输出 */ CS(0);mDelaymS(1);A0(1);mDelaymS(1);WR(0);mDelaymS(1);RD(1);mDelaymS(1); /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ mDelay1uS( );DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CS(1);mDelaymS(1);WR(1);mDelaymS(1); /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ DDRA = 0x00;mDelaymS(1); /* 禁止数据输出 */ A0(0);mDelaymS(1); /* 输出A0=0; 可选操作 */ mDelay1uS( ); /* 至少延时2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { PORTA = mData; /* 向CH375的并口输出数据 */ DDRA = 0xFF; /* 并口D0-D7输出 */ CS(0);mDelaymS(1);A0(0);mDelaymS(1);WR(0);mDelaymS(1);RD(1);mDelaymS(1); /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ mDelay1uS( );mDelay1uS( );DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CS(1);mDelaymS(1);WR(1);mDelaymS(1); /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ DDRA = 0x00;mDelaymS(1); /* 禁止数据输出 */ mDelay1uS( ); /* 至少延时1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; mDelay1uS( ); /* 至少延时1.2uS */ DDRA = 0x00;mDelaymS(1); /* 数据输入 */ CS(0);mDelaymS(1);A0(0);mDelaymS(1);WR(1);mDelaymS(1);RD(0);mDelaymS(1); /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ mData = PINA;mDelaymS(1); /* 从CH375的并口PA输入数据 */ mDelay1uS( );mDelay1uS( );DDRA = 0x00; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CS(1);mDelaymS(1);RD(1);mDelaymS(1); /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); }
那几个CS(),WR()宏定义如下,应该没问题: #define A0(n) {PORTE=(PORTE&0XBF)^(n<<6);} #define CS(n) {PORTE=(PORTE&0X7F)^(n<<7);} #define WR(n) {PORTE=(PORTE&0XEF)^(n<<4);} #define RD(n) {PORTE=(PORTE&0XDF)^(n<<5);} #define RST(n) {PORTE=(PORTE&0XF7)^(n<<3);} 自己琢磨出来的方法,不过没问题。
主要是我不知道那个文件长度怎么弄,因为我一次只要写入每组14字节的数据,要写很多组。 但是那个mCmdParam.Write.mSectorCount = 1;一次至少一个扇区,太多了。 我想在txt里每写14字节的数据就换行,再写一组,请问该怎么办啊? 没认真看用户手册,先大概问问。
三个读写子函数里面这么有mDelaymS(1);延时啊,这样速度肯定很慢啊
我改改试试看,请教下面的问题。 主要是我不知道那个文件长度怎么弄,因为我一次只要写入每组14字节的数据,要写很多组。 但是那个mCmdParam.Write.mSectorCount = 1;一次至少一个扇区,太多了。 我想在txt里每写14字节的数据就换行,再写一组,请问该怎么办啊? 没认真看用户手册,先大概问问。
你可以按照字节方式来写。这样就可以解决你的问题了。
我用字节了,能创建文件,但是没有数据啊,U盘里有文件record.txt,但是打不开,还删不了,只能格式化
printf( "创建新文件\n" ); strcpy( (char *)mCmdParam.Create.mPathName, "\\record.txt" ); /* 新文件名 */ i = CH375FileCreate(); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i );
printf( "写入数据\n" ); mCmdParam.ByteWrite.mByteCount = 28; strcpy((char *)mCmdParam.ByteWrite.mByteBuffer ,"adfhgfhsfdghsdf"); i = CH375ByteWrite(); mStopIfError( i ); mCmdParam.ByteWrite.mByteCount=0; i = CH375ByteWrite(); mStopIfError( i );
文件名必须为大写,否则打不开,写完28字节之后,直接关闭文件,关闭文件的变量为1.自动更新文件长度。
解决了,谢谢了