0

关于投票
实现USB2.0高速数据传输的问题探讨

 

摘要:针对USB2.0高速数据传输在实际应用中存在的具体问题,深入分析了诸如协议开销、带宽分配、工作环境、主机硬件结构和操作系统配置、设备驱动程序等影响速度提高的种种因素。同时重点阐述了USB2.0设备接口中端点FIFO通道和GPIF通用可编程接口的关键作用。并利用USB2.0控制芯片EZ-USB FX2进行了不同模式下数据传输的实验.最后在此基础上指出解决高速数据传输问题的几条对策。

1 引言
    USB(Universal Serial Bus,通用串行总线)是计算机与其外设连接的一种新型接口技术。尽管在2000年4月27日发布的USB2.0规范中最高传输速度已经达到了480 Mbps(即60 MB/s)。但是很多USB2.0设备在实际工作时的数据传输速度却与此相差甚远。本文作者曾为此利用测试软件BusHound对诸如闪存盘、mp3、移动硬盘等典型USB2.0设备进行速度测试,其结果由表1给出。
 
    由于USB2.0的实际数据传输速度与PC主机和USB设备的诸多因素有关,且其中任一个因素都有可能成为影响数据传输速度的瓶颈。因此对此进一步地深入探讨是很有必要的。

2 影响USB2.0数据传输速度的因素分析
(1)USB通信协议的开销
    在USB数据通信的过程中,总线上传输的并不只是真正需要的数据信息,还要包括诸如同步信号、类型标识、校验码、握手信号等各种协议信息。因此实际数据传输的速率根本没有可能达到总线传输的极限速度480 Mbps。且对不同的传输类型,存在不同的协议开销。如在USB1.1协议下规定的每毫秒1帧中,对一个设备的中断传输只能进行一次,考虑中断传输的数据包为64Byte,故可算出这种传输的最大速度只有64 kB/s。
    对USB2.0的情况,由于采用了微帧结构,每帧分为8个微帧,且中断传输在每个微帧下可以传输3个数据包,而每包的数据也增加到1024个字节,故可以算出USB2.0的中断传输的最大速度提高到8×3×1024 B/ms=24 MB/s。尽管与USB1.1的64 KB/s相比提高很大,却仍与480
Mbp(60 MB/s)相差很远。
 
    如表2所示.USB2.0中最能体现高速传输特点的应属批量传输类型,其53.24 MB/s的理论传输速度上限可以说比较接近60MB/s的总线速度极限。因此,如果仅从获取最高数据传输的目标出发,应当选用批量传输工作方式。
(2)USB带宽的分配
    USB协议规定。控制传输应确保在低/全速时能够使用10%的带宽,高速时能够使用20%的带宽。而批量传输并没有保留任何带宽。即批量传输只有在控制传输和其它传输不需要使用其带宽的情况下,方能使用剩下的带宽。因此,尽管总线闲置时批量传输可以在一段时间里尽快地传输大量的数据,但总线忙时批量传输就可能工作很慢。
    通常PC主机可能同时使用诸如鼠标、键盘、摄像头、打印机和扫描仪等多种USB设备,它们分别采用不同的传输方式。可以设想.如果开始只有一个设备以批量传输方式独占系统的全部带宽。显然速度会很快(接近53 MB/s)。但如果新插入的若干设备需要使用控制传输全部20%的保留带宽,那么先前设备批量传输的可用带宽就会下降到原先的80%,传输速度可能变为42 MB/s以下。作为一种更极端情况是批量传输设备插入前,已有设备以控制传输方式完全占有了20%的保留带宽.其它设备也以中断或者同步传输方式共同占据了剩下的80%带宽,那么批量传输设备就会因为没有保留带宽,只能处于等待的状态。
    USB的实时传输可以保证传输的速率恒定,而中断传输要求每帧或每个微帧都能为每个设备进行一次数据传输。因此确保主机对设备响应的实时性。然而实时传输和中断传输并不保留带宽。主机只有在总线确实能够分配足够带宽的情况下才会接受设备的通信要求。且实时传输不进行握手包的确认过程,因而不能确保数据传输的正确性。
