通用川行總線(Universal Serial Bus, USB)已經(jīng)問世十一年了,難以置信的是,,電子業(yè)界至今仍不斷以創(chuàng)新方法來利用這套通訊協(xié)議,;相對地,工程師每天卻也在千百種設(shè)計(jì)方案中,,重復(fù)著相同的錯(cuò)誤,。如何從錯(cuò)誤中學(xué)習(xí)正確觀念,是一項(xiàng)重要的功課,。雖然USB與研發(fā)人員熟悉的其它協(xié)議有眾多相似之處,,然而相較于熟悉的PS/2與RS-232領(lǐng)域,工程師在USB重復(fù)犯錯(cuò)的次數(shù)竟然更多,。此外,,面對嚴(yán)格的標(biāo)準(zhǔn)規(guī)范,工程師犯下的錯(cuò)誤可能會(huì)造成不符USB規(guī)范的代價(jià),。這些錯(cuò)誤主要可分成五類:速度,、電源、信號(hào)質(zhì)量,、軟件,、以及規(guī)格符合(表1)。
無法預(yù)測系統(tǒng)瓶頸點(diǎn)
許多高速系統(tǒng)都在這項(xiàng)議題上遭遇挫折,,在此根據(jù)一項(xiàng)針對將數(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ā)生的爭議;且是遍布全球的通路賣場中最常被問及的問題,。目前有線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ì)人員都希望獲得最佳效能,。然而對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ì)把較長的數(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)簡單的程序。然而,,每年仍有數(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ì)測試應(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ì)對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裝置偵測的部分會(huì)緩慢地對整個(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)、鍵盤,、或其它控制器等),、大量儲(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ī)格測試前進(jìn)行原型測試
產(chǎn)品必須通過USB規(guī)格測試,,才能合法使用各類USB標(biāo)章(圖5)。USB規(guī)格制訂者論壇負(fù)責(zé)規(guī)格測試,,以確保所有用戶都能有良好的使用經(jīng)驗(yàn),。由于所有USB廠商相互依存,以建立良好的商譽(yù),,因此這點(diǎn)相當(dāng)重要,。若用戶對于某個(gè)USB裝置產(chǎn)生不好的經(jīng)驗(yàn),將會(huì)大幅降低使用其它裝置的意愿,。
研發(fā)廠商可能無法負(fù)擔(dān)規(guī)格測試流程中一些需要昂貴高階測試設(shè)備的步驟,。然而,許多裝置無法通過規(guī)格測試的原因,,則是因?yàn)槟承S商沒有檢查一些簡單的項(xiàng)目,。
因此,在裝置送測之前,,必須至少先進(jìn)行下列的測試:首先是USB指令驗(yàn)證者工具(USB Command Verifier Tool)第9章的測試,。
這個(gè)程序可驗(yàn)證一項(xiàng)裝置是否可以處理可能由主機(jī)端送出的最重要的設(shè)定指令(請參考www.usb.org/developers/tools/網(wǎng)站)。其次,,則是電源測試,,包括暫停(Suspend)電流、涌入(Inrush)電流,、尚未配置(Unconfigured)電流等測試,。
分析至此,在USB設(shè)計(jì)上容易犯的錯(cuò)誤已經(jīng)相當(dāng)清楚,。數(shù)以百計(jì)的設(shè)計(jì)者每年絞盡腦汁,,就是為了解決上述問題。從別人的錯(cuò)誤中學(xué)習(xí),,可省下許多精力,、重復(fù)設(shè)計(jì)、以及時(shí)程延遲的壓力,。但最重要的是,,請繼續(xù)保留創(chuàng)造力,因?yàn)檫@個(gè)世界需要更多創(chuàng)新,、精致,、有趣的USB相關(guān)裝置。