在单片机上实现USB移动存储.docx

上传人:b****7 文档编号:8834685 上传时间:2023-02-02 格式:DOCX 页数:12 大小:288.46KB
下载 相关 举报
在单片机上实现USB移动存储.docx_第1页
第1页 / 共12页
在单片机上实现USB移动存储.docx_第2页
第2页 / 共12页
在单片机上实现USB移动存储.docx_第3页
第3页 / 共12页
在单片机上实现USB移动存储.docx_第4页
第4页 / 共12页
在单片机上实现USB移动存储.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

在单片机上实现USB移动存储.docx

《在单片机上实现USB移动存储.docx》由会员分享,可在线阅读,更多相关《在单片机上实现USB移动存储.docx(12页珍藏版)》请在冰豆网上搜索。

在单片机上实现USB移动存储.docx

在单片机上实现USB移动存储

在单片机上实现USB移动存储

第1章主要硬件芯片介绍

1.1系统总体设计

  USB主机系统设计是一个软、硬件结合的整体,宏观上主要包括三个层次的设计:

USB总线物理层接口设计、USB核心系统设计和USB客户系统设计。

总线接口主要处理主机与设备之间的电气及协议层的互连,是信息包进出的物理桥梁;USB核心系统主要管理和协调主机与从机间的逻辑数据传输,解析双方联系的握手协议,是验证信息包的逻辑关卡;客户系统是最终用户直接和USB设备功能交互的逻辑平台,不同的USB设备归属于不同的类,是利用相关的类协议来实现的,所以客户系统驱动程序具有多变性,需要为专门的类定制专门的驱动程序。

在单片机上实现USB移动存储功能,具体包括USB主机接口的硬件设计和整机USB驱动固件的设计。

其中驱动固件的设计具体又包含几个协议的实现:

USB1.1控制传输协议、USBBULK传输协议、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。

 

(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。

 

 

 

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底层的控制传输时,可以充分利用BusHound工具抓取USB移动存储刚插入计算机时与计算机通信的数据来分析、对比和参考开发,加深对USB整个底层信息交互的理解。

1.3.1USB总线枚举协议的实现

  任何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寄存器初始化的顺序和延迟时间非常关键,会影响到整个系统的稳定性和速度。

经测试比较好的初始代码如下:

voidS811Init(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.2USB批量传输和海量存储类协议的实现

  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是MassStorage类的子类,支持海量存储类的USB主机应该实现这些子类命令。

UFI子类命令是基于SFF-8070I和SCSI-2的,每个命令块的长度均为12字节,UFI的各种命令及操作码如表3.5。

对USB移动存储的所有操作都是经过这些命令来完成的,UFI命令封装于CBW中的CBWCB块中,靠CBW传输出去,命令结果的状态保存于CSW中,通过读CSW相关结构中的数值,就可以了解命令的最终执行情况。

UFI命令是标准的12字节,命令结构见图1.11。

 

 

   其中操作码与表1.5中每一种命令相对应。

LgicalUnitNumber(LUN),每一个设备上可能有很多个逻辑单元共享着该设备功能特性,设备上的逻辑单元都被连续从0X0-0XFF进行编号;LogicalBlockAddress(LBA),LBA的值从逻辑块0连续递增到最后一个逻辑块,系统中LBA代表的就是移动存储介质的绝对扇区。

注意LUN和LBA的字节发送顺序都是MSB,在8位单片机里保持正常顺序即可,CBW结构定义如下:

typedefstruct_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字节,用联合体定义如下:

typedefunion_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状态返回值填充在各个字段域里面,定义如下:

typedefstruct_COMMAND_STATUS_WRAPPER{

      DWORD  dCSW_Signature;

      DWORD  dCSW_Tag;

      DWORD  dCSW_DataResidue;

      BYTE   bCSW_Status;

   }CSW,*PCSW;

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

typedefunion_Block{

      CBW   CbwBlock;

      CSW   CswBlock;

   }BLOCK,*pBlock;

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1