网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 超前科技开发网 >> 文章中心 >> 接口开发 >> USB开发 >> 文章正文
  [推荐]单片机通过CH375读写U盘文件的问题解答           ★★★ 【字体:
单片机通过CH375读写U盘文件的问题解答
作者:未知    文章来源:本站原创    点击数:    更新时间:2006-9-6    


* 需要设计参考资料(光盘资料可以参考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盘如果支持就要增加代码。

 

/* 错误码 */
#define ERR_SUCCESS      0x00 /* 操作成功 */
#define ERR_CH375_ERROR   0x81 /* CH375硬件错误,可能需要复位CH375 */
#define ERR_DISK_DISCON   0x82 /* 磁盘尚未连接,可能磁盘已经断开 */
#define ERR_STATUS_ERR   0x83 /* 磁盘状态错误,可能正在连接或者断开磁盘 */
#define ERR_MBR_ERROR     0x91 /* 磁盘的主引导记录无效,可能磁盘尚未分区或者尚未格式化 */
#define ERR_TYPE_ERROR   0x92 /* 磁盘分区类型不支持,只支持FAT12/FAT16/BigDOS/FAT32,需要由磁盘管理工具重新分区 */
#define ERR_BPB_ERROR    0xA1 /* 磁盘尚未格式化,或者参数错误,需要由WINDOWS采用默认参数重新格式化 */
#define ERR_TOO_LARGE    0xA2 /* 磁盘非正常格式化并且容量大于4GB,或者容量大于250GB,需要由WINDOWS采用默认参数重新格式化 */
#define ERR_FAT_ERROR    0xA3 /* 磁盘的文件系统不支持,只支持FAT12/FAT16/FAT32,需要由WINDOWS采用默认参数重新格式化 */
#define ERR_DISK_FULL    0xB1 /* 磁盘文件太满,剩余空间太少或者已经没有,需要磁盘整理 */
#define ERR_FDT_OVER    0xB2 /* 目录内文件太多,没有空闲的目录项,FAT12/FAT16根目录下的文件数应该少于500个,需要磁盘整理 */
#define ERR_MISS_DIR    0xB3 /* 指定路径的某个子目录没有找到,可能是目录名称错误 */
#define ERR_FILE_CLOSE   0xB4 /* 文件已经关闭,如果需要使用,应该重新打开文件 */
#define ERR_OPEN_DIR    0x41 /* 指定路径的目录被打开 */
#define ERR_MISS_FILE    0x42 /* 指定路径的文件没有找到,可能是文件名称错误 */
#define ERR_FOUND_NAME   0x43 /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中,如果需要使用,应该打开该文件 */
/* 代码2XH-3XH用于USB主机方式的通讯失败代码,由CH375返回 */
/* 代码1XH用于USB主机方式的操作状态代码,由CH375返回 */
#define ERR_USB_CONNECT   0x15 /* 检测到USB设备连接事件,磁盘已经连接 */
#define ERR_USB_DISCON   0x16 /* 检测到USB设备断开事件,磁盘已经断开 */
#define ERR_USB_DISK_ERR  0x1F /* USB存储器操作失败,在初始化时可能是USB存储器不支持,在读写操作中可能是磁盘损坏或者已经断开 */
                            0x05     no usb

欢迎进入超前MCU技术论坛对 单片机通过CH375读写U盘文件的问题解答进行讨论!
文章录入:armopen    责任编辑:armopen 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    基于CH375的LPT-USB打印机驱
    CH375的原理及应用
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    Copyright 2003-2006 http://www.mcu123.com/© All Rights Reserved
    版权所有 © 超前科技开发网
    粤ICP备05005262号