文档库 最新最全的文档下载
当前位置:文档库 › CH375读写U盘文件的模块开发

CH375读写U盘文件的模块开发

CH375读写U盘文件的模块开发
CH375读写U盘文件的模块开发

CH375读写U盘文件的模块开发

黄显国,侯自良

中国地质大学(武汉)信息工程学院,湖北武汉(430074)

E-mail:huangxianguo@https://www.wendangku.net/doc/10178001.html,

摘要:论文在说明USB移动存储结构模型的基础上,详细叙述了CH375作为主机接口读写U盘的模块开发方法,以及U盘文件系统的实现过程。

关键词:CH375 U盘文件系统

1. 前言

USB接口由于支持热插拔、即插即用等众多优势,在计算机系统中已广泛配置和使用,而嵌入式设备为了和计算机系统交换数据,或操作其它计算机外设,也广泛引入了USB接口。USB接口包括主机(host)方式和设备(device)方式两种,计算机中配置的便是主机方式接口,而可与主机连接交换数据的USB接口便工作在设备方式下,顾名思义,它们属于被动方,接收并响应主机方的命令,诸如U盘(包括移动硬盘)、USB接口的打印机、扫描枪、刻录机等。嵌入式系统中USB系统的实现,一方面可通过选择带USB主或从接口的CPU芯片,另一方面也可通过在嵌入式系统的总线上挂接专用USB芯片加以实现。无论哪种方式,问题的关键在于USB接口的开发难度是相当大的。基于此,本设计采用一款多功能的USB专用接口芯片CH375,进行读写U盘文件的应用开发。CH375由于对相关的协议和某些固件的封装(后文细述),开发难度相对小一些,与此同时,文件系统的实现相对还要麻烦一些,但提供CH375芯片的沁恒公司为开发者提供了相关文件级子程序库,可直接调用来实现文件的常规操作。但由于对某些编译器缺乏支持,使得子程序库的应用受到限制,故本文对文件系统的实现也加以叙述。

本设计方案采用的硬件连接是MPU/MCU/DSP+CH375+U盘,软件实现包括USB驱动部分和文件系统部分。在此之前,先对海量存储设备和CH375芯片作以说明。

2. 海量存储设备

USB设备分为五个大类,即显示器(monitors)、通信设备(communications devices)、音频设备(audio)、人机输入(human input)和海量存储(mass storage)。

通常所用的U盘、移动硬盘均属于海量存储类。

海量存储类的规范中包括四个独立的子规范,即CBI Transport、Bulk-Only Transport、ATA Command Block、UFI Command Specification。前两个协议定义了数据/命令/状态在USB 总线上的传输方法,Bulk-Only传输协议仅仅使用Bulk端点传送数据/命令/状态,CBI传输协议则使用Control/Bulk/Interrupt三种类型的端点进行数据/命令/状态的传送。后两个协议定义了存储介质的操作命令,ATA协议用于硬盘,UFI协议则针对USB移动存储。

USB移动存储结构可用图1描述[1]。

图1 USB移动存储结构(左为主机端,右为设备端)

一般情况下,单片机或嵌入式系统处理USB 存储设备的文件系统需要实现上图左边的4个层次。CH375内置固件处理海量存储设备的专用通讯协议,包含了上图左边的3 个层次(标为灰色部分),支持Bulk-Only传输协议和SCSI、UFI、RBC 或等效命令集的USB 存储设备(包括USB 硬盘/USB 闪存盘/U 盘)。故关于USB接口开发中最困难的协议流的处理,CH375已作了封装,对于CH375的开发者而言是透明的。计算机将USB 存储设备组织为文件系统,为了方便单片机通过USB移动存储设备与计算机之间交换数据,实际的单片机程序主要处理FAT 文件系统层,对于编译器提供支持的开发者,这一层可以由CH375 的U 盘文件级子程序库实现。

3. 硬件设计

3.1CH375概述