(3)USB设备的使用环境
    USB的使用环境也是需要考虑的一个重要因素,如果处于一个电磁环境非常复杂的使用场合。不可避免地会受到干扰而产生传输错误。尽管这种错误在大多数通信协议(控制、中断、批量传输)的管理下并不会影响通信的最终结果,但由此引发的重发、等待等纠错工作则会明显地影响数据传输速度.甚至发生堵塞的现象。因此,USB2.0设备和PC主机间最好采用带磁环的USB2.0专用连接线,且其长度最好限制在3 m-5 m 的范围内,这样受到的电磁干扰和噪声影响较小。纠错重发的概率也较小,数据传输的速度也就显得较快。
(4)PC主机本身的硬件结构与操作系统
    PC主板的数据吞吐量高度取决于USB2.0主控制器在主板芯片组结构中的位置。在用来管理I/O设备和控制I/O总线通信的南桥芯片的_T作模式下. 当USB2.0主控制器挂在PCI总线时,虽然PCI总线132 MB/s的带宽处理USB1.1下12 Mbps的传输速度没有问题,但对USB2.0高速模式就会受到PCI总线带宽的限制。因此。较新的主板将USB2.0控制器与南桥芯片直接连接。从而消除PCI总线的带宽瓶颈。
    目前PC机上大规模使用的Windows操作系统是非实时操作系统。存数据传输时,操作系统不能实时响应数据传输的请求。虽然从Windows98开始. 以及随后的Windows Me和Windows2000增加了对USB设备类的支持,但版本仍然是USB1.1。如需使用USB2.0设备,还需安装相应的USB2.0驱动程序。目前只有Windows XP的Service Pack1才能完全支持USB2.0。
(5)USB设备驱动程序
    USB设备的驱动可以分为设备驱动程序、USB总线驱动程序、USB控制器驱动程序三个部分。如图1所示。应用程序通过使用Windows API函数与USB设备驱动程序对话。USB设备驱动程序通过调用驱动程序栈完成对设备的接口操作、数据读写和管理电源等功能。USB总线驱动程序(USBD.sys)和USB2.0控制器驱动程序由操作系统提供。设备驱动通过构造URB(USB Request Block),并传给总线驱动程序来完成与总
线驱动程序的通信。通常情况下设备驱动程序需要频繁产生中断。而设备驱动程序系统优先级并不高,当计算机负荷较重或者有其它优先级较高的中断发生时,它的中断得不到处理而需要等待。如果设备驱动程序向USB总线传递URB的时候设置一个较大的缓冲区.便可减少了中断的频率而减少等待时间。从而提高数据传输的速度。此外,调整驱动程序中诸如命令排队策略、改变请求包大小等措施,也能对USB的数据传输速度产生一定的影响。

(6)USB设备的硬件与固件
    由于USB2.0的速度实在太快。一般单片机通过CPU的数据读写处理方式常常成为限制数据传输速度的瓶颈。因此为了实现USB设备与PC主机之间的高速传输,必须采用专门的接口电路和固件程序。

