文/張凡忠 公安部第一研究所
摘要:USB設(shè)備已成為當(dāng)前移動(dòng)設(shè)備數(shù)據(jù)傳輸?shù)闹饕獋鬏斀涌?,即便在安防,移?dòng)存儲(chǔ)或擴(kuò)展存儲(chǔ)時(shí),也時(shí)常需要到,但USB技術(shù)如何?可怎樣設(shè)計(jì)和利用?請(qǐng)看本文就USB的體系結(jié)構(gòu)、USB通信技術(shù)基礎(chǔ)、USB固件程序的開發(fā)方法等是如何論述的。
前言
不管是計(jì)算機(jī)還是連接的外圍設(shè)備,在新品開發(fā)時(shí)保持兼容性是必須考慮的。即使是革命性的新外圍設(shè)備,也必須使用到連接計(jì)算機(jī)的接口。當(dāng)設(shè)計(jì)一個(gè)外圍設(shè)備的接口時(shí),下列是該外圍設(shè)備應(yīng)該具備的特性:
穩(wěn)定性:具備自動(dòng)差錯(cuò)與除錯(cuò)的功能,使錯(cuò)誤的發(fā)生率幾乎為零;
便宜:讓大部分的用戶都有能力購(gòu)買;
省電:在便攜式計(jì)算機(jī)上節(jié)省電池的消耗;
有彈性:讓許多不同種類的外圍設(shè)備,都可以使用這個(gè)接口;
快速:此接口不可以成為傳輸?shù)钠款i;
容易使用:用戶容易安裝、設(shè)置與使用;
操作系統(tǒng)的支持:如果操作系統(tǒng)支持此接口,開發(fā)者就不必要自行開發(fā)底層的驅(qū)動(dòng)程序來使用此接口。
USB就是一個(gè)為符合上述所有條件而開發(fā)的最新外圍設(shè)備接口。USB是一種通用串行總線。它是由COMPAQ、INTEL、MICROSOFT和NEC等公司共同開發(fā)的一種新型、快速、雙向、同步傳輸?shù)牟⒖梢詿岵灏蔚臄?shù)據(jù)傳輸總線接口。
規(guī)范的版本
USB規(guī)范的版本變動(dòng),如表1所示。
經(jīng)過多次版本的更新后,USB1.0發(fā)表于1996年1月。USB1.1則修訂了1.0版本的問題,并且新增一個(gè)新的傳輸類型(中斷傳輸)。USB2.0在2000年4月發(fā)表,新增了高速模式。對(duì)于支持USB1.1規(guī)范的設(shè)備最高傳輸率可達(dá)12Mb/s,而支持USB2.0規(guī)范的設(shè)備最高速率可達(dá)48012Mb/s。
USB系統(tǒng)結(jié)構(gòu)
一個(gè)USB系統(tǒng)主要被定義為三個(gè)部分:
USB互連;
USB設(shè)備;
USB主機(jī)。

USB互連是指USB設(shè)備與主機(jī)之間進(jìn)行連接和通信的操作,支持?jǐn)?shù)據(jù)在USB主機(jī)與USB設(shè)備之間的流動(dòng)。在任何USB系統(tǒng)中,只有一個(gè)主機(jī)。USB和主機(jī)系統(tǒng)的接口稱作主機(jī)控制器,主機(jī)控制器可由硬件、固件和軟件綜合實(shí)現(xiàn)。USB的主機(jī)通過主機(jī)控制器與USB設(shè)備進(jìn)行交互。主機(jī)功能如下:
檢測(cè)USB設(shè)備的安裝和拆卸;
管理主機(jī)和USB設(shè)備之間的控制流;
收集狀態(tài)和動(dòng)作信息;
提供能量給連接的USB設(shè)備。
USB設(shè)備包含一些設(shè)備描述符,它們指出了一個(gè)給定設(shè)備的屬性和特征。當(dāng)設(shè)備被連接、編號(hào)后,該設(shè)備就擁有一個(gè)唯一的USB地址。設(shè)備就是通過該USB地址被操作的,每一個(gè)USB設(shè)備通過一個(gè)或多個(gè)通道與主機(jī)通訊。所有USB設(shè)備必須在零號(hào)端口上有一指定的通道,每個(gè)USB設(shè)備的USB控制通道將與之相連。通過此控制通道,所有的USB設(shè)備都列入一個(gè)共同的準(zhǔn)入機(jī)制,以獲得控制操作的信息。
圖2展示了USB通信模型之間基本的信息流與互連關(guān)系。