CH375是一个USB总线的通用接口芯片,电源(VCC)端支持+3.3V/5V电压,支持USB-HOST主机方式和USB-DEVICE/SLAVE设备方式。在本地端,CH375具有8位数据总线D0~D7和读选通(RD#)、写选通(WR#)、片选控制线(CS#)以及中断输出(INT #),可以方便地挂接到单片机/DSP/MCU/MPU等控制器的系统总线上。在USB主机方式下,CH375还提供了串行通讯方式,通过串行输入(RXD)、串行输出(TXD)和中断输出与单片机/DSP/MCU/MPU 等相连接。CH375的USB 主机方式支持常用的USB 全速设备,外部单片机可以通过CH375 按照相应的USB 协议与USB 设备通讯。CH375 还内置了处理Mass-Storage 海量存储设备的专用通讯协议的固件,外部单片机可以直接以扇区为基本单位读写常用的USB 存储设备。

其芯片引脚定义如图2[2]。

图2 CH375引脚定义 图3CH375硬件连接原理图

3.2 硬件连接

本设计中使用CH375的主机功能,采用并口方式与DSP/MCU/MPU相连,U盘专指普通的USB闪存盘。

本系统硬件设计框图如图3。

CH375通过数据线D0~D7连接单片机数据I/O口用于传输字数据,INT#为中断信号线,用于单片机接收来自CH375的中断信号。CS#分别为单片机对CH375芯片的片选信号线,一般接入单片机端的地址线,RD#、WR#为单片机对CH375的读选通、写选通控制信号,与单片机端的RD#、WR#相连,这三个控制信号都是低电平有效。A0连接单片机的地址线,以区分传输的是命令还是数据,为1时表示写命令,为0时表示读写的是数据。D+、D-为USB总线的差分信号线,用于CH375与USB设备的数据传输,已内置可控上拉电阻。

上述原理图中,对于DSP/MCU/MPU的系统有所要求,用于实现CH375的USB接口部分程序空间需要大约4KB到7KB,用于对U盘文件系统操作的RAM空间不应少于600字节。

4. 软件设计

4.1底层驱动的实现

由于CH375已经对固件程序进行了封装,包含了对海量存储设备通讯协议Bulk-Only传输协议的处理,诸如设定设备地址、获取描述符等,所以这一层我们一般无须再去考虑怎样实现。如果有特殊应用要求,CH375还提供了外置固件命令。

4.2编写有关API函数

CH375内置的固件程序,提供了专用于USB 海量存储设备的部分常用命令,这些命令列表说明如下(H表示十六进制):

表1 内置固件模式命令[2]

代码命令名称输入数据输出数据命令功能

05H RESET_ALL (等待40ms) 硬件复位

06H CHECK_EXIST 任意数据按位取反测试工作状态

15H SET_USB_MODE 模式代码(等20us)操

作状态

设置USB模式

22H GET_STA TUS 中断状态获取中断状态并取消请求

28H RD_USB_DA TA 数据长度与

数据流从当前USB中断端点缓冲区读取数据块

2BH WR_USB_DATA7 数据长度与数据流向USB主机端点输出缓冲区写入数

据块

51H DISK_INIT 产生中断初始化USB存储设备

52H DISK_SIZE 产生中断获取USB存储设备的容量

53H DISK_READ LBA地址与扇区数产生中断从USB存储设备读数据块

54H DISK_RD_GO 产生中断继续USB存储设备的读操作

56H DISK_WRITE LBA地址与扇区数产生中断向USB存储设备写数据块

57H DISK_WR_GO 产生中断继续USB存储设备的写操作

前三项命令用于完成USB的初始化,命令代码28H、2BH表示单片机读、写数据块,首先读写的是数据块长度,也就是后续数据流的字节数,有效值从0 至64,如果长度不为0,则单片机必须将后续数据从CH375 逐个读取完。命令代码51H~57H底纹为灰色的部分表示对U盘的操作命令,输出数据为中断状态,可用GET_STATUS命令获取这些中断状态代码。

以下是USB主机方式下常见中断返回状态,调试过程中可通过串口打印出代码进行分析。

表2 USB主机方式下常用中断状态[2]

状态字节状态名称中断状态分析说明

14H USB_INT_SUCCESS USB事务或者传输操作成功

15H USB_INT_CONNECT 检测到USB 设备连接事件

检测到USB 设备断开事件

16H USB_INT_DISCONNECT

控制传输的数据太多,缓冲区溢出

USB

USB_INT_BUF_OVER

17H

USB存储设备读操作,请求数据读出

USB_INT_DISK_READ

1DH

USB存储设备写操作,请求数据写入1EH USB_INT_DISK_WRITE

存储设备操作失败

1FH USB_INT_DISK_ERR USB

对于最常用的读写U盘操作,以按字节方式,可定义实现以下两个读写U盘内容的API 函数[3]。

unsigned char CH375_ReadUD(unsigned char xdata *pData,long LbaNo,uint BytesLen) unsigned char CH375_WriteUD(unsigned char xdata *pData,long LbaNo,uint BytesLen)第一个函数表示从4个字节表示的U盘LbaNo地址开始读取BytesLen长度的字节到pData所指的缓冲区中。第二个函数将pData所指的外RAM单元内容读取BytesLen字节长度并写入到U盘以LbaNo开始的地址中去。

4.3文件系统的实现

单片机可通过CH375按字节或扇区等方式读写U盘,这种方式将USB存储设备简化为一种外部数据存储器,这时写入U盘的数据不能直接用计算机读取,需要专门的工具才能查看。为了使U盘的数据能够被计算机识别和操作,需要将写入的数据组织成文件,U盘通常支持的文件格式为FAT12/16/32,考虑到U盘的容量,最常用的文件系统是FAT16。

4.3.1U盘文件系统

FAT 结构是所有按照FAT 文件系统来组织存储单元的介质都必须遵守的一种文件系

统格式,而对于不同的介质,其结构又有些差异,U盘使用Flash 作为存储介质,所以有特定的结构特点。可以归纳如下[4]:

1)硬盘的划分单位为柱面,磁道,扇区。U盘的划分单位为块(block),页(page)。

2)U盘以页为单位进行读写;写前必须先擦除原有内容;擦除操作必须按块进行,即一次至少擦除一个块的内容。