3 通用USB2.0设备控制器的高速工作模式
    EZ-USB FX2是一种支持USB2.0的微控制器,FX2内部集成了USB2.0收发器、智能串行接口引擎(SIE)、增强型8051内核、8.5 KB的RAM、4 KB的FIFO存储器、I/O端口、I2C总线接口、8/16位数据总线和通用可编程接口(GPIF)等,最终通过通用的标准ATA接口连接外部电路,以适应不同的用户功能。
    这里串行接口引擎SIE负责完成诸如串行数据的编码和解码,差错控制,位填充等支持USB底层协议的功能。数据传输则通常需要微处理器通过固件访问接口芯片中的端点FIFO, 也需要微处理器通过固件访问外围设备的接口电路,正如图2中标识符② 和③所示的数据传输路线。然而,这种工作方式会因微处理器固件程序执行较慢而限制数据传输速率的提高,且在高速时显得格外突出。
  
    为了适应USB2.0高速数据传输的需要.这里采用了一种特殊的数据传输模式,如图2中标识符①所示的数据传输路线,此时无需执行内部8051固件程序便可直接实现端点FIFO与外部的数据交换。从而很好地解决了普通微处理器转发方式造成的带宽瓶颈。
    实际电路结构中,4 KByte的端点FIFO可以通过固件程序配置成多重缓冲的形式,这种结构可有效地提高USB带宽的性能,平滑带宽的抖动,并减少通信等待的时间。具体控制分为从机模式和主机模式两种。主机模式是指利用FX2内部集成的通用可编程接口GPIF(General Programmable Interface)产生时序逻辑信号来控制与外围设备的数据传输。从机模式则指利用外部信号控制端点FIFO与外设之间的数据传输。
    GPIF可包含8个时序状态,支持控制输出线CTL、状态输入线RDY和地址信号ADR,构造的各种时序逻辑信号可以有效地支持16位数据总线的双向操作。描述GPIF波形的数组称为波形描述符,可以在设备初始化时同固件程序一起下载.GPIF将根据其表达的时序逻辑关系,执行相应的控制作用。
    FX2的固件程序是设备运行的核心.担负着处理USB驱动程序的请求,执行应用程序的控制指令,完成数据的读写操作,以及根据需要启动GPIF周期.实现端点FIFO与外界的数据交换等功能。固件程序并不经常参与数据传输的具体过程.通常仅起检测、判断的作用,决定GPIF的工作在何时开始.何时停止。

4 USB2.0高速数据传输的速度测试
    USB2,0速度测试的基本方法是通过PC主机上的测试软件,记录该PC主机与某USB设备在固定时间内交换的数据信息流量,进而算出实际使用中的数据传输速度。这里采用的速度测试软件是美国Perisoft公司提供的一种名为Bus Hound的总线分析测试软件.其界面如图3所示.这个软件在运行中不会对设备的工作产生任何影响。用该软件来观察USB设备工作情况,可以直接读取当前USB设备输入输出的数据量大小、数据传输速度和设备属性等信息。
    本文为USB2.0实际传输速度的具体测试流程如图4所示。利用EZ-USB FX2控制芯片开发的USB2.0设备通用控制器和一台PC机。用一根大约2 m长的带磁环的USB2.0专用连接线连接在一起。PC机的硬件配置是Intel P4 2.4 GHz的CPU,基于Inte1848芯片组的主板,主板上带有支持高速模式的USB2.0接口,256 M DDR333内存. 操作系统是WindowsXP SP1。主机设备驱动程序采用Cypress公司为FX2系列控制器提供的通用驱动程序ezusb.sys。其中数据缓冲区设为64KB,应用程序用VC编写,其作用是向USB接口控制器发送需要数据上传的指令和上传数据量的大小后。将数据从USB设备读到PC之中。作为USB设备的FX2的固件程序在Keil集成开发环境中开发。应用GPIF进行逻辑控制.并将所用端点6设为单区容量大小为512Byte的4重缓冲模式。固件程序的功能只是将来自并行数据线的数据源源不断地送往USB的端点FIFO中。
 
    在固件程序设计中首先采用图2中标识符②和③所示的数据传输模式.测得的数据传输速度一直在200 KB/s以下。然后采用图2中标识符①所示的数据传输模式,在实验中让PC主机多次重复采集大量数据。以提高速度测试的准确性。在PC机不接其它USB设备一次采集数据的量为650.2 Mbyte的情况下,USB2.0总线的实际数据传输速度最高达到了25.5 MB/s,即204Mbps。