USB通信基礎(chǔ)
傳輸基礎(chǔ)
USB通信可以分為兩類:配置通信、應(yīng)用通信。在配置通信中,主機(jī)通知設(shè)備,然后使它準(zhǔn)備好交換數(shù)據(jù)。大部分這類通信發(fā)生在上電或連接時(shí)主機(jī)檢測(cè)到外設(shè)的時(shí)候。應(yīng)用通信出現(xiàn)在主機(jī)的應(yīng)用程序與一個(gè)檢測(cè)到的外設(shè)交換數(shù)據(jù)的時(shí)候。這些是實(shí)現(xiàn)設(shè)備目的的通信。例如:對(duì)鍵盤來說,應(yīng)用通信是發(fā)送按鍵數(shù)據(jù)給主機(jī),告訴一個(gè)應(yīng)用程序顯示一個(gè)特性或執(zhí)行其他動(dòng)作。
配置通信
在檢測(cè)過程中,設(shè)備的固件對(duì)主機(jī)的一系列標(biāo)準(zhǔn)請(qǐng)求做出響應(yīng)。設(shè)備必須識(shí)別出每一個(gè)請(qǐng)求,返回被請(qǐng)求的信息,并且采取其他一些請(qǐng)求指定的動(dòng)作。在PC上,Windows執(zhí)行檢測(cè)工作,所以不涉及用戶編程的問題。然而,為了完成檢測(cè)工作,Windows必須有兩個(gè)可用的文件:一個(gè)識(shí)別這個(gè)設(shè)備的驅(qū)動(dòng)程序的文件名和位置的INF文件和設(shè)備驅(qū)動(dòng)程序本身。
應(yīng)用通信
在主機(jī)已經(jīng)與設(shè)備交換了檢測(cè)信息并且設(shè)備驅(qū)動(dòng)已經(jīng)被分配并載入后,應(yīng)用程序段可以非常順利地進(jìn)行。在主機(jī)上,應(yīng)用程序可以使用標(biāo)準(zhǔn)Windows API功能來讀取和寫設(shè)備。在外設(shè)上,傳輸數(shù)據(jù)通常需要把要發(fā)送的數(shù)據(jù)放在USB控制器的傳輸緩存器中,當(dāng)一個(gè)硬件中斷發(fā)出數(shù)據(jù)已經(jīng)到達(dá)的信號(hào)時(shí)從接收器中讀取接收到的數(shù)據(jù),并且在完成傳輸時(shí)確保外設(shè)準(zhǔn)備好下一次傳輸??偩€上的每一次數(shù)據(jù)傳輸使用下列四種類型之一:控制、中斷、批量或同步。
傳輸類型
USB共有四種類型傳輸方式:分別為控制傳輸,中斷傳輸,批量傳輸和同步傳輸。
控制傳輸:用于主機(jī)對(duì)USB外設(shè)的配置,對(duì)USB設(shè)備的狀態(tài)查詢和控制命令的發(fā)送,也可用于用戶自定義的命令的發(fā)送。
中斷傳輸:用于小批量的、點(diǎn)式的、非連續(xù)性的數(shù)據(jù)傳輸?shù)膱?chǎng)合,它是低速設(shè)備可以傳輸數(shù)據(jù)的唯一方法。
批量傳輸:用于批量的,非實(shí)時(shí)的數(shù)據(jù)傳輸,即那些需要一次傳輸較多的數(shù)據(jù),但傳輸過程對(duì)時(shí)間要求不嚴(yán)格的傳輸類型。
同步傳輸:適用于那些要求數(shù)據(jù)連續(xù)的、實(shí)時(shí)的,以固定的數(shù)據(jù)率產(chǎn)生、傳送的場(chǎng)合。
傳輸(transfers)和事務(wù)(transactions)是經(jīng)常提到的兩個(gè)概念,分清這兩個(gè)概念是設(shè)計(jì)USB外設(shè)的關(guān)鍵。傳輸是指一次完整的發(fā)出請(qǐng)求到該請(qǐng)求被完整的處理結(jié)束的整個(gè)過程。事務(wù)是傳輸中的一個(gè)基本元素,或者叫一個(gè)傳輸?shù)膬?nèi)建模塊。每一次傳輸由一個(gè)或多個(gè)事務(wù)組成。事務(wù)又由包組成,而包還包含一個(gè)包識(shí)別器(PID),一個(gè)錯(cuò)誤校驗(yàn)位以及有時(shí)還有其他信息。參見圖3。

