USB设备的调试与测试技巧
USB设备的调试与测试技巧
SB是一种灵活的高速接口技术,可以替代计算机中原来的串行口和并行口,但灵活性高也意味着更加复杂,使得USB设计调试以及设计完成后的验证都比较困难。本文首先对USB规范做一简要介绍,然后详细讨论USB产品在调试与规范验证方面的一些实用技巧。
通用串行总线(USB)是一种很流行的接口,可用于那些与个人计算机进行通信的设备。近年来,所有新PC机和Mac机都支持USB技术,这种接口有足够的灵活性,既可用于驱动器和键盘之类的普通外围设备,也可用于定制按特殊用途设计的外设。此外USB还有一些对用户和开发人员都很有吸引力的特性,如从总线向设备提供电源、易于通过集线器进行总线扩展,以及主计算机对设备能自动识别等等。
但USB的超强性能也意味着它的接口要比它所替代的老式串行和并行接口都复杂,每个USB设备必须响应总线上的一系列标准请求和各种事件。大多数总线交流需要双向通信,而且延迟必须很小,总线上的数据都经过编码,单单只用示波器或逻辑分析仪观察不是很容易。工程技术人员可以选择不同的工具与技术或采用不同设计,简化并加快USB的开发和故障排除。
USB规范
图1:Windows的设备管理器会显示出所有枚举成功的USB设备。
USB规范是由英特尔、微软和另外几个PC及外设公司共同提出的,在USB应用者论坛(USB-IF)的网站上提供了供开发人员使用的规范文本、相关信息及工具(详情可访问www.usb.org)。
每个总线上有一个主控制器,用来控制与总线上面设备的通信。为了给设备提供更大带宽,一台计算机可以有多个主控制器,分别控制其自己的总线。
USB支持三种总线速度:低速1.5Mbps、全速12Mbps和高速480Mbps。高速模式是2000年发布的规范2.0版本新增加的,WindowsXP是支持USB2.0的第一个Windows系统,微软公司允诺在Windows2000和WindowsME中对USB2.0提供更新支持,而其它操作系统以后也将逐渐支持USB2.0。
对于嵌入式PC操作系统,WindowsCE也支持USB。大多数WindowsCE计算机作为USB主机使用,WindowsCE3.0中还包括用于Cypress/ScanLogic公司SL11主/从控制器的驱动程序。有了这些驱动程序(或者用于其它控制器的类似驱动程序),一个WindowsCE计算机还可以作为USB外设使用。
USB的多功能性主要归功于它的4种传输类型,每一种类型适用于不同的用途。其中控制传输模式用于传输枚举过程中的请求,也用于发送请求至设备和接收答复(可选);中断传输模式用于键盘鼠标之类由主机定期发出请求和发送数据的设备;批传输模式用在诸如打印机和扫描仪之类的设备中,这类设备要求传输速度快,但在总线忙碌时传输数据可以等待;同步传输用于实时伴音和其他应用,这类应用对时序要求很高,但允许有偶尔的错误。
在自举或者当某个设备连接到总线上时,设备集线器就向主机报告连接情况,在一个称为枚举的过程中,主机发送系列请求以了解连接的设备并与之建立通信,设备则以所谓描述符数据结构返回应答信息。Windows的设备管理器将描述符内的信息与PC内部INF文档进行比较,从中找出最佳匹配,然后指定一个设备驱动程序,这样应用程序就能够访问该设备了。
所有设备必需遵循USB对功率管理的要求,包括限制设备吸收的总线电流和检测什么时候进入低功耗挂起状态,允许的电流量取决于器件描述符中的信息。
目前市面上有很多带USB功能的设备控制器芯片可供选用,有的是带一个USB口的微控制器,有的是非CPU控制器,上面带有一个USB口和一个用于与普通微控制器通信的串口或并口。大多数具有USB功能的微控制器都有C语言编译器,如果你熟悉某个微控制器系列,那么它提供的USB功能变量将非常有用。测试USB设备的通信功能包括几个阶段,第一个目
标是成功枚举,如果设备不能枚举,那么接口什么事也做不了。其它测试包括让设备执行预定的任务(例如读出或写入文档至一个USB设备),以及验证该设备是否遵循功率管理规则。
图2:从集线器上收到的设备描述符代码。
USB通信调试可在三个位置进行,即在PC主机、设备和线缆等处,每个方案都有其自己的优点。
在主机上进行调试
在主机处,可以验证一个设备是否枚举成功并能执行预定的功能。在主机检测到问题后,要找到问题根源常常还需要检查设备本身硬件或线缆中的总线通信流量情况。
当USB设备连接到主机后,Windows的设备管理器(图1)会进行快速检查,看设备枚举是否有问题。图标列表上的惊叹号表示与该设备通信或寻找驱动程序时有问题,而图标上的X号则表示设备存在但己不起作用。
为精确地看到主机在枚举时收到什么信息,可以使用USBCheck应用软件包或者新的USB指令验证器工具,USB-IF网站上免费提供了这两种工具。USBCheck能观察描述符、发送控制请求、观察结果以及在集线器和HID(拟人接口设备)上对设备做进一步测试。
USBCheck的设备框架测试能读出描述符并发送标准请求,这些测试作为初始检查非常有用,此时Windows从设备上检索到它所想要的信息。图2显示了USBCheck从集线器接收到的设备描述码。主机对USB设备枚举成功后,应用软件可以按预定用途对设备进行测试,Windows设备驱动程序可通过组合API函数如ReadFile()、WriteFile()或DeviceIoControl()等使应用软件访问USB设备。有些不同等级的设备还有额外支持,如应用软件能以访问其它驱动器的同样方法访问USB驱动器,应用软件不必了解驱动器是使用USB还是其它接口,因为这些细节在更低一级中进行处理。对于许多设备来讲,USB等级规范定义了设备的预定功能及固件响应,如HID、大容量存贮器件和用于静止图像捕获的设备等。
当出现错误时,Windows返回的错误信息通常提供不了太多帮助。例如向HID类设备发送WriteFile()函数失效时,返回的错误一般是“CRCError”,而造成传输失效的任何固件问题都会得到这个错误信息。通常排查错误要是从CRC计算着手基本上是找不到什么的,跟踪这类问题出现的原因常常需要在设备或总线上进行调试。
认证测试USB应用者论坛和微软公司可为USB设备和主机软件开发人员提供测试,通过测试的产品可以在上面使用USB标识或者MicrosoftWindows标识。
为了能在多种条件下彻底测试产品,USB-IF成员可以将自己的设备在USB-IF指定的认证程序中进行登记,一年登记费用为2,500美元,其中包括程序运行费用,以及其它支持USB产品开发和在市场上推广USB活动的费用。当某个设备符合认证程序的标准时,USB-IF将认为该设备“测量结果可以接受”,然后会把它加到认证设备总表中。在收到签署的许可协议和付款后,USB-IF将授权这一设备可以使用USB标识。
认证程序有两项评判标准,分别是检查对照表和认证测试。检查对照表包括一些与产品及其功能有关的问题,检查表可以提供给供应商,外围设备、集线器、带USB主机系统和线缆等不同供应商有不同的对照表,有些产品还需要多个检查表。外围设备检查表覆盖了机械设计、设备状态与信号以及工作电压和功耗,每个问题都相应附有标准规范中的对应页面作为参考,可以从中找到更多信息。从USB-IF的网站上可得到这些检查表。
nbs
p; 图3:带位填充的不归零倒置编码。
为帮助通过电气测试,USB-IF还提供了一个USBHSET工具,其中含有软件和测试步骤。另外也可以使用专业测试服务咨询机构VIEngineering的USB预认证测试仪,这是一个硬件单元,能执行测试文件中的所有电气测试,其中包括在LabView下运行的软件,可以观察到眼图、上升与下降次数、截面电压、浪涌电流及其它更多内容。
为帮助验证USB规范第八章中所讨论协议的响应情况,位于比利时的PIMC公司提供了一个名为Ch8ck的工具。Ch8ck执行的测试包括向并不支持的方向或者传输类型发送一个信息包ID,然后检查中断端点的响应,以及要求CRC值时的位填充情况。当认为产品能通过检查表上各项内容时,就可以准备进行认证测试了。USB-IF对一些机构提供资助,可以用不同类型的硬件测试设备,每个机构都有很多供应商和产品。你可以与主机硬件供应商一起安排专门测试,也可以参与USB-IF的“plugfests”测试,这个测试将有尽可能多的供应商把他们的设备连到一台主机上,观察所有设备是否可以相互和平共处。USB-IF也授权一些私人实验室进行认证测试。
认证测试程序文件对测试有详细描述,包括对标准请求的响应、功率的消耗和分配、信号质量和协同性等。其中协同性测试将你的产品与其它多个USB外围设备连在一个系统中并使用多种软件,以模拟用户使用情况。
设备应该工作正常,不会出现任何设备检测不到错误或者系统崩溃、死机或重新自举等错误。设备不仅要在一条只连接一个设备的总线上通过测试,而且也应该在一条连有多种集线器和其它通用外围设备的总线上通过测试。
如果设备通过认证测试,就有资格使用USB标识,为取得标识使用权,高速设备还必须在全速模式下测试所有功能。此外非USB-IF成员还须支付额外一项管理费,数额为每两年1,500美元。
对于连接在PC上的设备,微软公司鼓励采用Windows硬件质量实验室(WHQL)的测试方案,通过这些测试的设备可以使用MicrosoftWindows标识,并将列入到微软公司的硬件兼容表中,同时微软公司也会将设备的驱动程序加入到Windows驱动程序库中。
微软公司提供了用于硬件和设备驱动程序的测试组件,你可以下载所需组件并对你的设备进行测试。当你相信你的设备能够通过所有测试时,就可以提交一份材料给授权的测试机构,材料中应包括设备、驱动程序和相关文档、测试记录以及相应的费用。在www.microsoft.com/hwtest网站中可以找到有关WHQL的更多信息。
在设备上进行调试
在设备上的调试与任何嵌入式系统调试类似,提供带USB功能微控制器的供应商同时也提供了带监控程序的开发系统,监控程序可以设置断点、单步运行、跟踪模式和其它自诊断工具。
USB通信所需的固件支持数量取决于控制器芯片的结构,从芯片供应商或其它地方获得高品质固件也很重要。
MCCI公司有一个免费的USB资源编辑器,有助于将设备描述符信息翻译成C语言的数据初始化结构,并将其存在设备的程序存储器中,MCCI还提供了USBDataPump便携式固件包和安装实用程序。
图4:协议分析仪采集到的总线通信数据。
用PC作为模拟的USB设备是专用开发组件的一个低成本替代方案,可对最终驻留在嵌入式设备中的代码进行初始测试。如DeVaSys公司的USBLPT-PD11板,上面带有飞利浦PDIUSBD11USB控制器,控制器的I2C接口与PC并口进行通信,软件使用DOS版BorlandTurboC语言控制被仿真设备。
使用这一方法,你可以编写PC应用,使最终控制设备的固件执行一些功能,包括在设备枚
举和响应其它任务时发送描述符。C语言编写的PC软件对设备是可移植的,不过每个控制器都有芯片专用操作,因此针对最终产品还需要作一些修改。
在线缆上进行调试
有些时候,仅仅在主机和设备上进行调试还不够。在主机上,能够观察和控制的信息要经过主机控制器及其驱动程序过滤;而在设备上,固件又看不到硬件管理的底层通信。为填补这一空白,需要观察线缆中发送的是什么。
如果用示波器或逻辑分析仪来观察USB通信,你将会发现读取位的状态并不像将电压与逻辑电平匹配那么容易。在总线上的数据是用带有位填充的不归零倒置(NRZI)代码进行编码的,这种编码能使接收器与发送器保持同步,不需要每个字节都发送时钟信号或开始与结束位等额外的工作。
NRZI不是采用电压方式定义逻辑0和逻辑1,而是用电压改变代表逻辑0,电压保持不变代表逻辑1。如图3所示,每个逻辑0都会使前面一个状态发生改变,而每一个逻辑1则不发生状态改变,数据首先发送最低有效位。
之所以要用位填充是因为接收器在切换时要同步,如果数据全部为0会有许多转变,但如果数据中有一长串1,由于缺少转变会使接收器失去同步。
例如数据有6个连续的1,发送器就在第6个1后面填充或插入一个0(用一个切换来表示),这样就保证每7个位至少有一个转换,接收器检测到每6个连续1以后的任意位都会丢弃掉。随机数据的位填充开销仅为0.8%,即每125个数据位有1个填充位。
幸运的是,每个端口的USB硬件会进行所有编码和解码工作,所以设备开发人员和编程人员不必担心这一点。观察数据的最好方法是使用协议分析仪,这种分析仪可收集数据,然后进行解码并以有用的格式显示出来。你可以看到在枚举时发生了什么,检测和检查协议及信令错误,观察任何传输中的数据,或者关注通信中你所希望的任何方面。
任何分析仪都可以执行USB通信解码和显示结果这类基本任务,只是在用户接口和显示信息的方式上有所区别,不是所有分析仪都支持高速模式。图4显示了用Catalyst的SBAE-20总线分析仪-操作仪采集的数据。控制分析仪和观察通信数据的用户界面可以是一台PC或逻辑分析仪,与PC相连的分析仪可使用USB口、并口、以太网口或ISA板上接口连接。如果你有一台通用逻辑分析仪,那么用USB分析仪与之相连会比其它方案更便宜,如CrescentHeartSoftware的分析仪可与Tektronix的相连,而FuturePlus的分析仪可与Agilent的相连。测试设备与软件
除了通过应用程序访问设备外,进一步对总线通信和信令进行控制在测试和调试中也是很重要的,同样也有一些仪器可做到这一点ComputerAccessTechnology的通信发生器可对总线通信和事件进行精确控制,你可以在PC上运行他们的软件通过并口连接来控制通信发生器,可生成各种合法和非法信息和总线状态,而且还能控制每个位的状态和位宽度。
Transdimension的USB主机/设备操作仪和Catalyst的SBAE-20都既具有协议分析仪功能,又具有在总线上产生通信数据的主机功能,SBAE-20其它功能还包括测量涌入和挂起状态下的电流。
RPMSystems的Root1USB功能验证适配器能执行许多主机和根集线器功能,Root1可枚举相连接的设备,对其它通信进行初始化并执行各种测试,包括控制总线电压。
由于有很多新供应商进入到该领域,而原来的供应商也在扩展和改进他们的产品,因此测试工具的数量和种类在过去数年已有所增加,随着USB设备日益普及,这个趋势肯定还会继续下去。对任何开发项目来讲,对少量工具进行投资并学会如何很好使用这些工具将会在长期运行中节约更多的时间和资金。
评论