5 结束语
    综上所述,这里强调几点看法:首先,人们通常所说的480 Mbps是USB2.0总线速度的上限.考虑通信协议的开销后,实际数据的传输速度存理论上最高也只有53 MB/s(426Mbps).实际综合条件下15 MB/s至25 MB/s都可以作为合理的高速目标。其次,为了追求数据的高速传输时应当考虑采用批量方式.但在多设备同时工作的场合考虑实时响应.USB2.0下的中断方式也是不错的选择。再者,USB设备中微处理器转发数据的传统方法不能适应高速数据传输的要求,必须建立USB端点FIFO和应用数据通道之间的直接联系。另外,为了真正实现数据的高速传输.必须综合考虑PC主机本身的软硬件配置、设备驱动程序开发和实际工作环境。

系统分类: 嵌入式
用户分类: 无分类
标签: 无标签
来源: 无分类
发表评论 阅读全文(109) | 回复(0)

0

关于投票
在单片机上实现USB移动存储

第1章 主要硬件芯片介绍
1.1系统总体设计
   USB主机系统设计是一个软、硬件结合的整体,宏观上主要包括三个层次的设计:USB总线物理层接口设计、USB核心系统设计和USB客户系统设计。总线接口主要处理主机与设备之间的电气及协议层的互连,是信息包进出的物理桥梁;USB核心系统主要管理和协调主机与从机间的逻辑数据传输,解析双方联系的握手协议,是验证信息包的逻辑关卡;客户系统是最终用户直接和USB设备功能交互的逻辑平台,不同的USB设备归属于不同的类,是利用相关的类协议来实现的,所以客户系统驱动程序具有多变性,需要为专门的类定制专门的驱动程序。
    在单片机上实现USB移动存储功能,具体包括USB主机接口的硬件设计和整机USB驱动固件的设计。其中驱动固件的设计具体又包含几个协议的实现:USB1.1控制传输协议、USB BULK传输协议、USB海量存储类协议、UFI磁盘操作命令和FAT文件系统标准等。

1.2硬件设计
1.2.1USB主控制器
    USB主控制器主要是完成底层物理接口设计,是USB系统架构的必要部分,是USB数据包进出的必经通道。本系统采用的USB主机芯片是Cypress公司的SL811HS。Cypress公司是最早从事USB芯片开发的公司之一,其EZ-USB系列芯片在业界有非常好的口碑。SL811HS是当经第一个支持USB 主从机的接口芯片,性能稳定,资料全面。
(1)芯片特性
     SL811HS是自动兼容USB全速或者低速的嵌入式USB主从机的接口芯片,它支持微处理器、微控制器或者DSP的USB接口设计,同时也可以直接连到ISA、PCMICA等其它总线[8],芯片使用标准的USB1.1协议。SL811HS通过内部集成的全/低速传输引擎产生USB串行接口功能,在全速时带宽为12Mbps,低速时为1.5Mbps。芯片支持8位并行数据端口或者I/O口的设计,同时也支持DMA,自动中断检测连接口,可以非常容易地在MCS-51系列微处理器、摩托罗拉微控制器或者其它控制芯片上完成设计。总的来说具有如下特性:

  1. 可在软件控制下,单一地实现主机或者从机功能,28脚PLCC,48脚TQFP封装。
  2. 低速1.5Mbps,高速12Mbps,主从模式下都一样。
  3. 自动检测连接设备是否为高速或者低速。
  4. 支持8位双向并口传输,或者I/O口,DMA传输。
  5. 片上集成SIE和USB传输器。
  6. 片上集成了一个USB根集线器。
  7. 256字节内部SRAM,支持乒乓传输。
  8. 工作频率在12M或者48M,3.3伏供电,最高5伏耐压接口。
  9. 支持总线挂起、唤醒和掉电模式。
  10. 自动产生SOF和循环冗余校验,自动地址增长模式,保存读写周期。

SL811HS内部电路结构见图1.1
 

(2)相关寄存器介绍
    USB系统驱动的编程,实质上就是对SL811HS的寄存器和一些缓存区的读写,SL811HS内部一共有256个字节的缓存,高端240个字节作为通用内存,可以随意访问,低端16个字节是特殊功能寄存器,USB的一些规范就融合在里面。SL811HS有A、B两套并行的寄存器,功能和使用完全一样,见表1.1。