事務(wù)按照它們的目的和數(shù)據(jù)流方向可以分為三種類型:SETUP事務(wù)、IN事務(wù)、OUT事務(wù)。它們都是由一個(gè)令牌階段,一個(gè)數(shù)據(jù)階段和一個(gè)握手階段組成。對(duì)于SETUP事務(wù)來說,在令牌階段有主機(jī)發(fā)出SETUP令牌,然后主機(jī)又發(fā)出數(shù)據(jù)包,由該數(shù)據(jù)包指出本次請(qǐng)求的具體的內(nèi)容。在握手階段指出本次事務(wù)是否成功。各種事務(wù)的組成如圖4。

IN事務(wù)是從一個(gè)設(shè)備接收數(shù)據(jù),OUT事務(wù)是發(fā)送數(shù)據(jù)給其他一個(gè)設(shè)備。(IN和OUT事務(wù)的命名是從主機(jī)的角度出發(fā)的,在一個(gè)IN事務(wù)中,數(shù)據(jù)是從外設(shè)傳輸給主機(jī)的;在一個(gè)OUT事務(wù)中,數(shù)據(jù)是從主機(jī)傳輸?shù)酵庠O(shè)的。)在一個(gè)Setup事務(wù)中,數(shù)據(jù)也是從主機(jī)傳輸?shù)酵庠O(shè)的,但一個(gè)Setup事務(wù)是一個(gè)特殊情況,因?yàn)樗鼏?dòng)一個(gè)控制傳輸。任何事務(wù)都可以用IN或OUT事務(wù),但只有控制傳輸可以使用Setup事務(wù)。
在應(yīng)用程序可與一個(gè)設(shè)備通信之前,主機(jī)需知道設(shè)備支持哪些傳輸類型和終端。主機(jī)也須分配一個(gè)地址給設(shè)備,主機(jī)通過一個(gè)被稱為枚舉的信息交換來完成這些工作。
USB設(shè)備的枚舉過程
枚舉是使得主機(jī)的設(shè)備驅(qū)動(dòng)程序能與這個(gè)設(shè)備通信的最基本的信息交換。該過程可以由以下動(dòng)作來完成:
1、一個(gè)設(shè)備連到一個(gè)USB端口
或者系統(tǒng)上電時(shí)有一個(gè)設(shè)備已經(jīng)插入到一個(gè)端口中了。這個(gè)端口可以在主機(jī)的根基線器上或者在連接主機(jī)下游的基線器上。集線器正常給這個(gè)端口供電,這個(gè)設(shè)備正處于上電狀態(tài)。
2、集線器檢測(cè)到這個(gè)設(shè)備
集線器監(jiān)視著它的每一個(gè)端口的信號(hào)線的電壓。集線器端口的兩根信號(hào)線(D+和D-)的每一根都有一個(gè)15k 的下拉電阻,而一個(gè)設(shè)備在D+(為全速設(shè)備)和D-(為低速設(shè)備)都有一個(gè)1.5 k 的上拉電阻。當(dāng)一個(gè)設(shè)備插入到一個(gè)端口中時(shí),設(shè)備的上拉電阻使信號(hào)線為高,使得集線器可以檢測(cè)到一個(gè)設(shè)備連接上了。
3、主機(jī)知道了這個(gè)新設(shè)備
每個(gè)集線器使用它的中斷流程來報(bào)告發(fā)生在集線器上的事件。當(dāng)主機(jī)知道了這個(gè)事件,它給集線器發(fā)送一個(gè)Get_Port_Status請(qǐng)求來了解更多的知識(shí)。返回的信息告訴主機(jī)該設(shè)備是什么時(shí)候連接的。
4、集線器重新設(shè)置這個(gè)設(shè)備
當(dāng)主機(jī)知道有一個(gè)新設(shè)備時(shí),主機(jī)控制器給集線器發(fā)送一個(gè)Set_Port_Feature請(qǐng)求,請(qǐng)求集線器來重新設(shè)置端口。集線器使得設(shè)備的USB數(shù)據(jù)線處于重啟狀態(tài)至少10ms。
5、集線器在設(shè)備和總線之間建立一個(gè)信號(hào)通路
主機(jī)通過發(fā)送一個(gè)Get_Port_Status請(qǐng)求來驗(yàn)證設(shè)備是否激起重啟狀態(tài)。返回的數(shù)據(jù)的一位表示設(shè)備是否仍然處于重啟狀態(tài)。當(dāng)集線器已經(jīng)釋放了重啟狀態(tài),設(shè)備就處于默認(rèn)狀態(tài)了。設(shè)備的USB寄存器已經(jīng)處于它們的默認(rèn)狀態(tài),設(shè)備已經(jīng)準(zhǔn)備好通過終端0的默認(rèn)流程來響應(yīng)控制傳輸。設(shè)備現(xiàn)在可以能與主機(jī)通信,使用默認(rèn)地址0h。在這一點(diǎn)上,設(shè)備可以從總線上抽取不超過100毫安的電流。
6、集線器檢測(cè)設(shè)備速度
或在重啟之前或在重啟之后,集線器通過檢查兩個(gè)信號(hào)線的電壓來檢測(cè)設(shè)備的速度。集線器通過測(cè)試那根信號(hào)線在空閑時(shí)有更高的電壓來檢測(cè)一個(gè)設(shè)備的速度。集線器發(fā)送信息給主機(jī),以響應(yīng)下一個(gè)Get_Port_Status請(qǐng)求。
7、主機(jī)發(fā)送一個(gè)Get_Descriptor請(qǐng)求來獲取默認(rèn)流程的最大包的大小
主機(jī)發(fā)送請(qǐng)求給設(shè)備地址0、終端0。因?yàn)橹鳈C(jī)一次只列舉一個(gè)設(shè)備,只有一個(gè)設(shè)備將響應(yīng)尋址設(shè)備地址0的通信。最大包的大小是這個(gè)描述符的第8位,因此主機(jī)只需要讀取頭8B。一個(gè)Windows主機(jī)請(qǐng)求64B,但在僅接收一個(gè)包后,它就開始了狀態(tài)階段。在完成狀態(tài)階段時(shí),主機(jī)請(qǐng)求集線器來重啟這個(gè)設(shè)備。這里不需要重啟,因?yàn)樵O(shè)備應(yīng)該可以用響應(yīng)下一個(gè)設(shè)置階段的動(dòng)作來處理任何時(shí)候的主機(jī)放棄一個(gè)控制傳輸情況。
8、主機(jī)分配一個(gè)地址
主機(jī)控制器通過發(fā)送一個(gè)Set_Address請(qǐng)求來分配一個(gè)單獨(dú)的地址給設(shè)備。設(shè)備讀取這個(gè)請(qǐng)求,返回一個(gè)確認(rèn),并且保存新的地址。這個(gè)設(shè)備現(xiàn)在處于一個(gè)地址狀態(tài)。從這現(xiàn)在開始的所有通信使用這個(gè)新地址。
9、主機(jī)知道了設(shè)備的能力
主機(jī)給新地址發(fā)送一個(gè)Get_Descriptor請(qǐng)求來讀取這個(gè)設(shè)備描述符,這次讀取整個(gè)部分。這個(gè)描述符是一個(gè)數(shù)據(jù)結(jié)構(gòu)包括終端0的最大包的大小,設(shè)備支持的配置號(hào),及關(guān)于這個(gè)設(shè)備的其他信息。主機(jī)把這些信息應(yīng)用在其后的通信中。然后主機(jī)通過請(qǐng)求在設(shè)備描述符規(guī)定的一個(gè)或多個(gè)配置描述符來了解這個(gè)設(shè)備。一個(gè)Windows主機(jī)開始申請(qǐng)配置描述符的9B。含在這些B中的是這個(gè)配置描述符和它所有的從屬描述符的總長(zhǎng)度。Windows然后再次請(qǐng)求配置描述符,這次使用得到的總長(zhǎng)度,最多可達(dá)到FFhB。這導(dǎo)致設(shè)備發(fā)送跟隨在每個(gè)配置額的接口描述符后的配置描述符,在它后面是每個(gè)接口的終端描述符。若這些描述符總共超過了FFhB,則Windows在第三次請(qǐng)求時(shí)得到整套描述符。每個(gè)描述符以它的長(zhǎng)度和類型開始,使主機(jī)能分解其后的數(shù)據(jù)。
10、主機(jī)分配和載入一個(gè)設(shè)備驅(qū)動(dòng)
在主機(jī)已經(jīng)從它的描述符中知道了能夠知道的所有信息后,它開始在一個(gè)設(shè)備啟動(dòng)中查找最合適的匹配來管理與設(shè)備間的通信。在選擇一個(gè)驅(qū)動(dòng)時(shí),Windows盡量去與從設(shè)備得到的、保存在系統(tǒng)INF文件中的信息中的銷售商和產(chǎn)品ID、發(fā)布號(hào)和類信息相匹配。在驅(qū)動(dòng)程序被載入以后,它經(jīng)常請(qǐng)求設(shè)備來重新發(fā)送描述符或者發(fā)送應(yīng)用于這個(gè)設(shè)備的類描述符。
11、主機(jī)的設(shè)備驅(qū)動(dòng)選擇一個(gè)配置
在從描述符了解了設(shè)備后,設(shè)備驅(qū)動(dòng)程序發(fā)送一個(gè)Set_Configuration命令來請(qǐng)求希望的配置號(hào)。設(shè)備讀取這個(gè)請(qǐng)求并且設(shè)置它的配置來匹配它。設(shè)備現(xiàn)在處于配置狀態(tài),并且設(shè)備的接口已經(jīng)被使能。
主機(jī)枚舉是通過給端點(diǎn)0發(fā)送包含標(biāo)準(zhǔn)USB請(qǐng)求的控制傳輸。所有的USB設(shè)備必須支持控制傳輸,標(biāo)準(zhǔn)USB請(qǐng)求和端點(diǎn)0。對(duì)一個(gè)成功的枚舉來說,設(shè)備必須對(duì)每一個(gè)請(qǐng)求響應(yīng),返回請(qǐng)求的信息以及采取其他請(qǐng)求的動(dòng)作。USB設(shè)備的枚舉過程是在缺省的控制管道進(jìn)行的,每一步都是在控制傳輸?shù)腟ETUP階段提出請(qǐng)求的。而具體的請(qǐng)求在SETUP事務(wù)的數(shù)據(jù)階段中,用戶可讀取并根據(jù)USB協(xié)議來分析該請(qǐng)求,然后根據(jù)分析的結(jié)果進(jìn)入該控制傳輸?shù)臄?shù)據(jù)階段。在USB設(shè)備的枚舉過程中,主機(jī)要讀取USB設(shè)備的設(shè)備描述符、配置描述符、接口描述符和端點(diǎn)描述符。