针对这种情况,将Flash 的一页定为1个扇区,将其2个块,64个扇区定为一个簇,这样,簇的容量刚好为512×64=32K,满足FAT16 对簇大小的要求。

FAT 按簇来分配空间,但是给出的地址却是LBA(Logical Block Address),即它只给出一个扇区号,需要将LBA转换为物理地址,这样,才可以对数据进行存取操作。1个块包含32个页,转换公式为:

Flash 的Block = Logical Block Address/0x20

Flash 的Page =Logical Block Address %0x20

由于作为U 盘的Flash 不要求启动,因此可以没有MBR 区,只包含DBR、FAT、FDT 和DATA 四个区。以FAT16文件格式为例,U盘空间分配如下表所示。

表3 U盘空间分配

LBA Block/Page 长度内容说明

0 0,0 512

DBR=BPB+Excutable Code+55AA(查看内容)

区(第一份FAT)

1~2 0,1~0,2 1024

FAT

区备份(第二份FAT)

3~4 0,3~0,4 1024

FAT

5~39H 目录区(在BPB 中调整目录项数,使其刚好占尽本簇)

40H 数据区(因目录区占尽一个簇,故数据区始于新簇首扇)

4.3.2 定义数据结构

有了U盘fat16文件系统的空间分配之后,相应的数据结构也就出来了,比如对DBR (Dos Boot Record操作系统引导记录)区中的BPB(Bios Parameter Block磁盘参数表),可以定义成如下结构体:

typedef struct

{

word SectorBytes; //每扇区字节数

byte SectorsPerCluster; //每簇扇区数

word ReservedSectors; //保留扇区数

byte NbrFat; //FAT的个数

word RootEntry; //根目录项数

word TotalSectors; //分区总扇区数(分区小于32M时)

byte Media; //分区介质标识

word SectorsPerFAT; //每个FAT占的扇区数

word SectorsPerTrack; //每道扇区数

word Heads; //磁头数

dword HiddenSectors; //隐含扇区数

dword BigTotalSectors; //分区总扇区数(分区大于32M时)

}BPB_FAT16;

然后给结构体各变量赋值,再根据上文读写U盘的API函数,将其写入已按块擦除的U盘对应地址。

4.3.3 定义文件操作

根据FAT16系统的磁盘特性,定义所需要的各种操作函数。提供给外部调用以实现对文件的各种操作。下面对几个常用的操作函数的定义方法作以说明。

①创建目录bit fat_dcreate (char *dir_name, Byte attribute)。在根目录区或指定的子目录区中填加新目录的数据结构。

②删除目录byte fat_ddel(void)。在根目录区或指定的子目录区中找到所需删除的目录,并置相应标志。

③创建文件bit fat_fcreate (char *file_name, Byte attribute)。当写一新文件时,需在FAT表中查找未使用的簇,并将该簇号写入文件对应目录数据结构中的起始簇号位置。当此文件长度大于一簇时,还需在FAT表中对应的起始簇号位置填入下一可用簇的簇号,直到文件的最后一簇(FAT表中的相应位置填FFFF)。

若磁盘有备份FAT,还需在备份FAT表的相应位置填入正确的内容。

④删除文件Byte fat_fdelete (void)。删除文件时,除了将该文件对应的目录数据结构置相应标志外,还要修改FAT表及备份FAT表。将此文件使用的簇号位置清0,表示此簇当前未被使用。

5.结论

本文所论述的U盘读写模块开发模型,可广泛应用于各类电子消费产品的研发中,作为一款USB接口芯片,CH375的工作方式比较灵活,开发难度也不大,复杂的工作集中在文件系统的建立上。关于文件系统的内容,不是简单几页就能论述清楚的,开发人员可通过参考相关书籍和阅读fat文件系统源代码学习。建议研发人员通过所提供的文件级子程序库操作文件。

参考文献

[1] 北航 frank,USB项目技术报告[R], 2002.12

[2] USB 总线接口芯片CH375中文手册[S],版本:3A, 南京:沁恒电子,https://www.wendangku.net/doc/10178001.html,

[3] USB 芯片CH375 的评估板说明及应用参考,版本:2B,南京:沁恒电子,https://www.wendangku.net/doc/10178001.html,

[4] FAT32 File System Specification[S], Microsoft Corp. , Version1.03 , December 6, 2000.

Using the CH375 to Design the Module Reading and Writing

the USB Flash Disk Files

Huang Xianguo,Hou ziliang

Faculty of Information Engineering, China University of Geosciences, Wuhan, PRC

(430074)

Abstract

The paper describes the USB removable storage structure in the first, and the following hold a deep discussion how to develop the modules to read and write the USB flash disk by using the CH375 chip as the host interface. As well as, the paper instructs the implement process of the USB flash disk files system.

Keywords:CH375 USB Flash disk files system

作者简介:

黄显国,男,1979年生,中国地质大学(武汉)硕士研究生,主要研究方向是人机接口,嵌入式系统设计;

侯自良,男,1957年生,中国地质大学(武汉)研究员,主要研究方向人机接口,自动控制。

相关文档