SL811HS功能寄存器 
(3)接口电路
    SL811HS既可以作为嵌入式的主机又可以作为设备,灵活性非常大。它可以直接连到处理器或者按内存映射的方式接到ARM处理器上。硬件设计时候主要注意几个关键引脚的处理:

  1. nCS:低电平有效,使能SL811HS接口和读写寄存器与内存。必须使nCS在一个传输周期中至少要保持65纳秒以上才能进行有效的通信。
  2. nWR:低电平有效,要使数据有效nWR也至少需要持续65个纳秒以上。一但nWR  为低时,总线上的信息至少要保持5个纳秒。
  3. nRD:低电平有效,读取数据之前,必须先写入地址,nRD的最小周期是65个纳秒。一但nRD为低时,总线上的信息至少要保持5个纳秒。
  4. A0:低电平时代表地址,高电平时代表数据。A0至少要保持10个纳秒以上才能保证数据正确写入。
  5. INTRQ:高电平有效,当传输事务完成,或者有外部设备接入时,就会触发中断。通过写入中断寄存器可以清除中断。
  6. nRest:低电平有效,SL811HS上电后需要复位。

常见8位嵌入式处理器和SL811HS的连接见图1.2。SL811HS读时序见图1.3,写时序见图1.4。
SL811HS连接8位单片机 
 
 
1.2.2 微处理器
    本设计的主要目的是在普通单片机下能够使用USB移动存储,同时通过该系统的串口能够完成让外部的嵌入式设备也能使用USB移动存储。主机处理器芯片选用兼容MCS-51指令的AT89C52,并外扩一个32K的RAM。系统的功能设计见图1.5。
