CH375 操作U盘创建文件的问题,请高手赐教!

用mega128+CH375B+U盘实现对U盘的文件读写操作。 使用了avr的CH375HFB.A文件子程序库。 事先做了两个实验,第一用命令0x06,传数按位取反命令,能成功。第二用CH375DiskConnect()函数,插拔U盘串口调试也能提示成功。 接下来就是要实现最开始叙述的功能。但程序死于CH375DiskReady()。后从网上看到去CH375DiskReady()函数,直接走CH375FileCreate(),程序就死于CH375FileCreate()。 不知道是什么原因,请高手们赐教!

void main(void) { char i; UINT8 returnData=0xFF; unsigned char tmp = 0; init_devices(); CH375Reset();

if(CH375LibInit()==ERR_SUCCESS) UsartSendBuf("USB初始化成功\n",14); else UsartSendBuf("USB初始化失败\n",14); while(1) { /* 查询CH375中断并更新中断状态,等待U盘插入 */ if(CH375DiskConnect()==ERR_SUCCESS) UsartSendBuf("USB连接成功\n",12); else UsartSendBuf("USB断开连接\n",12); mDelaymS(1000); /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for(i=0;i<5;i++) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS(100); if(CH375DiskReady()==ERR_SUCCESS) { UsartSendBuf("U盘准备好\n",10); break; /* 查询磁盘是否准备好 */ } } if(i==5) UsartSendBuf("U盘未准备好\n",12); UsartSendBuf("\n------------------\n",20); for(i=0;i<5;i++ ) { mDelaymS(200); } //等待 strcpy((char *)mCmdParam.Create.mPathName,title ); //写入文件

while(1) { returnData = CH375FileCreate(); UsartSendBuf("USB创建文件\n",12); UsartTransmit(returnData); UsartSendBuf("\n----------\n",12); mCmdParam.Write.mSectorCount=1; returnData = CH375FileWrite(); UsartSendBuf("USB写写文件\n",12); UsartTransmit(returnData); UsartSendBuf("\n----------\n",12); returnData = CH375FileClose(); //关闭文件 UsartSendBuf("USB关闭文件\n",12); UsartTransmit(returnData); UsartSendBuf("\n----------\n",12); mDelaymS( 1000 ); } } }

1、CH375Reset()执行后至少等待40mS才能继续操作CH375,通常这个函数用不着,参考我们的例程就可以了 2、CH375DiskReady失败,那么后续的操作时无意义的,检查CH375_INT_WIRE定义是否正确


谢谢!果然是CH375_INT_WIRE脚的问题!


另外,我仍然碰到创建的文件在windows下不能删除的问题。 仍是上面的程序,CH375FileCreate(),CH375FileWrite(),CH375FileClose()返回值都是0。 把U盘取出,放入电脑,电脑文件夹是能显示有一个title.TXT文件的图标, 但双击文件后系统提示:找不到“title.TXT”,要创建新文件吗?

程序是这样写的: char title[]={"\\title.TXT"}; strcpy((char *)mCmdParam.Create.mPathName, title); 应该没问题吧!

请高手再帮我看下原因,先谢谢了!


文件名需要大写,就直接这样做吧:strcpy((char *)mCmdParam.Create.mPathName, "\\TITLE.TXT");


正如你所说,谢谢!


我也是建了文件打不开,大写也不行,还是出现上面的问题,提示是否新建,但是查看文件的字节数里头有16个字节


楼上兄弟,请注意:

文件名必须符合DOS规范(WINDOWS下的小写或长文件名实际上都对应一个自动产生的DOS文件名): 1、文件名分为两部分,主名和扩展名,之间为小数点分开。目录名与文件名类似,下同。 2、扩展名可以省略,如果没有扩展名,小数点也必须省去,扩展名代表文件类型,只是代表而已。 3、主名长度不超过8个字符,扩展名长度不超过3个字符。 4、必须是大写字母A-Z、数字0-9、下划线等,而不能用特殊字符例如空格、斜杠、大于小于等。 5、文件名以00H结束。 例如有效文件名,字符串的最后以00H结束,C语言是"\x0": A B2KD9DI8 D4889.C D2004_12.TXT 中文.DOC 例如无效文件名(注:如果使用长文件名子程序库那么可以支持小写文件名和较长的文件名) a 小写 B2KD8D18X 主名太长 D48 89.C 空格无效 DOIW44I4.TXT2 扩展名太长 中文.DoC 小写 实际文件名还要加上左斜杠以指定目录,例如,strcpy(mCmdParam.Create.mPathName,"/MYFILE.TXT"); 注意在C语言中容易出现strcpy(mCmdParam.Create.mPathName,"\MYFILE.TXT");右斜杠必须是两个。 因为大多数用户都使用固定的文件名,不需要复杂的功能,所以我们没有在程序库中增加代码自动处理 大小写转换等问题,而是由用户根据需要自行处理,以节约不需此功能时的代码。 另外,写完文件后要及时修改文件长度,如果写入了数据而文件长度为0,那么WINDOWS也读不出数据。 对于已经发生错误的U盘,在重新使用前应该在WINDOWS下做磁盘扫描,修正原有错误后再使用。


楼上总结很好,这些实际上都是WINDOWS所规定的,所有只要按照WINDOWS的规范来操作就没什么问题了。


CH375LibInit() 返回值是0x81 ,请问cs a0 wr rd 这些引脚怎么定义啊?就是怎么和CH375HF4库文件联系起来。


不能用CH375HF4,用库CH375HFC,和CH375通讯的底层函数要自己写,参考:CH375LIB\MCS51\FILELIBC\exam7


您好,我遇到了相同的问题,CH375Diskready返回0x82能不能请您说的再详细一点


朋友,你是怎么解决的?我一直不行啊


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