固件設(shè)計(jì)
為了實(shí)現(xiàn)上述的枚舉過程在設(shè)備端需要固件程序的支持。下面以PDIUSBD12為例講述一下固件的設(shè)計(jì)方法。PDIUSBD12的固件設(shè)計(jì)成完全的中斷驅(qū)動(dòng),當(dāng)PDIUSBD12檢測(cè)到有相應(yīng)的事務(wù)發(fā)生時(shí),就中斷CPU處理器調(diào)用中斷服務(wù)程序。
D12的固件程序可采用如圖5的積木式結(jié)構(gòu)。
硬件抽象層:這是固件中的最低層代碼,它執(zhí)行對(duì)PDIUSBD12和硬件與I/O 相關(guān)的訪問。當(dāng)與其它CPU 平臺(tái)接口時(shí)這部分代碼需要修改或增加。
PDIUSBD12命令接口:利用這些命令實(shí)現(xiàn)對(duì)D12的控制。
中斷服務(wù)程序:處理USB的各種事務(wù)。
標(biāo)準(zhǔn)請(qǐng)求:USB設(shè)備必須對(duì)這11種標(biāo)準(zhǔn)請(qǐng)求做出響應(yīng),這11種標(biāo)準(zhǔn)代碼可以查詢?cè)O(shè)備的能力和狀態(tài)以及選擇配置。當(dāng)收到請(qǐng)求時(shí),程序通過解析接收到的請(qǐng)求把要發(fā)送的數(shù)據(jù)存放到發(fā)送緩沖器中。設(shè)備不必執(zhí)行每一個(gè)請(qǐng)求;它只需要以一種可以理解的方式對(duì)請(qǐng)求做出響應(yīng)。
廠商請(qǐng)求:一個(gè)供應(yīng)商也可以與特定設(shè)備進(jìn)行的傳輸控制而定義請(qǐng)求。
主程序:完成D12的初始化。
在USB通信過程中需要處理多種事務(wù),有些事務(wù)的處理需要特別注意,設(shè)計(jì)者往往忽視,下面分別介紹。
D12初始化過程
D12的中斷寄存器清零
Set Address Enable
Set Endpoint Enable
Disconnect
延時(shí)1~2秒鐘
Connect
Setup Transaction處理流程

