访问手机版页面
你的位置:老古开发网 > 其他 > 正文  
在嵌入式系统中提高U盘访问兼容性的几种措施
内容导读:

摘要: 本文介绍了USB产品的开发辅助工具协议分析软件Bus Hound和周立公公司提供的USB总线抓取和协议分析系统USB Anaslyst-I。再以笔者开发的单片机+USB接口芯片(SL811HS)系统为例,详细分析了提高U盘访问兼容性的几种措施。利用此措施,可以大大提高读写U盘的成功率并且兼容所有目前各大厂商的各种U盘。

关键词:  U盘;Bus Hound;SL811HS

引言

随着USB规范的完善和成熟,USB外设的种类不断丰富,应用领域也不断扩大。目前U盘几乎成了我们日常工作的必备的移动存储工具。随着嵌入式产品应用领域的日益增长,USB外设的应用范围也随之扩大,在嵌入式系统中实现对USB外设控制尤其是对U盘的操作也变得必不可少。笔者在开发U盘支持功能时,最初是选用的朗科的U216(128M)的U盘,并调试成功。可换了朗科的另外一款u200(128M)的U盘就识别不了。再试验爱国者的几款U盘也出现了类似的兼容性问题。但是这些U盘在PC机(安装windows2000)上又都操作正常。这说明笔者这个系统对U盘的操作存在兼容性问题。目前市场上的U盘的生产制造商不下几十个,而且每个品牌又包含十几甚至几十种。那么如何使U盘在嵌入式系统上操作就如同在PC机上使用一样,不存在兼容性问题?以下章节将详细分析并给出相应的措施。

常用的USB开发工具

谈到USB产品的开发,不得不涉及一些好用的辅助工具。利用这些工具会使开发取得事半功倍的效果。

Bus Hound5.0软件

Bus Hound是纯粹的软件产品,它是通过抓取scsi驱动层的数据来进行分析。它可以用来分析USB总线数据协议、捕获IO动作等。同时也可以传送用户编写的命令进行调试。操作界面如图1所示,使用步骤如下。

图1  Bus Hound 5.0操作界面

(1) 启动软件,将USB设备插入USB口;
(2) 在DEVICE内选择设备,例如我的设备是一个USB电话,则设备为USB  COMPOSITE DEVICE,选中该设备,可以在下面的PROPERTIES看到设备的总线类型,设备的电源以及各个端点的功能,在该设备下面还有两个分支:USB AUDIO DEVICE 和 "USB人体学输入设备"(这就是本设备占用的两个接口),一样在PROPERTIES里面可以看到他们的类代码为0x01和0x03;
(3) 在看完基本信息后,将上述的某个接口选中,或者全部选中;
(4) 切换到“SETTING”选项卡,将MAX PHASE设置为512,这样你就可以看到完全的DESCRIPTOR和其他的数据了;
(5) 在“PHASE TO CAPTURE”里面的几个和USB相关的选项如下:
CDB:命令描述符块;
CTL:USB控制传输;
DI/D数据输入/输出;
LEN:数据长度;
INSOC:同步传输;
RSET:总线复位;
URB:USB请求块;
USTS:USB状态
查看USB数据传输就把它们都选中;
(6) 在“Coloumn to display”里面,把里面的全部打勾选中。注意,这样要把窗体最大化才可以看见全部数据;
(7)在”CAPTURE”选项卡里面可以看到捕捉的数据了,在文本框输入文字,再点旁边的箭头,可以查询。按STOP,再按START可以清屏。

USB Anaslyst-I分析仪

USB Anaslyst-I是广州致远电子有限公司独立设计的USB开发工具,它是通过直接捕获USB总线上的数据来进行分析,是国内自主设计的USB分析工具,完全打破了国外技术垄断,价格仅为欧美同类产品的几十分之一。该分析仪完全支持USB1.1协议,界面友好(如图2),直接搭配个人电脑或笔记本使用,是广大USB接口设备开发工程师的得力助手。

图2  USB Anaslyst-I分析仪界面 

主要功能特点:
可对HID类设备和大容量设备类的分析解码;
事务级别视图和传输控制级别视图;
分组、事务、传输有效率统计功能;
在线升级功能;
铝质外观,体积小,重量轻,方便携带;
两种供电方式,满足各种计算机的要求;
USB2.0传输接口,支持Windows 98、2000、XP等操作系统;
全面支持USB1.1全速、低速数据采集分析;
支持PID或人工多种触发条件选择;
USB总线数据自动跟踪,确保数据完整无误;
同时具有USB总线错误分析和传输数据错误分析功能;
随意定义1~99Mbyte的采集容量;
强大搜索功能,可以随意查找错误帧或指定数据;
USB协议解码功能,数据阅读更加轻松;
空闲时间统计功能,数据传输过程一目了然;
完善的数据统计功能,带宽利用随手可得。

