工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->微机单片机电路图->单片机综合电路图->在嵌入式系统中实现对U盘的操作

在嵌入式系统中实现对U盘的操作

作者:dolphin时间:2011-05-05

摘要:主要介绍在嵌入式系统中利用SL811HS对U盘操作的实现方法;简要介绍USB设备中的海量存储类、SL811HS的芯片特点及FAT文件系统。
关键词:USB U盘 FAT SL811HS
引 言
  USB(通用串行总线)用于将适用USB的外围设备(device)连接到主机(host),实现二者之间数据传输的外部总线结构;是一种快速、灵活的总线接口。它最大的特点是易于使用,主要是用在中速和低速的外设。
  随着USB规范的完善和成熟,USB外设的种类不断丰富,应用领域也不断扩大。在传统的应用中,主要是PC扮演着主机的角色。根据USB的规范,可以看到在USB的拓朴结构中居于核心地位的是主机,每一次的数据传输都必须由主机发起和控制。但是随着嵌入式产品应用领域的日益增长,USB外设的应用范围也随之扩大,为此在嵌入式系统中实现对USB外设控制也变得日益迫切。
  本文针对USB外设中的U盘,说明如何在嵌入式系统中利用SL811HS实现对其的操作。
1 海量存储类
  USB设备分为五个大类,即显示器(monitors)、通信设备(communications devices)、音频设备(audio)、人机输入(human input)和海量存储(mass storage)。
  通常所用的U盘、移动硬盘均属于海量存储类。
  海量存储类的规范中包括四个独立的子规范,即CBI Transprot、Bulk-Only Transport、ATA Command Block、UFI Command Specification。前两个协议定义了数据/命令/状态在USB总线上的传输方法,Bulk-Only传输协议仅仅使用Bulk端点传送数据/命令/状态,CBI传输协议则使用Control/Bulk/Interrupt三种类型的端点进行数据/命令/状态的传送。后两个协议定义了存储介质的操作命令,ATA协议用于硬盘,UFI协议则针对USB移动存储。
  本设计中所使用的U盘遵循Bulk-Only传输协议和UFI命令规范。
2 实现方法
2.1 硬件设计
  本设计采用SL811HS芯片完成对U盘的操作。SL811HS是Cypress公司推出的具有主/从两种工作模式的USB控制器,遵循USB1.1规范;可自动检测总线速率,支持全速12Mbps和低速1.5Mbps设备;具有8位双向的数据总线,易与单片机连接;片内256字节的SRAM(其中16字节用于工作寄存器),用于数据传输;可自动产生SOF和CRC5/16,简化软件工作量;片内具有根Hub;支持挂起/唤醒工作模式,减少功耗;支持自动加1功能,减少数据读写周期;3.3V工作电源,接口可承受5V的工作电压,可与多种规格的单片机连接。
  单片机与SL811HS接口的原理如图1所示。
        

2.2 软件设计
  通过USB主控芯片对U盘操作的主要工作是在软件方面,它需要对众多规范、协议透彻的理解。下面主要通过软件的工作流程来说明设计过程。
2.2.1 SL811HS初始化
  SL811HS共有15个配置寄存器,其中0~4、8~C是USB-A、USB-B的工作配置寄存器,5、F是控制寄存器,6是中断使能寄存器,D为状态寄存器,E、F为SOF计数寄存器。各个寄存器的具体功能如表1所列。
       

  在SL811HS上电开始工作后,首先对USB总线复位(置寄存器5的位3为1,延时30ms后清零),然后使能设备检测中断(置寄存器6为0x61)。
2.2.2 设备检测
(1)软件协议
  在设备检测阶段,主要通过setup结构的数据包(8字节长)向USB设备的控制端点0(默认端点)发送命令。数据包结构如表2所列。
 

(2)实现过程
  当U盘插入USB插座时,SL811HS产生中断,通过读取中断状态寄存器可判断中断类型。当中断类型表示为检测到设备插入时,就可对USB设备即U盘进行配置了。此时还需使能SL811HS的1ms SOF(配置SL811HS的寄存器E=0xE0、F=0xAE,然后置位寄存器5的位0和寄存器0的位5),以便进行数据帧的同步。
  在U盘未配置之前,其默认地址和默认控制端点均为0。利用setup数据包对U盘进行配置时,须将U盘的地址写入SL811HS的寄存器4,将数据包的类型和U盘的控制端点写入SL811HS的寄存器3。
  以下为对U盘配置过程的主要步骤。
① 设备描述符(GetDeviceDescriptor)。请求设备描述符的setup数据包为
通过读取设备描述符,可获得设备的子类(通用海量存储类)、端点0的最大包长(一般为8字节)。
          

② 读取配置描述符(GetConfigDescriptor)。
对于请求配置描述符,可以先进行首次请求,要求数据包长为9(一个配置描述符的长度)。数据包内容为
          


接收到设备返回的数据,获得此描述符的总长,然后再发二次请求,获得全部描述符数据。数据包内容为
           

此时返回的数据包括了设备配置、接口、端点的全部描述信息。
  此部分的内容包括Configuration Descriptor、Interface Descriptor和所有端点的Endpoint Descriptor。在配置描述符中,可获得设备的属性(总线供电)以及最大功耗;在接口描述符,可获得设备的接口数量(只有一个数据接口)、接口类型(海量存储类)、接口子类代码(UFI)、接口通信协议(Bulk-Only);在端点描述符,可获得设备的In和Out端点号及此端点的最大数据包长。
③ 设置设备地址(SetAddress)。设置设备地址的setup数据包为
              

  设备地址为02或03(01一般用来表示设备为Hub)。
  到此,U盘的配置过程完成。此后的主机与USB设备之间的通信必须使用设置的地址,默认地址0不再有效,传输端点则为读取的配置描述符中所定义的端点号。
  在配置过程中各类数据内容的正确性,可借助BusHound软件工具捕捉PC机与U盘之间的活动数据,然后将自己获得的数据包内容与之相比较。



评论

技术专区