如圖6所示,對(duì)于Setup Transaction的處理需要注意,在讀取D12的FIFO數(shù)據(jù)前必須要選擇端點(diǎn),為了使以后的Setup Packet數(shù)據(jù)包能夠被接收要用Acknowledge Setup命令使能Control In和Control Out端點(diǎn)。當(dāng)D12接收到一個(gè)數(shù)據(jù)包時(shí)一個(gè)內(nèi)部端點(diǎn)緩存滿標(biāo)志有效。后續(xù)的數(shù)據(jù)包將不能夠被接收,必須通過Clear Buffer命令來清出標(biāo)志位。在讀取D12的數(shù)據(jù)后先要利用Acknowlege命令對(duì)主機(jī)進(jìn)行回應(yīng),然后再清除D12的緩存。這兩個(gè)命令處理順序不能交換,因?yàn)樵跊]有回應(yīng)主機(jī)前不能夠清除掉D12的緩存,這樣就不能接收新的數(shù)據(jù)。
Control In Transaction處理流程
如圖7所示,在Control In Transaction處理過程中注意,要發(fā)送的數(shù)據(jù)是端點(diǎn)0能傳送的最大數(shù)據(jù)報(bào)的整數(shù)倍時(shí),在傳送完所有的數(shù)據(jù)后,必須向主機(jī)發(fā)送零長(zhǎng)度數(shù)據(jù)報(bào)。

