通用川行总线(Universal Serial Bus, USB)已经问世十一年了,难以置信的是,电子业界至今仍不断以创新方法来利用这套通讯协议;相对地,工程师每天却也在千百种设计方案中,重复着相同的错误。如何从错误中学习正确观念,是一项重要的功课。虽然USB与研发人员熟悉的其它协议有众多相似之处,然而相较于熟悉的PS/2与RS-232领域,工程师在USB重复犯错的次数竟然更多。此外,面对严格的标准规范,工程师犯下的错误可能会造成不符USB规范的代价。这些错误主要可分成五类:速度、电源、信号质量、软件、以及规格符合(表1)。
无法预测系统瓶颈点
许多高速系统都在这项议题上遭遇挫折,在此根据一项针对将数据写入NAND闪存之系统的分析结果来说明。这个系统透过USB传送数据,之后将数据先暂放于缓冲区(Buffer),接着再写入闪存中。每个封包都分成三种时间元素:USB传输所需时间、主要操作系统消耗时间(Operating System Overhead),以及NAND闪存韧体的编程时间。图2是128kbyte资料区块经过实时效能分析后的时序图。
工程师几乎花费所有时间,利用加快USB接口芯片的波形,以尝试降低USB传输所需的时间,直到将时间切割成不同区段。一旦工程师了解,效能其实是决定于所使用的NAND闪存可编程韧体,才能够藉由减少NAND的头段时间,来大幅提升效能。在大多数系统中,高速USB并不是瓶颈所在。因此,设计人员必须仔细检查整个系统,以确保有足够的带宽空间,来达成想要的系统速度。
速度减缓因素众多
最常见的错误,就是设计人员以为能使用全部的带宽。毫无疑问的,USB装置的速度不仅是消费者与研发者之间最常发生的争议;且是遍布全球的通路卖场中最常被问及的问题。目前有线USB装置共具备三种数据传输速度:低速USB的传输数据速度为1.5Mbps;全速USB的传输数据的速度则为12Mbps;而高速USB的传输数据的速度为480Mbps。值得注意的是,USB 2.0并不等于高速USB,高速USB最初是以USB 2.0的规格版本发表的,而该规格也同时适用于低速与全速USB的数据传输速度。
与任何电子系统一样,设计人员都希望获得最佳效能。然而对USB而言,许多设计人员在设计之初,就相信他们会从系统中得到所有的效能,达到1.5Mbps、12Mbps,或480Mbps的速度。老实说,这是很糟糕的假设,因为有很多原因会造成一项装置无法使用全部的带宽。
第一个原因,是许多使用者可共享USB总线。即使设计人员使用主机板上不同的连接埠,仍然有可能与总线上的其它装置同时共享一个主机控制器(Host Controller),也就是说,与其它所有装置共享USB总线带宽。
第二个原因,是USB封包格式化协议会把较长的数据分成数个512字节的封包。每个封包的标头(Header)负责辨识封包内容,而封包尾端则有CRC,负责确定数据的完整性。每个封包传送后,都须由接收端回复ACK(图1)。
讯框起始(Start of Frame, SOF)封包则是每125微秒传送一次,以维持总线上的时序。在此因素影响下,USB的最大带宽是每个微讯框(Microframe)可允许13个连续封包传送,相当于每秒53,248,000字节的传输速率。然而由于一般主机控制器在每个微讯框仅能接收10个连续封包,或传送8个连续封包,因此现有主机控制器无法提供理论上的速度极限值。
未取得制造商识别码
每个USB装置都有一组独一无二的识别码,让操作系统可藉以找出正确的装置驱动程序。识别码的第一部分是由USB规格制订者论坛指定的16位制造商识别码(VID)数值;而第二部分则是由产品制造商所指定的16位数值,称为产品识别码(Product ID, PID)。
若厂商与设计人员事先规画,并且能事先与USB规格制订者论坛沟通,要取得制造商识别码并且指定产品识别码,其实是相当简单的程序。然而,每年仍有数以千计的装置已完成韧体与软件的设计工作,但因无法取得适当的识别码,而造成设计延迟的情况发生。
电源限制影响设计USB总线电源
根据USB规格,USB装置可以由「总线供电」(Bus-powered)、由USB电源线提供电源,也就是「自行供电」(Self-powered),或是由电池或外接电源供电。最理想的USB供电方式是由总线供电,如此一来就不须再外接电源。
然而,利用USB总线供电,也意味着用户将受到USB规格中500微安培、100毫安、与500毫安的电流限制。但是许多设计人员却没有仔细留意这些限制,因此造成设计无法符合总线供电的规格。以下说明不同电流的设计限制。
首先,500微安培是由主机端供应电源,但是当USB没有执行传输动作时,装置必须处于USB暂停(Suspend)状态。在此状态下,只能从VBUS获得500微安培的电流。这个状态是为了当个人计算机处于暂停模式时,能将最小的电流输出降至最低。
其次,100毫安的USB规格具备高电源(500毫安)与低电源(100毫安)两个连接埠。低电源连接端口常用于总线供电型的集线器中,而且是承接500毫安的电源,再分配给下端连接埠各100毫安的电流。
当USB装置连接时,此装置在收到来自主机端的设定组态(Set Configuration)讯息之前,无法判读它是在何种连接埠上,因此会将电流限制在100毫安。
这表示该项装置必须在非常低的电源模式下,在USB上进行装置列举的作业,直到收到设定组态讯息指示,才能够切换至高电源模式。
这在高速USB上原本是非常困难的事,这情况直到2004年业者发表新款芯片之后才得以解决。最后,500毫安则是USB规格中所允许的最大电源输出值。
因此,实际设计测试应由系统工程师主导,以确保装置在由总线供电的运作模式下所需的不同电源值,否则就必须为新的USB系统额外购买昂贵的外接电源。
装置特性攸关信号质量共享D+/D-信号
为了降低时间、流程与成本,有些产品会尝试在多个装置之间共享USB信号线路。例如USB型的基座(Docking Station)可能允许一个软盘机或一个DVD播放机插入储存插槽中。这两种装置共享USB线路,就可藉由降低集线器连接埠的数目,进而节省成本。
然而,如果没有完全了解系统中的装置特性,要利用这种方法就相当困难。在三态(Tri-state)编排中,如图3的设计选择二,总线上的另一装置会增加USB线路上的电容值,而连结至该装置也会造成信号反射,干扰高速USB的运作。另外,在开关型编排中(如图3的设计选择一),开关本身会对USB线路造成额外的电容值与电阻值,这将会减缓USB线路上信号的上升/下降时间,并且造成USB信号眼(Eye)缩小。
图4显示一般USB装置信号以10pF/10奥姆负载,传输经过开关后的信号眼图。在单一信号眼图中,红色区域内应该不会存在干扰。而USB信号共享线路成功的关键,就是必须维持开关的低负载,并且采用具备高信号转换速率的芯片。
逆流电源
「自行供电」的USB装置也有本身电源的问题。由于这类装置有独立的电源供应器,因此可能在主机端关闭时,仍处于开机状态。这种情况可能让D+信号有小幅电压上升,而造成USB装置侦测的部分会缓慢地对整个主机系统充电,进而干扰系统的启动。自行供电的USB装置(包括由电池供电的装置)必须直接由VBUS消除该电压上升的问题,或是透过软件控制,利用VBUS感应器将装置关闭。
自行开发软件带来风险不使用现有类别驱动程序
类别驱动程序(Class Drivers)是USB系统环境中非常重要的部分。这些驱动程序是由主要操作系统提供,因此毋须另外进行开发。USB的类别是由装置工作小组(Device Working Groups)定义,这是一个在USB制订者论坛(USB-IF)号召下组成的自发性团体,目的在创造装置之间标准的沟通语言。
目前市面上的USB装置类别包括各类人性化接口装置(例如鼠标、键盘、或其它控制器等)、大量储存装置(例如各式磁盘驱动器)、通讯装置(例如调制解调器、网络适配卡)、音频信号、影像、以及静态影像(例如:相片与扫描仪)。
若一项新设计的装置完全符合现有的类别架构,那么只须到www.usb.org下载类别定义,并以此进行设计即可。然而,若某项装置并非完全符合现有的类别,该装置还是可用的,例如,微软就采用静态影像类别(Still Image Class),设计新的媒体装置通讯协议(Media Transfer Protocol, MTP)类别。另外,人机接口装置并不一定要连接到与使用者互动的接口上,它也可以在不另外开发新驱动程序的情况下,与程序中的温度计、压力传感器、帮浦控制器等装置连结。
虽然藉由一个类别驱动程序就能够完成设计,许多公司基于某种原因还是会想尝试开发专用驱动程序,或以高价委外,由外部设计公司开发驱动程序。类别驱动程序不仅能够排除设计风险、成本与时程等问题,也可避免许多除错与复杂度的问题。
电磁干扰可接地解决
要介绍良好的电磁干扰(EMI)设计技术,足以另外写成一篇文章,不过,最常见也最容易解决的电磁干扰错误,就是尝试利用系统的接地面作为USB缆线的屏蔽。这会让噪声引入接地面上,进而越过装置屏蔽(图6)。
USB规格验证严格在规格测试前进行原型测试
产品必须通过USB规格测试,才能合法使用各类USB标章(图5)。USB规格制订者论坛负责规格测试,以确保所有用户都能有良好的使用经验。由于所有USB厂商相互依存,以建立良好的商誉,因此这点相当重要。若用户对于某个USB装置产生不好的经验,将会大幅降低使用其它装置的意愿。
研发厂商可能无法负担规格测试流程中一些需要昂贵高阶测试设备的步骤。然而,许多装置无法通过规格测试的原因,则是因为某些厂商没有检查一些简单的项目。
因此,在装置送测之前,必须至少先进行下列的测试:首先是USB指令验证者工具(USB Command Verifier Tool)第9章的测试。
这个程序可验证一项装置是否可以处理可能由主机端送出的最重要的设定指令(请参考www.usb.org/developers/tools/网站)。其次,则是电源测试,包括暂停(Suspend)电流、涌入(Inrush)电流、尚未配置(Unconfigured)电流等测试。
分析至此,在USB设计上容易犯的错误已经相当清楚。数以百计的设计者每年绞尽脑汁,就是为了解决上述问题。从别人的错误中学习,可省下许多精力、重复设计、以及时程延迟的压力。但最重要的是,请继续保留创造力,因为这个世界需要更多创新、精致、有趣的USB相关装置。