点击看大图 
    AT89C52控制器主要是通过SL811HS对USB移动存储进行操作,外部控制按钮(小键盘)输入不同的值可以实现不同的功能,比如写文件、读文件、建立目录或删除文件等。RS232接口,主要是留给外部系统使用,其它的嵌入式系统只要接上该系统的串口,按照一定的命令格式就可以通过串口使用USB移动存储。根据SL811HS容错报告所知,SL811HS的内部锁相环非常敏感,易受高频噪声干扰,从而导致时钟抖动,进而会使SOF不准确(标准周期为1毫秒)。解决这个问题有两种措施:

  1. 尽量使用有源的48M晶体
  2. 备选方案是使用无源48M晶振,同时在SL811HS的VDD脚加上适当的滤波电容,并注意PCB的布线。
    1.3固件程序设计
        USB主机系统固件的编写比较繁琐,主要涉及到USB控制传输、USB批量传输、海量存储类协议、UFI磁盘操作命令和FAT文件系统的编写,全部都是最底层的程序操作,没有现成的类库支持,故程序整体框架的搭建和具体协议的数据结构的组织是非常关键的。基于以上因素,构建了系统的总体逻辑设计,见图1.6。
     
        这些协议或者命令层层相扣,每一层开发的优劣不仅直接影响功能的实现,更会直接影响数据传输的稳定性和速度。该系统设计的主要难点在于软件程序的编写,由于牵涉的协议多,在编写程序时要重视模块化的思想,每一个具体的协议尽量都编写在一个源文件里,数据结构和常量、变量最好定义在每个模块的头文件中。在调试USB 底层的控制传输时,可以充分利用Bus Hound工具抓取USB移动存储刚插入计算机时与计算机通信的数据来分析、对比和参考开发,加深对USB整个底层信息交互的理解。
    1.3.1 USB总线枚举协议的实现
       任何USB设备连上USB主机后,都必须经过USB主机的枚举配置后才能正确使用。USB总线枚举的步骤和方法,对于所有USB设备来说都是一样的,必须遵守标准的USB协议过程,通过控制传输的“一问一答”来实现主机和从机必要的几个数据交流:获取设备描述符、分配设备地址和配置设备。控制传输的核心是SETUP包,其结构见表1.2。
    点击看大图 

    1. bmRequestType:共一个字节,每一位代表一定的意义。第7位D7代表数据传输方向:D7=“0”,代表主机到设备(OUT),D7=“1”,代表设备到主机(IN);D6和D5表示命令类型:D6D5=“00”表示标准请求,D6D5=“01”表示类请求,D6D5=“10”表示用户定义的请求,D6D5=“11”保留值;D4-D0表示命令的接受者类型:D4D3D2D1D0=“00000”表示接受者为设备,D4D3D2D1D0=“00001”表示接受者为接口,D4D3D2D1D0=“00011”表示为其它接受者,D4D3D2D1D0 的其它值保留。
    2. bRequest:请求命令代码,在标准的请求命令中USB为每一个命令编了一个代号,见表3.3。
    3. wValue:共2个字节,用户自定义。
    4. wIndex:共2个字节,用户自定义。

        总线枚举的所有命令都是通过SETUP包发送出去的,在SL811HS中就是通过启动DATA0把命令包发送出去。如果命令要求有数据传输,那么SETUP包后接着还有IN包或者OUT包可选数据发送,此时由于前面SETUP包已经启动了DATA0,这里就必须开启DATA1,如果数据大于端点的最大数据载荷,那么就用DATA1/DATA0的方式交替来发送。主机和设备在接收到USB包时,首先就要根据包标识域(PID)进行解码,进而区分出是什么包。USB控制传输主要是SETUP包,同时还有相应的IN包或OUT包;在控制传输完成之后接着是批量传输(BULK),这就是纯粹的IN包或OUT包的传输了。这些包在主机固件里具体如何区分、实现呢?根据表2.1可以知道检验PID的值可以区分出SETUP、IN和OUT包。那么IN和OUT包到底是控制传输中的呢?还是批量传输中的呢?此时要明白,控制传输是所有USB主机或者设备开发中的必要传输,并且只能由默认端点0来完成,所以可以在固件中判断当前信息交互的端点号就可以区分出IN和OUT包到底归属于哪一种传输。如果是批量传输中的IN包或者OUT包,那么可以直接启动DATA0/DATA1来发送数据。USB枚举程序底层数据包传输设计结构见图1.7。
    数据包发送的乒乓设计 
        形象点讲USB主机枚举的过程就是:首先获取设备属性,设备会返回18个数值(值中对固件有用的是最大包端点长度),然后为设备分配一个操作地址,地址范围可以根据实际情况而定,并且配置设备,最后列举设备端点,获取设备的每一个端点号(地址)。枚举的实质目的就是想获取设备的端点地址,靠它来完成数据包的收发。获取设备属性、分配地址等枚举请求命令都有标准说明(见表1.3)。
     
        SL811HS 芯片必须初始化、复位后才能对设备进行枚举操作,实践表明对SL811HS寄存器初始化的顺序和延迟时间非常关键,会影响到整个系统的稳定性和速度。经测试比较好的初始代码如下:

    void S811Init(void)
    {  
        SL811Write(cDATASet,0xe0); //设定SOF计数器低8位
        SL811Write(cSOFcnt,0xae);  //设定主机工作模式
        SL811Write(CtrlReg,0x5);   //开SOF
        Delay(150);               //延时       
        SL811Write(EP0Counter,0);  
        SL811Write(IntEna,0x20);   // 写中断寄存器
        SL811Write(IntStatus,INT_CLEAR);   //清楚中断
    }

    1.3.2 USB批量传输和海量存储类协议的实现
       USB主机系统实现目的是使用USB移动存储,涉及到大量文件数据的传输,所以应该选择USB批量传输(BULK)。批量传输用BULK端点进行命令、数据和状态的传输[4],其流程结构见图1.8。CBW是命令块封装包,CSW是命令状态封状包,都是一系列包的集合。
     
    (1)CBW
    CBW的长度为31字节,包含了海量存储类协议的磁盘操作命令,其结构见图1.9。
    点击看大图 

    dCBWSignature:是CBW的标志,固定值为0x43425355,所有CBW的值在USB总线上传输的时候都是按照LSB顺发送的,即最先发送低位,然后发送高位。

    1. dCBWTag:由主机产生的并发送给设备,设备会将此值填入CSW的dCSWTag,以此返回给主机。
    2. dCBWDataTransferLength:主机希望在批量端点上传输数据的大小。
    3. bmCBWFlag:一个字节的位图,D7=“0”时表示主机输出数据,反之主机接受数据,D6没有用到,D5-D0保留位。
    4. bCBWLUN:接受命令的设备逻辑单元号。
    5. bCBWCBLength:表示了CBWCB的长度,也就是磁盘操作命令的长度。
    6. CBWCB:填入磁盘操作命令。

    CBW是以二进制位发送的,每个包必须是精确的31个字节,不满足的要补0。
    (2) CSW
    CSW的长度为13字节,其结构见图1.10。
    点击看大图 

    1. dCSWSignature:是CSW的标志,固定值为0x53425355,CSW的值也都是按LSB顺序发送。
    2. dCSWTag:命令状态标签,该值与CBW中的dCBWTag值相同。
    3. dCSWDataResidue:该字段表示dCBWDataTransferLength字段中主机希望的数据长度与实际发送的数据长度之间的差额。
    4. bCSWStatus:表示命令执行情况,见表1.4
       

    (3)UFI
        UFI是Mass Storage 类的子类,支持海量存储类的USB主机应该实现这些子类命令。UFI子类命令是基于SFF-8070I和SCSI-2的,每个命令块的长度均为12字节,UFI的各种命令及操作码如表3.5。对USB移动存储的所有操作都是经过这些命令来完成的,UFI命令封装于CBW中的CBWCB块中,靠CBW传输出去,命令结果的状态保存于CSW中,通过读CSW相关结构中的数值,就可以了解命令的最终执行情况。UFI命令是标准的12字节,命令结构见图1.11。
    点击看大图 
    点击看大图 
        其中操作码与表1.5中每一种命令相对应。Lgical Unit Number(LUN),每一个设备上可能有很多个逻辑单元共享着该设备功能特性,设备上的逻辑单元都被连续从0X0-0XFF 进行编号;Logical Block Address (LBA), LBA的值从逻辑块0连续递增到最后一个逻辑块,系统中LBA代表的就是移动存储介质的绝对扇区。注意LUN和LBA的字节发送顺序都是MSB,在8位单片机里保持正常顺序即可,CBW结构定义如下:

    typedef struct _COMMAND_BLOCK_WRAPPER{
           DWORD  dCBW_Signature;
           DWORD  dCBW_Tag;
           DWORD  dCBW_DataXferLen;
           BYTE   bCBW_Flag;
           BYTE   bCBW_LUN;BYTE   bCBW_CDBLen;
           CBWCB  CBWCommand;
           BYTE   Resverd[4];
        } CBW, *PCBW;

    CBWCB是具体的磁盘操作命令,大小为12字节,用联合体定义如下:

    typedef union _CBWCB{   
           READ                 Ufi_Read;
           READ_CAPACITY        Ufi_ReadCapacity;
           WRITE                Ufi_Write;
           INQUIRY              Ufi_Inquiry;
           REQUEST_SENSE        Ufi_RequestSense;
           TEST_UNIT            Ufi_TestUnit;
        } CBWCB, *PCBWCB;

    CSW状态返回值填充在各个字段域里面,定义如下:

    typedef struct _COMMAND_STATUS_WRAPPER{
           DWORD   dCSW_Signature;
           DWORD   dCSW_Tag;
           DWORD   dCSW_DataResidue;
           BYTE    bCSW_Status;
        } CSW, *PCSW;

    为了节约存储空间和提高效率再把CBW和CSW定义在一个联合体里面,如下:

    typedef union _Block{
           CBW    CbwBlock;
           CSW    CswBlock;
        } BLOCK,*pBlock;

    在程序中定义BLOCK  idata BlockCommand,就可以访问CBW和CSW了。

 

系统分类: 嵌入式
用户分类: 无分类
标签: 无标签
来源: 无分类
发表评论 阅读全文(92) | 回复(0)
总共 , 当前 /