通用川行總線(Universal Serial Bus, USB)已經(jīng)問世十一年了,難以置信的是,電子業(yè)界至今仍不斷以創(chuàng)新方法來利用這套通訊協(xié)議;相對(duì)地,工程師每天卻也在千百種設(shè)計(jì)方案中,重復(fù)著相同的錯(cuò)誤。如何從錯(cuò)誤中學(xué)習(xí)正確觀念,是一項(xiàng)重要的功課。雖然USB與研發(fā)人員熟悉的其它協(xié)議有眾多相似之處,然而相較于熟悉的PS/2與RS-232領(lǐng)域,工程師在USB重復(fù)犯錯(cuò)的次數(shù)竟然更多。此外,面對(duì)嚴(yán)格的標(biāo)準(zhǔn)規(guī)范,工程師犯下的錯(cuò)誤可能會(huì)造成不符USB規(guī)范的代價(jià)。這些錯(cuò)誤主要可分成五類:速度、電源、信號(hào)質(zhì)量、軟件、以及規(guī)格符合(表1)。
無法預(yù)測(cè)系統(tǒng)瓶頸點(diǎn)
許多高速系統(tǒng)都在這項(xiàng)議題上遭遇挫折,在此根據(jù)一項(xiàng)針對(duì)將數(shù)據(jù)寫入NAND閃存之系統(tǒng)的分析結(jié)果來說明。這個(gè)系統(tǒng)透過USB傳送數(shù)據(jù),之后將數(shù)據(jù)先暫放于緩沖區(qū)(Buffer),接著再寫入閃存中。每個(gè)封包都分成三種時(shí)間元素:USB傳輸所需時(shí)間、主要操作系統(tǒng)消耗時(shí)間(Operating System Overhead),以及NAND閃存韌體的編程時(shí)間。圖2是128kbyte資料區(qū)塊經(jīng)過實(shí)時(shí)效能分析后的時(shí)序圖。
工程師幾乎花費(fèi)所有時(shí)間,利用加快USB接口芯片的波形,以嘗試降低USB傳輸所需的時(shí)間,直到將時(shí)間切割成不同區(qū)段。一旦工程師了解,效能其實(shí)是決定于所使用的NAND閃存可編程韌體,才能夠藉由減少NAND的頭段時(shí)間,來大幅提升效能。在大多數(shù)系統(tǒng)中,高速USB并不是瓶頸所在。因此,設(shè)計(jì)人員必須仔細(xì)檢查整個(gè)系統(tǒng),以確保有足夠的帶寬空間,來達(dá)成想要的系統(tǒng)速度。
速度減緩因素眾多
最常見的錯(cuò)誤,就是設(shè)計(jì)人員以為能使用全部的帶寬。毫無疑問的,USB裝置的速度不僅是消費(fèi)者與研發(fā)者之間最常發(fā)生的爭(zhēng)議;且是遍布全球的通路賣場(chǎng)中最常被問及的問題。目前有線USB裝置共具備三種數(shù)據(jù)傳輸速度:低速USB的傳輸數(shù)據(jù)速度為1.5Mbps;全速USB的傳輸數(shù)據(jù)的速度則為12Mbps;而高速USB的傳輸數(shù)據(jù)的速度為480Mbps。值得注意的是,USB 2.0并不等于高速USB,高速USB最初是以USB 2.0的規(guī)格版本發(fā)表的,而該規(guī)格也同時(shí)適用于低速與全速USB的數(shù)據(jù)傳輸速度。
與任何電子系統(tǒng)一樣,設(shè)計(jì)人員都希望獲得最佳效能。然而對(duì)USB而言,許多設(shè)計(jì)人員在設(shè)計(jì)之初,就相信他們會(huì)從系統(tǒng)中得到所有的效能,達(dá)到1.5Mbps、12Mbps,或480Mbps的速度。老實(shí)說,這是很糟糕的假設(shè),因?yàn)橛泻芏嘣驎?huì)造成一項(xiàng)裝置無法使用全部的帶寬。
第一個(gè)原因,是許多使用者可共享USB總線。即使設(shè)計(jì)人員使用主機(jī)板上不同的連接埠,仍然有可能與總線上的其它裝置同時(shí)共享一個(gè)主機(jī)控制器(Host Controller),也就是說,與其它所有裝置共享USB總線帶寬。
第二個(gè)原因,是USB封包格式化協(xié)議會(huì)把較長(zhǎng)的數(shù)據(jù)分成數(shù)個(gè)512字節(jié)的封包。每個(gè)封包的標(biāo)頭(Header)負(fù)責(zé)辨識(shí)封包內(nèi)容,而封包尾端則有CRC,負(fù)責(zé)確定數(shù)據(jù)的完整性。每個(gè)封包傳送后,都須由接收端回復(fù)ACK(圖1)。
訊框起始(Start of Frame, SOF)封包則是每125微秒傳送一次,以維持總線上的時(shí)序。在此因素影響下,USB的最大帶寬是每個(gè)微訊框(Microframe)可允許13個(gè)連續(xù)封包傳送,相當(dāng)于每秒53,248,000字節(jié)的傳輸速率。然而由于一般主機(jī)控制器在每個(gè)微訊框僅能接收10個(gè)連續(xù)封包,或傳送8個(gè)連續(xù)封包,因此現(xiàn)有主機(jī)控制器無法提供理論上的速度極限值。
未取得制造商識(shí)別碼
每個(gè)USB裝置都有一組獨(dú)一無二的識(shí)別碼,讓操作系統(tǒng)可藉以找出正確的裝置驅(qū)動(dòng)程序。識(shí)別碼的第一部分是由USB規(guī)格制訂者論壇指定的16位制造商識(shí)別碼(VID)數(shù)值;而第二部分則是由產(chǎn)品制造商所指定的16位數(shù)值,稱為產(chǎn)品識(shí)別碼(Product ID, PID)。
若廠商與設(shè)計(jì)人員事先規(guī)畫,并且能事先與USB規(guī)格制訂者論壇溝通,要取得制造商識(shí)別碼并且指定產(chǎn)品識(shí)別碼,其實(shí)是相當(dāng)簡(jiǎn)單的程序。然而,每年仍有數(shù)以千計(jì)的裝置已完成韌體與軟件的設(shè)計(jì)工作,但因無法取得適當(dāng)?shù)淖R(shí)別碼,而造成設(shè)計(jì)延遲的情況發(fā)生。
電源限制影響設(shè)計(jì)USB總線電源
根據(jù)USB規(guī)格,USB裝置可以由「總線供電」(Bus-powered)、由USB電源線提供電源,也就是「自行供電」(Self-powered),或是由電池或外接電源供電。最理想的USB供電方式是由總線供電,如此一來就不須再外接電源。
然而,利用USB總線供電,也意味著用戶將受到USB規(guī)格中500微安培、100毫安、與500毫安的電流限制。但是許多設(shè)計(jì)人員卻沒有仔細(xì)留意這些限制,因此造成設(shè)計(jì)無法符合總線供電的規(guī)格。以下說明不同電流的設(shè)計(jì)限制。
首先,500微安培是由主機(jī)端供應(yīng)電源,但是當(dāng)USB沒有執(zhí)行傳輸動(dòng)作時(shí),裝置必須處于USB暫停(Suspend)狀態(tài)。在此狀態(tài)下,只能從VBUS獲得500微安培的電流。這個(gè)狀態(tài)是為了當(dāng)個(gè)人計(jì)算機(jī)處于暫停模式時(shí),能將最小的電流輸出降至最低。
其次,100毫安的USB規(guī)格具備高電源(500毫安)與低電源(100毫安)兩個(gè)連接埠。低電源連接端口常用于總線供電型的集線器中,而且是承接500毫安的電源,再分配給下端連接埠各100毫安的電流。
當(dāng)USB裝置連接時(shí),此裝置在收到來自主機(jī)端的設(shè)定組態(tài)(Set Configuration)訊息之前,無法判讀它是在何種連接埠上,因此會(huì)將電流限制在100毫安。
這表示該項(xiàng)裝置必須在非常低的電源模式下,在USB上進(jìn)行裝置列舉的作業(yè),直到收到設(shè)定組態(tài)訊息指示,才能夠切換至高電源模式。
這在高速USB上原本是非常困難的事,這情況直到2004年業(yè)者發(fā)表新款芯片之后才得以解決。最后,500毫安則是USB規(guī)格中所允許的最大電源輸出值。
因此,實(shí)際設(shè)計(jì)測(cè)試應(yīng)由系統(tǒng)工程師主導(dǎo),以確保裝置在由總線供電的運(yùn)作模式下所需的不同電源值,否則就必須為新的USB系統(tǒng)額外購買昂貴的外接電源。
裝置特性攸關(guān)信號(hào)質(zhì)量共享D+/D-信號(hào)
為了降低時(shí)間、流程與成本,有些產(chǎn)品會(huì)嘗試在多個(gè)裝置之間共享USB信號(hào)線路。例如USB型的基座(Docking Station)可能允許一個(gè)軟盤機(jī)或一個(gè)DVD播放機(jī)插入儲(chǔ)存插槽中。這兩種裝置共享USB線路,就可藉由降低集線器連接埠的數(shù)目,進(jìn)而節(jié)省成本。
然而,如果沒有完全了解系統(tǒng)中的裝置特性,要利用這種方法就相當(dāng)困難。在三態(tài)(Tri-state)編排中,如圖3的設(shè)計(jì)選擇二,總線上的另一裝置會(huì)增加USB線路上的電容值,而連結(jié)至該裝置也會(huì)造成信號(hào)反射,干擾高速USB的運(yùn)作。另外,在開關(guān)型編排中(如圖3的設(shè)計(jì)選擇一),開關(guān)本身會(huì)對(duì)USB線路造成額外的電容值與電阻值,這將會(huì)減緩USB線路上信號(hào)的上升/下降時(shí)間,并且造成USB信號(hào)眼(Eye)縮小。
圖4顯示一般USB裝置信號(hào)以10pF/10奧姆負(fù)載,傳輸經(jīng)過開關(guān)后的信號(hào)眼圖。在單一信號(hào)眼圖中,紅色區(qū)域內(nèi)應(yīng)該不會(huì)存在干擾。而USB信號(hào)共享線路成功的關(guān)鍵,就是必須維持開關(guān)的低負(fù)載,并且采用具備高信號(hào)轉(zhuǎn)換速率的芯片。
逆流電源
「自行供電」的USB裝置也有本身電源的問題。由于這類裝置有獨(dú)立的電源供應(yīng)器,因此可能在主機(jī)端關(guān)閉時(shí),仍處于開機(jī)狀態(tài)。這種情況可能讓D+信號(hào)有小幅電壓上升,而造成USB裝置偵測(cè)的部分會(huì)緩慢地對(duì)整個(gè)主機(jī)系統(tǒng)充電,進(jìn)而干擾系統(tǒng)的啟動(dòng)。自行供電的USB裝置(包括由電池供電的裝置)必須直接由VBUS消除該電壓上升的問題,或是透過軟件控制,利用VBUS感應(yīng)器將裝置關(guān)閉。
自行開發(fā)軟件帶來風(fēng)險(xiǎn)不使用現(xiàn)有類別驅(qū)動(dòng)程序
類別驅(qū)動(dòng)程序(Class Drivers)是USB系統(tǒng)環(huán)境中非常重要的部分。這些驅(qū)動(dòng)程序是由主要操作系統(tǒng)提供,因此毋須另外進(jìn)行開發(fā)。USB的類別是由裝置工作小組(Device Working Groups)定義,這是一個(gè)在USB制訂者論壇(USB-IF)號(hào)召下組成的自發(fā)性團(tuán)體,目的在創(chuàng)造裝置之間標(biāo)準(zhǔn)的溝通語言。
目前市面上的USB裝置類別包括各類人性化接口裝置(例如鼠標(biāo)、鍵盤、或其它控制器等)、大量?jī)?chǔ)存裝置(例如各式磁盤驅(qū)動(dòng)器)、通訊裝置(例如調(diào)制解調(diào)器、網(wǎng)絡(luò)適配卡)、音頻信號(hào)、影像、以及靜態(tài)影像(例如:相片與掃描儀)。
若一項(xiàng)新設(shè)計(jì)的裝置完全符合現(xiàn)有的類別架構(gòu),那么只須到www.usb.org下載類別定義,并以此進(jìn)行設(shè)計(jì)即可。然而,若某項(xiàng)裝置并非完全符合現(xiàn)有的類別,該裝置還是可用的,例如,微軟就采用靜態(tài)影像類別(Still Image Class),設(shè)計(jì)新的媒體裝置通訊協(xié)議(Media Transfer Protocol, MTP)類別。另外,人機(jī)接口裝置并不一定要連接到與使用者互動(dòng)的接口上,它也可以在不另外開發(fā)新驅(qū)動(dòng)程序的情況下,與程序中的溫度計(jì)、壓力傳感器、幫浦控制器等裝置連結(jié)。
雖然藉由一個(gè)類別驅(qū)動(dòng)程序就能夠完成設(shè)計(jì),許多公司基于某種原因還是會(huì)想嘗試開發(fā)專用驅(qū)動(dòng)程序,或以高價(jià)委外,由外部設(shè)計(jì)公司開發(fā)驅(qū)動(dòng)程序。類別驅(qū)動(dòng)程序不僅能夠排除設(shè)計(jì)風(fēng)險(xiǎn)、成本與時(shí)程等問題,也可避免許多除錯(cuò)與復(fù)雜度的問題。
電磁干擾可接地解決
要介紹良好的電磁干擾(EMI)設(shè)計(jì)技術(shù),足以另外寫成一篇文章,不過,最常見也最容易解決的電磁干擾錯(cuò)誤,就是嘗試?yán)孟到y(tǒng)的接地面作為USB纜線的屏蔽。這會(huì)讓噪聲引入接地面上,進(jìn)而越過裝置屏蔽(圖6)。
USB規(guī)格驗(yàn)證嚴(yán)格在規(guī)格測(cè)試前進(jìn)行原型測(cè)試
產(chǎn)品必須通過USB規(guī)格測(cè)試,才能合法使用各類USB標(biāo)章(圖5)。USB規(guī)格制訂者論壇負(fù)責(zé)規(guī)格測(cè)試,以確保所有用戶都能有良好的使用經(jīng)驗(yàn)。由于所有USB廠商相互依存,以建立良好的商譽(yù),因此這點(diǎn)相當(dāng)重要。若用戶對(duì)于某個(gè)USB裝置產(chǎn)生不好的經(jīng)驗(yàn),將會(huì)大幅降低使用其它裝置的意愿。
研發(fā)廠商可能無法負(fù)擔(dān)規(guī)格測(cè)試流程中一些需要昂貴高階測(cè)試設(shè)備的步驟。然而,許多裝置無法通過規(guī)格測(cè)試的原因,則是因?yàn)槟承S商沒有檢查一些簡(jiǎn)單的項(xiàng)目。
因此,在裝置送測(cè)之前,必須至少先進(jìn)行下列的測(cè)試:首先是USB指令驗(yàn)證者工具(USB Command Verifier Tool)第9章的測(cè)試。
這個(gè)程序可驗(yàn)證一項(xiàng)裝置是否可以處理可能由主機(jī)端送出的最重要的設(shè)定指令(請(qǐng)參考www.usb.org/developers/tools/網(wǎng)站)。其次,則是電源測(cè)試,包括暫停(Suspend)電流、涌入(Inrush)電流、尚未配置(Unconfigured)電流等測(cè)試。
分析至此,在USB設(shè)計(jì)上容易犯的錯(cuò)誤已經(jīng)相當(dāng)清楚。數(shù)以百計(jì)的設(shè)計(jì)者每年絞盡腦汁,就是為了解決上述問題。從別人的錯(cuò)誤中學(xué)習(xí),可省下許多精力、重復(fù)設(shè)計(jì)、以及時(shí)程延遲的壓力。但最重要的是,請(qǐng)繼續(xù)保留創(chuàng)造力,因?yàn)檫@個(gè)世界需要更多創(chuàng)新、精致、有趣的USB相關(guān)裝置。