基于ARM的嵌入式USB大容量存储设备的设计【字体:A】DesignofMassStorageDeviceinEmbeddedSystemBasedonARM摘要本论文采用USB技术,以SD卡作为存储介质,提出了在AT91SAM7S64处理器上开发USB大容量存储设备的解决方案;本系统基于处理器内嵌的USB设备端口,遵守大容量存储设备类规范,从功能上把系统的实现划分为物理层、设备枚举层、设备响应层和磁盘功能层四个层次,实现了嵌入式系统与PC的数据交换。关键词嵌入式系统;USB;Mass-storage类;SD卡Abstract:ByusingUSBtechnologyandSDcardasthedatastoragemedium,asolutionofUSBmassstoragedevicebasedonAT91SAM7S64processorisproposed.BasedonembeddedUSBdeviceportandspecificationofmassstoragedeviceclass,theimplementationofdevicecanbedividedintofourclassesaccordingtothefunctionofmassstoragedeviceclass,includingphysicallayer,deviceenumerationlayer,deviceresponselayeranddiskfunctionlayer.DataexchangebetweenembeddedsystemandPCisrealizedviaproposeddevice.Keywords:EmbeddedSystem;USB;Mass-storageclass;SDcard引言基于ARM微处理器的嵌入式系统因其具有性能高、成本低和供耗低的特点,被广泛应用于多种领域,如嵌入式控制、消费类/教育类多媒体、DSP和移动式便携设备。针对移动式便携设备对数据存储与交换的要求,在嵌入式系统中实现USB设备功能,可以通过USB大容量存储设备类规范实现移动式便携设备与PC进行数据交换。因此,在嵌入式系统开发中,开发出大容量存储设备与PC进行数据通信,具有极大的实用价值。1USB大容量存储设备协议分析USB设备分为五个主要类别:显示器类(Monitors)、通讯设备类(Communicationdevices)、音频设备类(Audio)、人机输入类(Humaninput)和大容量存储类(Massstorage)。大容量存储(Massstorage)类别包含软盘、硬盘、CD等。在Windows上所有使用大容量存储驱动程序的设备,都会在[我的电脑]中以磁盘驱动器的类型出现。USB大容量存储设备类规范包括四个独立的子类规范,这四个子类规范分别是:1、批量单独输送(Bulk-Only)2、控制/批量/中断输送(CBI)3、UFI命令规范4、ATA命令块。其中前两个CBI和Bulk-Only是两个相互独立的大容量存储类协议,设备厂商可以选择其中一个。CBI使用Control,Bulk和Interrupt三种类型端点来处理主机与设备间的命令、数据和状态的传送,而Bulk-Only只用Bulk端点传送。后两个子规范则定义了存储介质的操作命令,ATA命令规范用于硬盘,UFI命令规范是针对USB移动存储而制定的[1]。MicrosoftWindows中提供对MassStorage协议的支持,因此USB移动设备只需要遵循MassStorage协议来组织数据和处理命令,即可实现与PC机交换数据。而Flash的存储单元组织形式采用FAT16文件系统,这样,就可以直接在Windows的浏览器中通过可移动磁盘来交换数据了,Windows负责对FAT16文件系统的管理,USB设备不需要干预FAT16文件系统操作的具体细节。在该系统中,我们的任务就是使用Bulk-Only协议,实现USB逻辑功能层和构建在该层上的UFI设备层的功能,使磁盘能作为一个U盘被主机访问。USB大容量存储设备软件整体结构如图1所示。图1USB大容量存储设备软件整体结构示意图图1中,虚线右边部分是大容量存储设备的驱动程序结构,也是嵌入式USB大容量存储设备所要实现的。图1中虚线右边中间的UFI/ATA命令处理层将PC应用程序的访问转换成UFI或ATA命令/数据格式,与外部存储设备之间按照子规范UFI或ATA的定义进行命令/状态/数据的交换;最底层则是USB传输驱动,负责接收从上层发送到USB总线上的UFI/ATA数据以及发送从存储设备返回的状态/数据。2系统设计2.1硬件设计本系统的硬件设计主要包括AT91SAM7S64处理器、USB设备端口(处理器内置)、SD卡和串口组成,系统总体设计框架如图2所示。图2总体设计框图2.1.1AT91SAM7S64处理器的选择AT91SAM7S64是ATMEL公司推出的一款32位ARM7内核闪存控制器,它集成了ARM7TDMI内核处理器,具有高性能的32位RISC架构,高密度的16位指令集和极低的功耗,嵌入式ICE电路仿真,支持调试通信。它内部分别具有64KB的FlashROM和16KB的SRAM,无需外部扩展存储器。芯片内部集成了USB2.0设备端口,以及丰富的片内外设资源。AT91SAM7S64已经成为连接PC或手机的外设应用的理想芯片,极具竞争力的性价比进一步拓展了它在低成本、大产量的消费类产品中的应用[2]。2.1.2USB设备端口本设计采用AT91SAM7S64自带的USB设备端口,且完全符合USBV2.0全速器件规范。USB设备自动检测挂起与恢复,通过中断来停止处理器。通过APB总线接口访问UDP,通过对APB寄存器8位值进行读/写以实现对数据FIFO的读写。UDP外设需要两个时钟:用于MCK域的外设时钟和用于12MHz域的48MHz时钟。外部恢复信号可选。它允许在系统模式下唤醒UDP外设。然后主机将通知请求恢复的器件。USB接口进行枚举时,该特性必须由主机处理。USB物理收发器集成在芯片中,双向差分信号DP与DM对于产品边界有效。2.1.3存储设备及接口的设计本设计磁盘采用SD卡(SecureDigitalCard),SD卡是一种基于闪存(FlashMemory)的存储卡,由于它具有安全性高,容量大,性能佳,环境适应性好等优点,目前已有越来越多的消费类数码产品采用SD卡作为存储介质,如数码相机、掌上计算机、MP3播放器等等。SD卡遵循SD总线模式和SPI总线模式,SD总线模式的优点是可以采用4条数据线并行传输数据,数据传输速率高;缺点是传输协议较为复杂,只有少数高档的单片机才提供此接口,若用软件的方法来模拟SD总线,则是很繁琐的,而且这样将大大降低SD卡的数据传输速率。SPI总线模式缺点是只有一条数据传输线,所以数据传输速率较低;优点是绝大多数中高档单片机都提供SPI总线,即使不提供,也很容易用软件的方法来模拟SPI总线,而且SD卡的SPI总线模式传输协议简单,易于实现[3]。考虑到AT91SAM7S64处理器提供SPI总线模式接口和软件系统的可移植性(移植到没有SD总线模式接口的单片机上),本设计采用了SPI总线模式。SD卡所有的数据和控制命令均通过SPI总线接口实现,因此与AT91SAM7S64的接口实现比较简单。SPI(SerialPeripheralInterface,串行外围设备接口总线)总线技术是MOTOROLA公司推出的一种同步串行总线接口,它是目前单片机应用系统中最常用的几种串行扩展接口之一。SPI总线有三根线进行数据传输:同步时钟线(SCK),主片输入从片输出线(MISO)、主片输出从片输入线(MOSI),另外还有一条低电平有效的从片选择线(CS)。主片提供SPI系统的同步时钟脉冲和片选信号。SPI总线模式的数据是以字节为单位进行传输的,每字节为8位,每个命令或数据块都是字节对齐的(8个时钟的整数倍)。主机与SD卡的各种通信由主机控制,主机在对SD卡进行任何操作前必须首先拉低SD卡的片选信号CS(CardSelect),然后主机可向SD卡发送命令,SD卡要对主机发送的任何命令进行响应,不同的命令会有不同的响应格式(1字节或2字节响应)。SD卡除了对命令响应外,在执行写操作时,要对主机发送的每一个数据块进行响应(向主机发送一个特殊的数据响应标志)。2.2软件设计本系统功能主要通过软件系统来实现,程序采用分层次,模块化的方法进行编写,上层函数通过调用底层函数来实现对硬件的操作,这样程序的可移植性和可扩展性大大增强。整个软件系统由主程序、中断服务子程序等组成。系统的工作流程是:当USB设备插入PC之后,主程序负责整个系统的初始化工作,然后等待PC的USB主控制器与设备进行数据交换,产生中断信号,系统通过响应中断服务子程序来设置标志位。USB_TASK()函数是主程序中的循环处理函数,它根据标志位来分别对发送、接收数据及处理USB插拔事件等做出响应。首先设备与PC完成设备的枚举、配置等操作,以此来实现不同的功能,最终PC识别出该设备并可以与设备进行数据交换。主程序流程图如图3所示。图3主程序流程图下面着重分析软件系统的核心部分——USB大容量存储设备的实现方法及其调试方法。2.2.1大容量存储设备的实现从功能上可把本系统的实现划分为四个层次:(1)USB物理层该层完成UDP的初始化工作,使USB设备端口正常工作,保证数据能够通过USB总线正常传输。(2)USB设备枚举层在该层上,设备通过响应主机的标准设备请求,使主机能识别它。主机得到USB设备的描述符后,即完成了设备的配置,识别出Bulk-Only的MassStorage设备,然后会进入Bulk-Only传输方式。在此方式下,主机与设备之间的所有数据均通过Bulk-In和Bulk-Out来传输,而不再通过默认控制端点0来传输。(3)MassStorage设备响应层在该层上,设备与主机通过USB端点按Bulk-Only模式响应UFI(SCSI命令子集)中的指令。Bulk-Only传输协议由3个阶段组成:带CBW结构的命令阶段,数据阶段,带CSW结构的状态阶段。每一个CBW结构都包含SCSI命令(CBW和CSW是一系列包的集合,简称封包)。当USB设备收到SCSI命令包时,该层对命令包进行解析,然后决定SCSI命令的类型;在数据阶段,USB设备按CBW结构接收或发送原始数据;在状态阶段,USB设备发送CSW状态包来指示请求的成功或失败。SCSI命令处理流程如图4所示。图4SCSI命令处理流程(4)磁盘功能层该层就是主机对磁盘操作的底层程序,设备能作为一个磁盘被主机访问,主机能够对设备完成所有的磁盘操作(包括读文件、写文件、格式化等)。本设计采用SPI总线对SD卡进行单块读写操作,程序中直接调用两个函数AT91_Read_SD()和AT91_Write_SD()即可,但写操作的数据块长度是512字节,注意必须在写数据过程中按照读、修改、写的操作顺序。2.2.2系统调试在进行USB设备开发过程中,难点是对设备端的程序进行调试。由于USB协议对时间延迟有严格的限制,这就使得程序必须在有效时间内对某些请求或状态进行处理,否则USB将无法正常工作。因此,在调试过程中,较多借助串口输出程序输出的一些信息来辅助调试,定位问题所在。比如,在某个函数中加入输出语句,程序运行时看有否特定的输出内容,借此来判断此函数是否得到了执行,并通过输出一些变量来查看状态。调试工作基本分三步进行:首先对外部设备(ARM部分)借助串口输出信息和PC调试软件(BusHound调试软件)将设备端的USB协议(主要有描述符请求、端口配置、地址设置)调通;然后,用调试好的USB设备接口来实现PC与SD卡的数据交互;最后,加上USB设备端的其它用户程序,对整个完整的系统进行系统调试。结语本文所设计的基于AT91SAM7S64嵌入式处理器实现的USB大容量存储设备,因其具有硬件结构简单,协议的实现具有良好