Get Descriptor命令處理流程
如圖8所示,在列舉過程中,被請(qǐng)求的描述符逐涉及設(shè)備的小的元素:首先是整個(gè)設(shè)備,然后是每個(gè)配置,接著是每個(gè)配置的接口,最后是每個(gè)接口的終端。對(duì)于字符串描述符是可選的。關(guān)于描述符是設(shè)計(jì)者可以配置的,可以根基設(shè)備的通信能力和要求來定義需要的描述符。

Set Address命令處理流程
如圖9所示,通過這個(gè)請(qǐng)求,主機(jī)指定以后與設(shè)備通信的地址。值字段是要設(shè)置的設(shè)備的新的地址。允許值為1到127。當(dāng)上電或連接后集線器使能一個(gè)端口,端口使用默認(rèn)地址0直到它 從主機(jī)接收到一個(gè)Set_Address請(qǐng)求。這個(gè)請(qǐng)求和大部分的其他請(qǐng)求不同,因?yàn)樵O(shè)備直到通過發(fā)送零長(zhǎng)度數(shù)據(jù)包完成請(qǐng)求的狀態(tài)階段后才執(zhí)行這個(gè)請(qǐng)求。主機(jī)發(fā)送狀態(tài)階段標(biāo)志包到默認(rèn)地址,因?yàn)樵O(shè)備必須在改變地址之前發(fā)送這個(gè)包。完成這個(gè)請(qǐng)求后,所有通信都使用這個(gè)新地址。一個(gè)使用默認(rèn)地址0的設(shè)備處于默認(rèn)狀態(tài)。在完成Set_Address請(qǐng)求設(shè)置一個(gè)非0的新地址后,設(shè)備進(jìn)入地址狀態(tài)。一個(gè)設(shè)備必須在接收到請(qǐng)求后的50毫秒內(nèi)發(fā)送交換包,并且它必須在完成狀態(tài)階段后的2毫秒內(nèi)完成請(qǐng)求。

另外要注意的是當(dāng)USB設(shè)備接收主機(jī)發(fā)送的IN事務(wù),如果設(shè)備沒有要發(fā)送到主機(jī)的數(shù)據(jù)時(shí),這時(shí)設(shè)備進(jìn)入掛起狀態(tài),為了避免這種情況出現(xiàn),當(dāng)沒有數(shù)據(jù)要發(fā)送時(shí)可以發(fā)送零長(zhǎng)度的數(shù)據(jù)報(bào)。
同時(shí)利用D12開發(fā)時(shí)有兩個(gè)突出的優(yōu)點(diǎn):軟連接和GoodLink接口。所謂的軟連接就是把D12內(nèi)部集成的1.5K的上拉電阻連接到數(shù)據(jù)線D+上,通過此特性可以使設(shè)備CPU有充足的時(shí)間進(jìn)行初始化,同時(shí)也避免頻繁的插拔USB數(shù)據(jù)線。GoodLink接口可以連接發(fā)光二極管,當(dāng)設(shè)備枚舉成功后發(fā)光二極管常亮,當(dāng)D12進(jìn)行傳送數(shù)據(jù)時(shí)發(fā)光二極管閃爍。