MCU(80386EX)+SL811HS应用电路

笔者开发的是用于工业控制的触摸屏系统。本系统具有主USB接口,可访问U盘。触摸屏的主CPU选用了Intel公司的 80386EX 32位处理器。这款嵌入式芯片集成了2片8259中断控制器,3片8254定时/计数器,8个片选,1个32位Watchdog,2个异步串口,1个同步串口,2个DMA通道。而且与x86系列的指令完全兼容。主控USB接口芯片选用Cypress的SL811HS。它是一个嵌入式的USB 主/从控制器。可以和各种微处理器、微控制器、DSP进行接口。SL811HS主控制器完全兼容USB1.1标准。图3是一个利用SL811HS来访问U盘的应用电路。其中USBRD、USBWR、CS5#、A0、INT7是与MCU的接口信号。

图3  U盘访问控制电路

提高SL811HS读写U盘兼容性的措施

复位SL811HS后应适当增加延时时间

当系统上电时,以及插入或拔出U盘时都需要复位(reset)SL811HS芯片,来重新更新端口状态。初始化流程如下所示。注意在复位并初始化完SL811HS芯片和读总线状态之间需适当加长延时时间。因为当插入不同的U盘时总线的稳定时间会有差别。如果延时较短,则有一些U盘就识别不到了,一般延时100ms就足够了。下面给出相关代码的描述。

SL811Write(CtrlReg,0x08);       // 复位SL811HS
SL811Write(CtrlReg,0x00);        // 设置SL811HS到正常操作模式
SL811Write(IntStatus,INT_CLEAR); // 清中断使能状态
/* 修改华旗 不能识别的问题*/
/*原程序开始*/
//EZUSB_Delay(10);    // 延时等待硬件稳定
/*原程序结束*/
/*修改后程序开始*/  
   EZUSB_Delay(100);                   // 增加延时等待硬件稳定
   /*修改后程序结束*/
      uIntStatus=SL811Read(IntStatus);    //读SL811HS的状态

设置配置(set configuration)处理不完整

应该在配置这个语句后面加上一个设置接口(set_interface)。Bus Hound软件每次枚举U盘的时候,先是set_configuration然后是 set_interface,笔者从中得到启发,实际协议上并没有这样的规定,这样做的原因在于国内的有些U盘生产厂商,照搬微软Windows操作系统的做法,Windows是每次都要这样做的,所以U盘厂商在写固件的时候,就也要让主机必需进行接口设置。

端点被禁用后需进行一系列复位处理

有些U盘在进行完查询(inquiry)命令后,在读容量(read_capability)时端点被禁用,笔者从Bus Hound中受到了启发,Bus Hound 的做法是有一个复位(reset)的过程,具体的命令就是清除端口(clear_feacture),执行完这个命令后,读容量时端点就不会被禁用了。具体的软件流程如图4所示。

图4 端点被禁用后的复位操作

每条scsi命令失败后需要进行多次重发处理

在插入U盘后,在执行读容量命令时,在命令的查询状态(csw)阶段总是返回错误。连续读5次依然是返回错误。又是借助Bus Hound,发现PC机上执行相应的命令时,若命令返回错误,它会连续发送几十次直到操作正常。原来部分U盘对部分scsi命令(如read_capability,read10,write10)等的响应非常慢。所以可以通过增加重复读取的次数来解决此类问题。笔者最后设置了100次。即重复发送100次此命令都返回错误则认为操作U盘失败。详细流程如图5所示。

图5  SCSI命令失败后增加复发读取操作

结语

以MCU(386EX)+ SL811HS系统为平台,借助USB协议分析软件Bus Hound和硬件系统Anaslyst-I分析仪,分析了U盘操作失败的原因,并给出了相应的措施。通过对目前市场上主要的几十款U盘(包括爱国者、朗科、索尼、三星等等)的测试均正常。目前本系统已经批量使用半年时间,未出现任何不兼容U盘的问题。
  
参考文献

1 张念淮,江浩等, USB总线接口开发指南. 国防工业出版社,2001
2 USB Mass Storage Class -Bulk Only Transport,1999
3 USB Mass Storage Class-UFI Command Specification,1998

标签:
来源:电子产品世界 作者:广州爱斯佩克环境仪器有限公司 张井刚 刘德活 时间:2007/2/4 0:00:00
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