回  复
1234567891011 58

查看: 71288 | 回复: 290

单片机通过CH375读写U盘文件的问题解答
wt 发表于:2005-01-19 17:04:00 1# 编辑

7

主题

10

帖子

868

积分
等级

高中一年级

私信
* 需要设计参考资料(光盘资料可以参考FILELIST.TXT文档,网上资料更新)
USB主机方式的应用可以参考CH375的资料,与计算机连接的USB设备方式(或自己做U盘)可以参考CH372
的资料。如果是读写U盘并且用量较少或者是系统集成,关心快速入门并且简单易用,那么可以参考半成
品U盘文件读写模块的说明CH375HM.ZIP;如果是做原始产品设计,关心成本,那么可以参考CH375评估板
资料CH375EVT.ZIP,其中有单片机读写U盘的多个例子源程序和U盘文件级子程序库的API说明。
在设计USB-HOST电路和PCB之前,强烈建议参考CH375的USB电路及PCB设计注意事项README.PDF。
常规问题例如不工作/连接失败可以参考CH372的问题解答,关于USB传输速度可以参考评估板中的说明。
* 有关U盘文件的一些基础知识
WINDOWS下U盘的文件系统主要有FAT12/FAT16/FAT32,我们的子程序库都能支持,使用角度感觉无区别。
单片机不需要考虑文件系统,只需要了解文件名、文件长度等基础知识。一个U盘中可以有多个文件,每
个文件都是一组数据的集合,以文件名区分和识别。文件长度是指文件中有效数据的长度,而实际占用
的磁盘空间通常大于或者等于文件长度,实际文件数据的存放可能不是连续的,而是通过一组“指针”
链接的多个块(也就是分配单元或簇),从而能够根据需要随时增大文件长度以容纳更多数据。目录是
为了便于分类管理,管理者可以人为指定将多个文件归档在一起,例如2004年的文件归到一个目录中。
* 读写U盘中的文件对单片机有要求吗
硬件上,单片机需要提供至少600字节的RAM,RAM多些可以提高速度,软件上可以采用我们的子程序库,
但是产生的程序代码可能会有几K字节,也就是说单片机的程序空间必须能够放得在几K到十几K的代码。
具体的大小与单片机内核有关,MCS51单片机需要程序空间约8KB/全功能或5KB/简功能。
如果不能满足上述条件,可以采用U盘文件读写模块,对单片机的硬件几乎没有要求,代码要几百字节,
RAM最少可以是几个字节(数据流方式)或者几十个字节(字节读写方式)或者512字节(扇区方式)。
* 关于磁盘缓冲区DISK_BASE_BUF和文件缓冲区FILE_DATA_BUF
磁盘缓冲区用于分析U盘文件系统,处理FAT和文件名等。文件缓冲区是可选的,但是为了提高速度,文
件缓冲区FILE_DATA_BUF应该有几K到几十K的大小。在字节模式下完全不需要文件缓冲区,使用下述的方
法禁止文件缓冲区:在主程序中不要定义常量 FILE_DATA_BUF_LEN,那么就不需要文件缓冲区。
* 在子程序库中如何使用双缓冲区,也就是一边读写U盘,一连采集数据或者使用数据
使用CH375FileReadX或CH375FileWriteX子程序,在调用这两个子程序之前,在命令参数中指定缓冲区的
起始地址,两次操作分别使用两个缓冲区的地址,实现双缓冲区读写。这种情况无需定义文件缓冲区。
对于一些特定应用,例如播放MP3需要及时输出数据,那么可以在xQueryInterrupt中等待中断时及时输
出数据,而不一定等到完全读到缓冲区中再输出,或者使用外部子程序方式,直接在子程序中输出数据。
* 读速度比较稳定,而写速度有快有慢
由于大多数U盘采用的闪存是以16KB为一个块进行擦除的,所以在物理扇区号是16的倍数的位置向U盘写
入16KB数据是最快的,如果跨块写U盘会稍慢些,如果是写不满一个块那么U盘还要先备份块中其它部分
而导致速度下降,如果是一次写入几十个字节的数据,那么不仅U盘备份,连子程序库也要备份一个扇区
中的其它部分(U盘读写以512为最小基本单位),此时速度是最慢的。
* 单片机产生的文件在WINDOWS下无法读取或者删除不掉
首先文件名必须符合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下做磁盘扫描,修正原有错误后再使用。
* 在U盘中无法创建更多文件
对于FAT12和FAT16文件系统的U盘,默认情况下,根目录下最多只能有512个文件(含子目录和部分已被
删除的文件),多了就无法创建。如果必须产生更多文件,两种方法可选:一是创建子目录,在子目录
中可以无限制地创建更多文件;二是在FAT32文件系统的U盘根目录下可以无限制地建议更多文件。创建
子目录可以参考评估板资料中的EXAM9。为了提高效率和便于管理,建议单个目录下文件不要太多。
* 如何了解当前文件指针和当前文件长度
有两个全局变量,文件总长度CH375vFileSize、文件当前指针CH375vCurrentOffset。
如果将文件看成一维数据流,那么文件指针是指当前处于文件的哪个位置。移动指针可以对文件的指定
位置进行读写,移动指针本身不会改变文件长度,文件长度只在关闭文件或更新长度时才刷新到U盘中。
* 对于8086、80186、80386等80X86兼容的中低档工控机,如何支持U盘
有三种方案(具体参考网上CH375X86.ZIP中的说明,用于从工控机备份数据到U盘等):
1、使用我们的80X86子程序库,与操作系统无关,理论上支持任何操作系统。
2、使用DOS操作系统的CH375驱动程序,会自动增加一个D盘(如果已经有D盘则是E盘),实际是U盘,
硬件是一块ISA(或PC104)插卡、PCI插卡、或者RS232串口板,支持U盘带电热插拔。
3、使用BIOS扩展卡,硬件是一块ISA或者PCI插卡,将U盘模似于第二物理硬盘,支持U盘启动。
如果是用DOS操作系统,那么建议用方案2,我们网上提供方案和硬件卡样品,支持FAT12/16/32等。
* 子程序库返回的各种错误码都代表什么意思
在CH375HF?.H头文件中都有定义,例如 ERR_SUCCESS, ERR_DISK_FULL,
返回0x81即ERR_CH375_ERROR说明是硬件连接错误或者CH375不工作
返回0x91即ERR_MBR_ERROR说明磁盘的主引导记录无效(磁盘未分区或未格式化),或者RAM有问题
返回0x10说明是意外错误,可能是硬件时序错误或受干扰等
* CH375支持哪些U盘
目前CH375支持市面上90%以上的标准功能的U盘,如果有U盘不支持,首先下载网上最新的子程序库或者
升级模块程序,如果仍然不支持,请将U盘型号发至我们的技术信箱,若能直接将U盘寄至我公司更好。
另外,带特定额外功能的U盘可能不支持,内置USB-HUB的U盘如果支持就要增加代码。
文章被wt2005-06-22 15:36:00时间编辑
loogle 发表于:2005-02-11 17:49:00 2#

0

主题

2

帖子

7

积分
等级

小小白

私信
hao.
shenbo0306 发表于:2005-02-27 19:54:00 3#

2

主题

10

帖子

128

积分
等级

小学三年级

私信
ding
xiaowang 发表于:2005-03-17 19:05:00 4#

0

主题

3

帖子

10

积分
等级

幼儿园

私信
不错
thinkers 发表于:2005-03-18 14:38:00 5#

7

主题

22

帖子

137

积分
等级

小学三年级

私信
长长一大片文章,密密麻麻,看不下去,能不能加大些行距,放大些字体?

还有:375做usb host读自己的usb设备(非U盘)需要demo板,选哪个demo板好?
小小何 发表于:2005-03-21 18:57:00 6#

14

主题

493

帖子

2296

积分
等级

本科二年级

私信
没有这么严重吧!好好看看啊!
很不错的啊!

楼层回复

关闭

评分

关闭
积分 评分区间 今日剩余
评分扣除自身相应积分,普通会员最高加分3分 0~10 5
你需要登录才可以发帖