




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第1章緒論
1.1USB簡介
USB是由世界著名計算機和通信公司等共同推出的新一代接口標準,全
稱為UniversalSerialBus(通用串行總線)⑴,是一種快速、靈活的總線接口。
它是為了解決日益增加的PC外設(shè)與有限的主板插槽和端口之間的矛盾而制
定的一種串行通信標準。USB應(yīng)用十分廣泛,并具有下述優(yōu)點:
1、適用于多種外設(shè),使它不需要為不同的外設(shè)準備不同的接口和協(xié)議;
2、Windows能自動檢測到USB設(shè)備的熱插拔,并自動配置;
3、PC機上的接口線非常緊缺,而USD設(shè)備并不需要用戶設(shè)置端口故無
論從用戶使用方便性,或從對資源的占用方面看,USB都很優(yōu)秀;
4、當接入一個USB設(shè)備時,全速USB接口可達12Mbit/So考慮到狀態(tài)、
控制和出錯信息,最大理論速度仍可達到9.6Mbit/s,這是其他串行接口協(xié)議
所不能比擬的,且USB也支持1.5Mbit/s的低速傳輸。
5、USB接口芯片價格低廉,這也大大促進USB設(shè)備的開發(fā)與應(yīng)用。
在USB出現(xiàn)之前,計算機典型接口有并行口、串行口、鼠標口、鍵盤口、
顯示器口,及各種卡式接口等,與這些接口對應(yīng)的有各種不同的電纜,在傳
輸速度方面,這些接口都存在速度偏低的問題。在技術(shù)方面,這種設(shè)計容易
產(chǎn)生I/O沖突,中斷不夠用,以及對于每一種新的外設(shè)都必須設(shè)計新的接口
卡等缺點。當今的計算機外部設(shè)備,都在追求高速度和高通用性。USB接口
適應(yīng)了這種要求,并以其速度快、使用方便、成本低等優(yōu)點,迅速得到了眾
多PC廠商和半導體廠商的大力支持,外設(shè)向USB過度成為必然趨勢。
1.2USB驅(qū)動程序的意義
如果PC主機不知道如何與USB外設(shè)通信,那么這個USB外設(shè)一點用
處都沒有,人機接口設(shè)備(HID)⑵類是Windows完全支持的USB設(shè)備類型
中的一種,應(yīng)用程序可以使用操作系統(tǒng)內(nèi)設(shè)置的驅(qū)動與HID通信,但與HID
通信不像打開一個端口,設(shè)定幾個參數(shù),然后就可以讀寫數(shù)據(jù)那么簡單,在
應(yīng)用程序能與HID交換數(shù)據(jù)之前,它先要找到設(shè)備,獲取有關(guān)它的報告信息。
為做到這些,應(yīng)用程序必須通過訪問通信API函數(shù),使位于上層的應(yīng)用程序
與位于下層的設(shè)備驅(qū)動程序進行數(shù)據(jù)交換。應(yīng)用程序可以使用任何能訪問
API函數(shù)的程序語言,VC++是一種能訪問API函數(shù)的功能強大的語言,因此,
我們應(yīng)用VisualC++6.0環(huán)境下編寫與USB設(shè)備通信的Windows程序。
1.3VC++軟件的介紹
應(yīng)用基于MFCAppWizard的應(yīng)用程序。MFC(MicrosoftFoundationClass
Library)中的各種類結(jié)合遠來構(gòu)成了一個應(yīng)用程序框架,它的目的就是在此
基礎(chǔ)上來建立Windows下的應(yīng)用程序,這是一種相對SDK來說更為簡單的
方法。因為總體上,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的
標準實現(xiàn)方法,要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填
入這個輪廓。MicrosoftVisualC++提供了相應(yīng)的工具來完成這個工作:
AppWizard可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于
幫助直觀地設(shè)計用戶接口;ClassWizard用來協(xié)助添加代碼到框架文件;最后,
編譯,則通過類庫實現(xiàn)了應(yīng)用程序特定的邏輯。
1.4系統(tǒng)方案設(shè)計
上位機界面應(yīng)用VC++6.0軟件來編寫,為了簡單適用,在創(chuàng)建工程時采
用對話框類型。一個好的應(yīng)用程序首先要有好的用戶界面,看起來賞心悅目,
使用起來簡單、方便。顯示界面上的各個元素需要和USB設(shè)備上的元件擺放
位置相對應(yīng)。把要完成的一系列功能的顯示元素分成不同的模塊來進行程序
的編寫,每一個模塊分別完成一種功能,這樣既方便檢查程序,也方便在通
信發(fā)生錯誤時的對錯誤進行分析。
為了實現(xiàn)PC機對USB設(shè)備的識別,上位機端需要有一個USB設(shè)備的
驅(qū)動程序來識別和支持USB設(shè)備,否則PC機將無法識別USB設(shè)備。這里
選用DrivcrStudio軟件來編寫,它能生成一個簡單的驅(qū)動程序的框架,根據(jù)
需要,可以在此基礎(chǔ)上進行更深層的開發(fā)。
1.5預(yù)期結(jié)果
通過上位機軟件和驅(qū)動程序的編寫實現(xiàn)以下功能:
1、完成上位機軟件的編寫,并可以在設(shè)備沒有連接時顯示連接錯誤。
2、完成驅(qū)動程序的編寫,實現(xiàn)上位機能發(fā)現(xiàn)USB設(shè)備,并使上位機能
正確配置設(shè)備。同時在顯示界面上顯示出找到設(shè)備。
3、實現(xiàn)雙向傳輸。在上位機軟件中可以控制USB設(shè)備中的相應(yīng)顯示,
同時可以接收到USB設(shè)備傳回的消息,并在顯示界面上顯示。達到一個PC
機與USB設(shè)備信息的交互,完成通信。
4、利用VC編程實現(xiàn)對計算機底層硬件的操作,培養(yǎng)在此方面工程開發(fā)
的能力。
第2章USB協(xié)議
2.1USB系統(tǒng)的使用分類及系統(tǒng)的描述
USB設(shè)計的初衷是針對桌面電腦而不是應(yīng)用于可移動的環(huán)境下的。軟件
體系通過對各種主機控制器提供支持以保證將來對LSB的擴充⑶。USB是一
種電纜總線,支持在主機利各式各樣的即插即用的外設(shè)之間進行數(shù)據(jù)傳輸。
由主機預(yù)定的標準的協(xié)議使各種設(shè)備分享USB帶寬,當其它設(shè)備和主機在運
行時,總線允許添加、設(shè)置、使用以及拆除外設(shè)。
USB系統(tǒng)的描述:
一個USB系統(tǒng)主要被定義為三個部分:USD的互連、USB的設(shè)備、USB
的主機。
USB的互連是指USB設(shè)備與主機之間進行連接和通信的操作,主要包
括以下幾方面:
(1)總線的拓撲結(jié)構(gòu):USB設(shè)備與主機之間的各種連接方式;
(2)內(nèi)部層次關(guān)系:根據(jù)性能疊置,USB的任務(wù)被分配到系統(tǒng)的每一
個層次;
(3)數(shù)據(jù)流模式:描述了數(shù)據(jù)在系統(tǒng)中通過USB從產(chǎn)生方到使用方的
流動方式;
(4)USB的調(diào)度:USB提供了一個共享的連接。對可以使用的連接進
行了調(diào)度以支持同步數(shù)據(jù)傳輸,并且避免的優(yōu)先級判別的開銷。
USB的設(shè)備如下所示:
(1)網(wǎng)絡(luò)集線器,向USB提供了更多的連接點;
(2)功能器件:為系統(tǒng)提供具體功能,如ISDN的連接,數(shù)字的游戲桿
或揚聲器。
USB設(shè)備提供的USB標準接口的主要依據(jù):
(1)對USB協(xié)議的運用;
(2)對標準USB操作的反饋,如設(shè)置和復(fù)位;
(3)標準性能的描述性信息;
USB傳輸方式:
USB總線屬一種輪訊方式的總線,主機控制端口初始化所有的數(shù)據(jù)傳輸。
每一總線執(zhí)行動作最多傳送二個數(shù)據(jù)包。按照傳輸前制定好的原則,在每次
傳送開始時,主機控制器發(fā)送一個描述傳輸運作的種類、方向,USB設(shè)備地
址和終端號的USB數(shù)據(jù)包,這個數(shù)據(jù)包通常稱為標志包(tokenpacket)。USB
設(shè)備從解碼后的數(shù)據(jù)包的適當位置取出屬于自己的數(shù)據(jù)。數(shù)據(jù)傳輸方向不是
從主機到設(shè)備就是從設(shè)備到主機。在傳輸開始時,由標志包來標志數(shù)據(jù)的傳
輸方向,然后發(fā)送端開始發(fā)送包含信息的數(shù)據(jù)包或表明沒有數(shù)據(jù)傳送。接收
端也要相應(yīng)發(fā)送一個握手的數(shù)據(jù)包表明是否傳送成功。發(fā)送端和接收端之間
的USB數(shù)據(jù)傳輸,在主機和設(shè)備的端口之間,可視為一個通道。存在兩種類
型的通道:流和消息。流的數(shù)據(jù)不像消息的數(shù)據(jù),它沒有USB所定義的結(jié)構(gòu),
而且通道與數(shù)據(jù)帶寬、傳送服務(wù)類型,端口特性(如方向和緩沖區(qū)大小)有
關(guān)。USB中有一個特殊的通道——缺省控制通道,它屬于消息通道,當設(shè)備
一啟動即存在,從而為設(shè)備的設(shè)置、查詢狀況和輸入控制信息提供一個入口。
2.2USB物理接口的電器特性
2.2.1USB物理接口
USB傳送信號和電源是通過一種四線的電纜,兩根線是用于發(fā)送信號。
存在兩種數(shù)據(jù)傳輸率:
VBUSVBUS
D+D+
D-D-
GNDGND
圖2.1USB物理接口
(1)USB的高速信號的比特率定為12Mbps;
(2)低速信號傳送的模式定為1.5Mbps;
電纜中包括VBUS、GND二條線,向設(shè)備提供電源。VBUS使用+5V電
源。USB對電纜長度的要求很寬,最長可為幾米。通過選擇合適的導線長度
以匹配指定的IRdrop和其它一些特性,如設(shè)備能源預(yù)算和電纜適應(yīng)度。為
了保證足夠的輸入電壓和終端阻抗。重要的終端設(shè)備應(yīng)位于電纜的尾部。在
每個端口都可檢測終端是否連接或分離,并區(qū)分出高速,或低速設(shè)備。
2.2.2電源
主要包括兩方面:
(1)電源分配:即USB的設(shè)備如何通過USB分配得到由主計算機提供
的能源。每個USB單元通過電纜只能提供有限的能源。主機對那種直接相連
的USB設(shè)備提供電源供其使用。并且每個USB設(shè)備都可能有自己的電源。
那些完全依靠電纜提供能源的設(shè)備稱作“總線供能”設(shè)備。相反,那些可選
擇能源來源的設(shè)備稱作“自供電”設(shè)備。而且,集線器也可由與之相連的USB
設(shè)備提供電源。
(2)電源管理:即通過電源管理系統(tǒng),USB的系統(tǒng)軟件和設(shè)備如何與
主機協(xié)調(diào)工作。USB主機與USB系統(tǒng)有相互獨立的電源管理系統(tǒng)。USB的
系統(tǒng)軟件可以與主機的能源管理系統(tǒng)結(jié)合共同處理各種電子元件如掛起、喚
醒,并且有特色的是,USB設(shè)備應(yīng)用特有的電源管理特性,可讓系統(tǒng)軟件和
控制其電源管理“
2.2.3總線協(xié)議
主機控制端口初始化所有的數(shù)據(jù)傳輸。每一總線執(zhí)行動作最多傳送三個
數(shù)據(jù)包。按照傳輸前制定好的原則,在每次傳送開始時,主機控制器發(fā)送一
個描述傳輸運作的種類、方向,USB設(shè)備地址和終端號的USB數(shù)據(jù)包,這
個數(shù)據(jù)包通常稱為標志包(tokenpacket)oUSB設(shè)備從解碼后的數(shù)據(jù)包的適當
位置取出屬于自己的數(shù)據(jù),數(shù)據(jù)傳輸方向不是從主機到設(shè)備就是從設(shè)備到主
機。在傳輸開始時,由標志包來標志數(shù)據(jù)的傳輸方向,然后發(fā)送端開始發(fā)送
包含信息的數(shù)據(jù)包或表明沒有數(shù)據(jù)傳送。接收端也要相應(yīng)發(fā)送一個握手的數(shù)
據(jù)包表明是否傳送成功。發(fā)送端和接收端之間的USB數(shù)據(jù)傳輸,在主機和設(shè)
備的端口之間,可視為一個通道。存在兩種類型的通道:流和消息。流的數(shù)
據(jù)不像消息的數(shù)據(jù),它沒有USB所定義的結(jié)構(gòu),而且通道與數(shù)據(jù)帶寬、傳送
服務(wù)類型,端口特性(如方向和緩沖區(qū)大小)有關(guān)。多數(shù)通道在USB設(shè)備設(shè)
置完成后即存在。USB中有一個特殊的通道——缺省控制通道,它屬于消息
通道,當設(shè)備一啟動即存在,從而為設(shè)備的設(shè)置、查詢狀況和輸入控制信息
提供一個入口。
事務(wù)預(yù)處理允許對一些數(shù)據(jù)流的通道進行控制,從而在硬件級上防止了
對緩沖區(qū)的高估或低估,通過發(fā)送不確認握手信號從而阻塞了數(shù)據(jù)的傳輸速
度。當不確認信號發(fā)過后,若總線有空閑,數(shù)據(jù)傳輸將再做一次。這種流控
制機制允許靈活的任務(wù)安排,可使不同性質(zhì)的流通道同時正常工作,這樣多
種流通常可在不同間隔進行工作,傳送不同大小的數(shù)據(jù)包。
1、USB設(shè)備的安裝
所有的USB設(shè)備都是通過端口接在USB上,網(wǎng)絡(luò)集線器知道這些指定
的USB設(shè)備,集線器有一個狀態(tài)指示器指明在其某個端口上,USB設(shè)備是
否被安裝或拆除了,主機將所有的集線器排成隊列以取回其狀態(tài)指示。在USB
設(shè)備安裝后,主機通過設(shè)備控制通道激活該端口并以預(yù)設(shè)的地址值給USB設(shè)
備。
主機對每個設(shè)備指定唯一的USB地址。并檢測這種新裝的USB設(shè)備是
集線器還是功能部件。主機為USB設(shè)備建立了控制通道,使用指定的USB
的地址和零號端口。
如果安裝的USB設(shè)備是集線器,并且USB設(shè)備連在其端口上,上述過
程對每個USB設(shè)備的安裝都要做一遍。
如果安裝的設(shè)備是功能部件,那么主機中關(guān)于該設(shè)備的軟件將因設(shè)備的
連接而被引發(fā)。
2、USB設(shè)備的拆卸
當USB設(shè)備從集線器的端口拆除后,集線器關(guān)閉該端口,并且向主機報
告該設(shè)備已不存在。USB的系統(tǒng)軟件將準確進行處理,如果去除的USB設(shè)
備上集線器,USB的系統(tǒng)軟件將對集線器反連在其上的所有設(shè)備進行處理。
3、總線標號
總線標號就是對連接在總線上的設(shè)備指定唯一的地址的一種動作,因為
USB允許USB設(shè)備在任何時刻從USB上安裝或拆卸,所以總線標號是USB
的系統(tǒng)軟件始終要作的動作,而且總線標號還包括對拆除設(shè)備的檢測和處理。
4、數(shù)據(jù)流種類
數(shù)據(jù)和控制信號在主機和USB設(shè)備間的交換存在兩種通道:單向和雙
向。USB的數(shù)據(jù)傳送是在主機軟件和一個USB設(shè)備的指定端口之間。這種
主機軟件和USB設(shè)備的端口間的聯(lián)系稱作通道。總的來說,各通道之間的數(shù)
據(jù)流動是相互獨立的。一個指定的USB設(shè)備可有許多通道。例如,一個USB
設(shè)備存在一個端口,可建立一個向其它USB設(shè)備的端口,發(fā)送數(shù)據(jù)的通道,
它可建立一個從其它USB設(shè)備的端口接收數(shù)據(jù)的通道。
USB的結(jié)構(gòu)包含四種基本的數(shù)據(jù)傳輸類型:
(1)控制數(shù)據(jù)傳送:在設(shè)備連接時用來對設(shè)備進行設(shè)置,還可對指定設(shè)
備進行控制,如通道控制;
(2)批量數(shù)據(jù)傳送:大批量產(chǎn)生并使用的數(shù)據(jù),在傳輸約束下,具有很
廣的動態(tài)范圍;
(3)中斷數(shù)據(jù)的傳送:用來描述或匹配人的感覺或?qū)μ卣鞣磻?yīng)的回饋。
(4)同步數(shù)據(jù)的傳送:由預(yù)先確定的傳送延遲來填滿預(yù)定的USB帶寬。
對于任何對定的設(shè)備進行設(shè)置時一種通道只能支持上述一種方式的數(shù)據(jù)
傳輸,數(shù)據(jù)流模式的更多細節(jié)在第四章中詳述。
5、控制數(shù)據(jù)傳送
當USB設(shè)備初次安裝時,USB系統(tǒng)軟件使用控制數(shù)據(jù)對設(shè)備進行設(shè)置,
設(shè)備驅(qū)動程序通過特定的方式使用控制數(shù)據(jù)來傳送,數(shù)據(jù)傳送是無損性的。
6、批量數(shù)據(jù)傳送
批量數(shù)據(jù)是由大量的數(shù)據(jù)組成,如使用打印機和掃描儀時,批量數(shù)據(jù)是
連續(xù)的。在硬件級上可使用錯誤檢測可以保證可靠的數(shù)據(jù)傳輸,并在硬件級
上引入了數(shù)據(jù)的多次傳送,此外根據(jù)其它一些總線動作,被大量數(shù)據(jù)占用的
帶寬可以相應(yīng)的進行改變c
7、中斷數(shù)據(jù)傳輸
中斷數(shù)據(jù)是少量的,且其數(shù)據(jù)延遲時間也是有限范圍的。這種數(shù)據(jù)可由
設(shè)備在任何時刻發(fā)送,并且以不慢于設(shè)備指定的速度在USB上傳送。
中斷數(shù)據(jù)一般由事件通告,特征及座標號組成,只有一個或幾個字節(jié)。
匹配定點設(shè)備的座標即為一例,雖然精確指定的傳輸率不必要,但USB必須
對交互數(shù)據(jù)提供一個反應(yīng)時間的最低界限。
8、同步傳輸
同步數(shù)據(jù)的建立、傳送和使用時是連續(xù)且實時的,同步數(shù)據(jù)是以穩(wěn)定的
速率發(fā)送和接收實時的信息,同步數(shù)據(jù)要使接收者與發(fā)送者保持相同的時間
安排,除了傳輸速率,同步數(shù)據(jù)對傳送延遲非常敏感。所以同步通道的帶寬
的確定,必須滿足對相關(guān)功能部件的取樣特性。不可避免的信號延遲與每個
端口的可用緩沖區(qū)數(shù)有關(guān)°
一個典型的同步數(shù)據(jù)的例子是語音,如果數(shù)據(jù)流的傳送率不能保持,數(shù)
據(jù)流是否丟失將取決于緩沖區(qū)的大小和損壞的程度。即使數(shù)據(jù)在USB硬件上
以合適的速率傳送,軟件造成的傳送延遲將對那些如電話會議等實時系統(tǒng)的
應(yīng)用造成損害。
實時的傳送同步數(shù)據(jù)肯定會發(fā)生潛在瞬時的數(shù)據(jù)流丟失現(xiàn)象,換句話說,
即使許多硬件機制,如重傳的引入也不能避免錯誤的產(chǎn)生。實際應(yīng)用中,USB
的數(shù)據(jù)出錯率小到幾乎可以忽略不計。從USB的帶寬中,給USB同步數(shù)據(jù)
流分配了專有的一部分以滿足所想得到的傳速率,USB還為同步數(shù)據(jù)的傳送
設(shè)計了最少延遲時間。
9、指定USB帶寬
USB的帶寬分配給各個通道,當一個通道建立后,USB就分配給它一定
的帶寬,USB設(shè)備需要提供一些數(shù)據(jù)緩沖區(qū)。若USB提供了更多帶寬,則
需更多的緩沖區(qū)。USB的體系要保證緩沖引導的硬件的延遲限定在幾亳秒內(nèi)。
USB的帶寬容量可以容納多種不同的數(shù)據(jù)流,因此保證USB上可以連
接大量設(shè)備,如可以容納從1B+D直到T1速率范圍的電信設(shè)備。同時USB
支持在同一時刻不同設(shè)備具有不同比特率,并具有一個動態(tài)變動的范圍。
2.3USB設(shè)備
USB設(shè)備分為諸如集線器、分配器或文本設(shè)備等種類。集線器類指的是
一種提供USB連接點的設(shè)備,USB設(shè)備需要提供自檢和屬性設(shè)置的信息,
USB設(shè)備必須在任何時刻執(zhí)行與所定義的USB設(shè)備的狀態(tài)相一致的動態(tài)。
2.3.1設(shè)備特性
當設(shè)備被連接、編號后,該設(shè)備就擁有一個唯一的USB地址。設(shè)備就是
通過該USB地址被操作的,每一個USB設(shè)備通過一個或多個通道與主機通
訊。所有USB設(shè)備必須在零號端口上有一指定的通道,每個USB設(shè)備的USB
控制通道將與之相連。通過此控制通道,所有的USB設(shè)備都列入一個共同的
準入機制,以獲得控制操作的信息。
在零號端口上,控制通道中的信息應(yīng)完整的描述USB設(shè)備、此類信息主
要有以下幾類:
(1)標準信息:這類信息是對所有USB設(shè)備的共同性的定義,包括一
些如廠商識別、設(shè)備種類、電源管理等的項目。設(shè)備設(shè)置、接口及終端的描
述在此給出。
(2)類別信息:此類信息給出了不同USB的設(shè)備類的定義,主要反映
其不同點。
(3)USB廠商信息:USB設(shè)備的廠商可自由的提供各種有關(guān)信息,其
格式不受該規(guī)范制約。此外,每個USB設(shè)備均提供USB的控制和狀態(tài)信息。
2.3.2設(shè)備描述
主要分為兩種設(shè)備類:集線器和功能部件。只有集線器可以提供更多的
USB的連接點,功能部件為主機提供了具體的功能。
USB設(shè)備可被劃分三層:
(1)底層是傳送和接收數(shù)據(jù)包的總線接口;
(2)中間層處理總線接口與不同端點之間的數(shù)據(jù)路由端節(jié)點是數(shù)據(jù)的終
結(jié)提供處或使用處,它可被看作數(shù)據(jù)源或數(shù)據(jù)接收端(Sink);
(3)最上層的功能由串行總線設(shè)備提供,比如鼠標,或ISDN接口。
2.3.3設(shè)備狀態(tài)
USB設(shè)備有若干可能的狀態(tài),其中一些對于USB與主機(host)來說是
外置的,而另外一些對USB設(shè)備來說是內(nèi)置的。
(1)連接狀態(tài)
USB設(shè)備可被連接到USB接口上或從接口斷開。
(2)加電狀態(tài)
USB設(shè)備的電源可來自外部電源,也可從USB接口的集線器而來。電
源來自外部電源的USB設(shè)備被稱作自給電源式的(self-powered),>盡管自給
電源式的USB設(shè)備可能在連接上USB接口以前可能已經(jīng)帶電,但它們直到
連線上USB接n后才能被看作是加電狀態(tài)(Poweredstate)o而這時候VBUS
已經(jīng)對設(shè)備產(chǎn)生作用了。
一個設(shè)備可能有既支持自給電源的,同時也支持總線電源式的配置。有
一些支持其中的一種,而另一些設(shè)備配置可能只有在自給電源下才能被使用。
設(shè)備對電源支持的能力是通過配置描述表(configurationdescriptor)來反映
的。當前的電源供給形式被作為設(shè)備狀態(tài)的一部分被反映出來。設(shè)備可在任
何時候改變它們的供電來源,比如說:從自給式向總線式改變,如果一個配
置同時支持兩種模式,那此狀態(tài)的最大電源需求就是指設(shè)備在兩種模式下從
VBUS上獲取電能的最大值。設(shè)備必須以此最大電源作為參照,而究竟處于
何狀態(tài)是不考慮的。如果有一配置僅支持一種電源模式,那么電源模式的改
變會使得設(shè)備失去當前配置與地址,返回加電狀態(tài)。如果一個設(shè)備是自給電
源式,并且當前配置需要大于100mA電流,那么如果此設(shè)備轉(zhuǎn)到了總線電源
式,它必須返回地址狀態(tài)(Addressslate)。自給電源式集線器使用VBUS來
為集線控制器(Hubcontroller)提供電源,因而可以仍然保持配置狀態(tài)
(Configuredstate),盡管自給電源停止提供電源。
(3)缺省狀態(tài)
設(shè)備加電以后,在它從總線接收到復(fù)位信號之前不應(yīng)對總線傳輸發(fā)生響
應(yīng)。在接收到復(fù)位信號之后,設(shè)備才在缺省地址處變得可尋址。
(4)地址狀態(tài)
所有的USB設(shè)備在加電復(fù)位以后都使用缺省地址。每一設(shè)備在連接或復(fù)
位后由主機分配一個唯一的地址。當USB設(shè)備處于掛起狀態(tài)時,它保持這個
地址不變。
USB設(shè)備只對缺省通道(Pipe)請求發(fā)生響應(yīng),而不管設(shè)備是否已經(jīng)被
分配地址或在使用缺省地址。
(5)中止狀態(tài)
為節(jié)省電源,USB設(shè)備在探測不到總線傳輸時自動進入中止狀態(tài)。當中
止時,USB設(shè)備保持本身的內(nèi)部狀態(tài),包括它的地力二及配置。
所有的設(shè)備在一段特定的時間內(nèi)探測不到總線活動時必須進入中止態(tài)。
不管設(shè)備是被分配了非缺省的地址或者是被配置了,已經(jīng)連接的設(shè)備必須在
任何加電的時刻隨時準備中止??偩€活動的中止可能是因為主機本身進入了
中止狀態(tài)。另外,USB設(shè)備必須在所連接的集線器端口失效時進入中止態(tài)。
這就是所指的選擇性中止(Selectivesuspend)?
USD設(shè)備在總線活動來到時結(jié)束中止態(tài)。USB設(shè)備也可以遠程喚醒的電
流信號來請求主機退出中止態(tài)或選擇性中止態(tài)。具體設(shè)備具有的遠程喚醒的
能力是可選的,也就是說,如果一個設(shè)備有遠程喚醒的能力,此設(shè)備必須能
讓主機控制此能力的有效與否。當設(shè)備復(fù)位時,遠程喚醒能力必須被禁止。
2.4BusEnumeration總線標號
當USB設(shè)備接上或從USB設(shè)備移開的時候,主機啟動一個被稱作總線
標識(busenumeration)的進程,來標識并管理設(shè)備狀態(tài)的改變,當USB設(shè)
備接上一個加電端口時,系統(tǒng)當采取以下操作:
(1)USB設(shè)備所連的集線器通過其通向主機的狀態(tài)改變通道向主機,
匯報本USB設(shè)備已連接上。此時,USB設(shè)備處于加電狀態(tài),它所連接的端
口是無效的。
(2)主機通過尋問集線器決定此次狀態(tài)改變的確切含義。
(3)主機一旦得知新設(shè)備已連上以后,它至少等待100ms以使得插入
操作的完成以及設(shè)備電源穩(wěn)定工作。然后主機發(fā)出端口使能及復(fù)位命令給那
個端口。
(4)集線器將發(fā)向端口的復(fù)位信號持續(xù)10ms當復(fù)位信號撤消后,端口
已經(jīng)有效了。這時USB設(shè)備處于缺省狀態(tài),并且可從VBUS汲取小于100mA
的電能,所有設(shè)備寄存器及狀態(tài)已經(jīng)被復(fù)位,設(shè)備可對缺省地址產(chǎn)生響應(yīng)。
(5)主機給設(shè)備分配一個唯一的地址,設(shè)備轉(zhuǎn)向編址狀態(tài)。(Address
state)o
(6)在USB設(shè)備接受設(shè)備地址之前,它的缺省控制通道(DefaultControl
Pipe)在缺省地址處自然是可尋址的,主機通過讀取設(shè)備描述表,判決設(shè)備
缺省通道的實際凈數(shù)據(jù)負載。
(7)主機從設(shè)備讀取配置信息要從配置。讀到配置n-1,其中n為配置
個數(shù),此操作須花費幾個毫秒。
(8)基于從設(shè)備取來的配置信息及設(shè)備如何被使用的信息,主機給設(shè)備
一個配置值,此刻,設(shè)備就處于配置狀態(tài)(Configuredstate)并此配置有關(guān)
的所有端節(jié)點,都按照配置各就各位,USB設(shè)備現(xiàn)在可以從VBUS得到描述
中所要求的電量了。從設(shè)備的角度來講,它已經(jīng)準備就緒了。
當UBS設(shè)備被取走時,集線器同樣會通知主機,斷開一個設(shè)備連接會使
得設(shè)備所連接的端口無效,一收到斷開通知后,主機就會更新的拓撲信息。
2.5通用USB設(shè)備操作
1、動態(tài)插接與拔開
USB設(shè)備必須在任意時刻允許被插接與拔開。提供連接點或端口的集線
器應(yīng)當負責匯報端口的狀態(tài)改變情況。
當主機探測到連接操作后,會使得所連的集線器端口生效,設(shè)備也會因
此而復(fù)位,一個被復(fù)位了的USB設(shè)備有如下特性:
(1)對缺省USB地址發(fā)生響應(yīng);
(2)沒有被配置;
(3)初始狀態(tài)不是掛起。
當設(shè)備從一個集線器端口移去時,集線器會使得原來連接的端口失效,
并且通知主機設(shè)備已移去C
2、地址分配
當USB設(shè)備連接以后,由主機負責給此設(shè)備分配一個唯一的地址,這個
操作是在設(shè)備復(fù)位及端口使能操作以后。
3、配置
USB設(shè)備在正常被使用以前,必須被配置,由主機負責配置設(shè)備。主機
一般會從USB設(shè)備獲取配置信息后再準定此設(shè)備有哪些功能。
作為配置操作的一部分,主機會設(shè)置設(shè)備的配置值,并且,如果必要的
話會選擇合適的接口的備選設(shè)置。
只須一個簡單配置,一個設(shè)備可能支持多重接口。一個接口是一組端結(jié)
點集合,它們代表了設(shè)備向主機提供的單一的功能或特性,用來與這組相關(guān)
端結(jié)點通信的協(xié)議以及接口內(nèi)各端結(jié)點的目的可以作為一個設(shè)備類的一部分
或者由廠商制定具體定義°
另外,一個配置中的接口可能有備選設(shè)置。這些備選設(shè)置會重定義相關(guān)
端結(jié)點的數(shù)目或特性。如果是這樣的話,設(shè)備必須支持Getlnterface(接口請
求)與SeiInterface(接口設(shè)置)請求,來匯報及選擇指定的接口的設(shè)備選設(shè)
置。
在每個設(shè)備配置下,每個接口描述表可能包括用來標識接口的及備選設(shè)
置的域,接口被從0?N-1編號。n為配置所支持的能同時使用的接口數(shù)目,
類似的設(shè)置的編號也從0開始。當設(shè)備初始化配置后,缺省設(shè)置是備選設(shè)置
Oo
了支持通用的設(shè)備驅(qū)動程序管理一組相關(guān)的BUS設(shè)備,設(shè)備與接口描述
表中包含了類(Class),子類(Subclass),及協(xié)議(Protocol)域。這些域用
來標識一個設(shè)備的功能及用于通信的協(xié)議。
一個類值被分配給一組按照特性劃分成USB類說明一部分的設(shè)備。一個
類的設(shè)備可進一步劃分成子類,并且在一個類或子類中,一個協(xié)議代值可定
義主機軟件是怎樣與設(shè)備通信的。
4、數(shù)據(jù)傳送
數(shù)據(jù)可能以四種方式在USB設(shè)備端結(jié)點與主機之間傳送。在不同設(shè)置
下,一個終端結(jié)點可能被用于不同的傳輸方式,但一旦設(shè)置選定,傳送方式
就選定了。
5、復(fù)位/繼續(xù)及恢復(fù)時間
當一個端口被復(fù)位或從中止態(tài)繼續(xù)的時候,USB系統(tǒng)軟件應(yīng)當?shù)却粋€
10ms的恢復(fù)時間才能確保端口對數(shù)據(jù)傳輸產(chǎn)生響應(yīng)。
一旦恢復(fù)時間段結(jié)束(從resei信號結(jié)束,或resume信號結(jié)尾的EOP結(jié)
束開始計時)設(shè)備必須在任意時刻都能對數(shù)據(jù)傳輸作出響應(yīng)。
6、設(shè)置地址的處理
在reset/resume恢復(fù)時間段以后,如果設(shè)備收到SeiAddress。請求,設(shè)備
必須能在50ms內(nèi)完成請求的處理,并完成狀態(tài)的轉(zhuǎn)換,在SetAddressO的請
求下,當設(shè)備發(fā)出0長度的狀態(tài)數(shù)據(jù)包或設(shè)備收到狀態(tài)數(shù)據(jù)包的響應(yīng)信號
ACK就表明狀態(tài)轉(zhuǎn)換結(jié)束了。
在狀態(tài)轉(zhuǎn)換結(jié)束后,設(shè)備有2ms的SetAddressO恢復(fù)時間。在這段時間
結(jié)束以后,設(shè)備必須能在新地址處接受Setup數(shù)據(jù)包,并且,必須確保此時
設(shè)備不對舊地址的信號產(chǎn)生響應(yīng)。
7、請求錯誤
如果一設(shè)備收到一個請求,它或是在設(shè)備中無定義,或是不適用于當前
設(shè)置,或是數(shù)值不對,這時就會產(chǎn)生一個請求錯誤。設(shè)備在下一個數(shù)據(jù)傳輸
階段或狀態(tài)交換階段(Statusstage)返回一個表明錯誤的STALLPID信號,
一般在下一個數(shù)據(jù)傳輸返回更好,這樣可減少不必要的總線活動。
2.6USB主機
USB的互連支持數(shù)據(jù)在USB主機與USB設(shè)備之間的流動。為了簡化主
機上的客戶軟件(Softwareclient)與設(shè)備的功能部件(function)之間的通信
而必須的主機接口(hostinterface)o只要USB設(shè)備并不感覺到主機行為的改
變,USB主機完全可以提供一個不同的軟件系統(tǒng)實現(xiàn)方法。圖2.2展示了USB
通信模型之間基本的信息流與互連關(guān)系:
<=>邏輯的信息流-----?實際的信息流
圖2.2通信模型層次關(guān)系圖
由圖2.2可見,主機與設(shè)備都被劃分成不同的層次。主機上垂直的箭頭
是實際的信息流。設(shè)備上對應(yīng)的接口是基于不同實現(xiàn)的。在主機與設(shè)備之間
的所有通信最終都是通過USB的電纜進行,然而,在上層的水平層之間存在
邏輯的主機一設(shè)備信息流c主機上的客戶軟件和設(shè)備功能部件之間的通信是
基于實際的應(yīng)用需求及設(shè)備所能提供的能力。
客戶軟件與功能部件之間的透明通信的要求,決定主機和設(shè)備下層部件
的功能以及它們的界面(interface)。
主機在整個USB系統(tǒng)中是唯一的,它包括USB總線接口、USB系統(tǒng)(USB
System)sUSB客戶(Client)?
其中,USB總線接口處理電氣及協(xié)議層的互連。從互連的角度看,USB
設(shè)備和USB主機都提供類似的USB總線接口,如串行接口引擎(Serial
InterfaceEngineSIE)O由于主機在USB系統(tǒng)中的特殊性,USB主機上的總線
接口還必須具備主機控制器的功能(HostController),主機控制器具有一個
內(nèi)集成的集線器(根集線器)提供與USB電纜的連接。
USB系統(tǒng)(USBSystem)使用主機控制器來管理主機與USB設(shè)備的數(shù)
據(jù)傳輸。USB系統(tǒng)與主機控制器之間的界面基于主機控制器的硬件特性。USB
系統(tǒng)層相對于主機控制器而言,處理的是以客戶觀點見到的數(shù)據(jù)傳輸及客戶
與設(shè)備的交互。這包括附加的USB信息,比如協(xié)議頭(ProtocolWrappers)。
USB系統(tǒng)還必須管理USB的系統(tǒng)資源,以使得客戶的訪問成為可能。
USB系統(tǒng)有三個主要組成部份:主機控制器驅(qū)動(HoslController
Driver)>USB驅(qū)動(USBDriver)和主機軟件(hostsoftware)。
主機控制器驅(qū)動的存在,方便地將各種不同的主機控制器實現(xiàn)映射到
USB系統(tǒng),客戶可以不必知道設(shè)備到底接在哪個主機控制器上就能同設(shè)備進
行通信。USB驅(qū)動提供了基本的面向客戶的主機界面。在HCD與USB之間
的接口稱為主機控制器驅(qū)動接口(HostControllerDriverInterfaceHCD1)。這
層接口不能被客戶直接訪問,所以也不是由USB具體來完成的。一個典型的
HCDI是由支撐各種不同主機控制器的操作系統(tǒng)來定義的。
USBD提供I/O請求包(I/ORequestPackets)形式的數(shù)據(jù)傳輸,以某一
特定通道來傳輸數(shù)據(jù)。另外,USBD為它的客戶提供一個容易被支配及配置
的抽象的設(shè)備。作為這種抽象的一部份,USBD擁有標準通道對設(shè)備進行一
些標準的控制。這標準通道實現(xiàn)了USBD與抽象設(shè)備之間的邏輯通信。
在有些操作系統(tǒng)中,提供了額外的非USB系統(tǒng)軟件以支持設(shè)備的配置及
設(shè)備驅(qū)動程序的加載。在這樣的操作系統(tǒng)中,設(shè)備驅(qū)動程序應(yīng)使用提供的主
機軟件接口而不是直接訪問USBDL
客戶層描述的是直接與USB設(shè)備進行交互所需要的軟件包。當所有的設(shè)
備都已連上系統(tǒng)時,這些客戶就可以直接通設(shè)備進行通信。一個客戶不能直
接訪問設(shè)備的硬件。主機可提供如下的功能:
(1)檢測USB設(shè)備的連接與斷開;
(2)管理主機與設(shè)備之間的標準控制流;
(3)管理主機與設(shè)備之間的數(shù)據(jù)流;
(4)收集狀態(tài)及一些活動的統(tǒng)計數(shù)字。
控制主機控制器與USB設(shè)備的電氣接口,包括提供有限的能源。所有的
集線器都通過狀態(tài)改變通道報告它的狀態(tài)的改變,其中包括設(shè)備的連上與斷
開等。USBD的一類特殊客戶即:集線器驅(qū)動器擁有這些狀態(tài)改變通道,接
收這些狀態(tài)的改變。對于像設(shè)備連結(jié)這種狀態(tài)改變,集線器驅(qū)動器將加載設(shè)
備的驅(qū)動程序。在有些系統(tǒng)中,這種集線器驅(qū)動程序是操作系統(tǒng)提供的主機
軟件的一部份,它用來管理設(shè)備。
2.7USB分組標識
USB的分組標識(PID)用來標識操作的屬性,PID指出了數(shù)據(jù)分組的
類型,并可由此推斷出分組格式和改組所用的校驗方法。USB的通信結(jié)構(gòu)一
般是以PID開始的,后面緊跟著數(shù)據(jù)或控制信息,最后是CRC校驗。
PID是由一個四位的分組類型碼加上該四位類型碼的反碼組成,其格式
如圖2.3所示:
LSBMSB
PED0PID1PID2PID3FIDOPID3PID2PID3
圖2.3PID分組碼格式
2.8USB的數(shù)據(jù)流包格式
USB的數(shù)據(jù)流以包的形式進行傳輸,根據(jù)PID的不同,將包分為四種,
令牌包(TokenPackage),數(shù)據(jù)包(DataPackage),握手包(HandshakePackage),
和特殊類型包(SpecialPackage)o
2.8.1令牌包
如圖2.4所示為令牌包的格式。它由PID字段,ADDR(Address地址)字
段,ENDP(Endpoint,端點)字段和CRC(cyclicRedundancyCheck,循環(huán)冗
余校驗),字段構(gòu)成。PID包指定了包是輸入輸出還是建立類型,對于輸出和
建立事務(wù),地址和端點字段唯一確定了哪個設(shè)備和端點接受數(shù)據(jù)包。對于輸
入事務(wù),這些字段唯一確定了哪個端點應(yīng)該傳輸數(shù)捱包。只有主機能發(fā)出標
記包。輸入PID定義了從外設(shè)到主機的數(shù)據(jù)時務(wù)。格式如圖2.4所示:
8bit7bit4bit5bit
PIDADDRENDPCRC5
圖2.4令牌包格式
2.8.2數(shù)據(jù)包
數(shù)據(jù)包由PID,大于或等于0個字節(jié)的數(shù)據(jù)的數(shù)據(jù)區(qū)和CRC構(gòu)成。有兩種
類型的數(shù)據(jù)包,其中PID分別為DATAO和DATA1。這兩種數(shù)據(jù)包是為了支持
數(shù)據(jù)切換同步(DATAToggleSynchronization)而定義的。格式如圖2.5所示:
圖2.5數(shù)據(jù)包格式
2.8.3握手包
握手包僅由PID構(gòu)成。握手包用來報告數(shù)據(jù)事務(wù)的狀態(tài),能表示數(shù)據(jù)成
功接受,命令的接受或拒絕,流控制和終止條件。如圖2.6所示:
圖2.6握手包格式
2.8.4特殊包
這個特殊前導(SpecialPreamble)封包擁有獨自的PID類型名稱PRE,僅
用于主機想要從高速傳輸變成低速傳輸時,主機在想要送出低速的封包與低
速設(shè)備通信之前,先送出的PRE包,其格式如圖2.7所示:
圖2.7握手包格式
2.9本章小結(jié)
在本章中,重點研究與本文內(nèi)容相關(guān)的USB1.0協(xié)議以及USB通信傳誦數(shù)
據(jù)包內(nèi)容,包括拓撲結(jié)構(gòu)、USB接口特性、編碼方式與傳輸出類型、數(shù)據(jù)域
及數(shù)據(jù)封包格式以及時數(shù)據(jù)格式等內(nèi)容。它們是開發(fā)USB設(shè)備,完成與上位
機軟件通信的必要基礎(chǔ)。
第3章USB設(shè)備驅(qū)動程序的開發(fā)
3.1USB驅(qū)動程序簡介
在Windows環(huán)境下,不允許用戶在應(yīng)用程序中直接訪問硬件設(shè)備,應(yīng)用
程序必須通過一個中間橋梁才能訪問硬件設(shè)備,這個中間橋梁就是設(shè)備驅(qū)動
程序。
驅(qū)動程序是一個軟件,是連接應(yīng)用程序、硬件以及操作系統(tǒng)的橋梁,裝
入后成為操作系統(tǒng)內(nèi)核的一部分I%USB設(shè)備驅(qū)動程序為WDM模型,WDM
引入了功能設(shè)備對象FDO和物理設(shè)備對象PDO兩個新類來描述對象,一個
真實硬件只能有一個PDO,但可以有多個FDO,在驅(qū)動程序中直接操作的是
硬件的PDO和FDO叫WDM是通過設(shè)備的全局唯一標識符GUID來識別硬
件設(shè)備。選取合適的開發(fā)工具后就可以根據(jù)實際情況編寫USB設(shè)備驅(qū)動程
序,然后還要編寫和驅(qū)動程序通信的應(yīng)用程序。USB設(shè)備與PC機之間的通
信,除了讀寫數(shù)據(jù)外還有很多種類型,但讀寫數(shù)據(jù)是最基本的。所以把主要
研究問題放在對USB接口的讀與寫方面。
在這里應(yīng)用DriverSludio軟件來編寫驅(qū)動程序,DriverStudio把那些每個
驅(qū)動程序都需要的代碼都封裝成類庫。庫代碼自動地處理例行的操作,這極
大地簡小了任務(wù)的復(fù)雜度c而且,C++編譯器提供了ANSIC所不具備的優(yōu)點:
包括改進的類型安全檢查,內(nèi)連函數(shù)優(yōu)化,以及更好的代碼組織。
DriverWizard------DriverWorks的代碼向?qū)?,與微軟的VisualC++緊密的
集成。超過1500行的驅(qū)動程序源代碼框架只需幾次鼠標點擊就可完成。這些
代碼還包含了詳細的注釋,另外,DriverWizard還能生成專為特殊設(shè)備定制
的代碼,比如:USB設(shè)備,PCI設(shè)備,即插即用設(shè)備,ISA設(shè)備,等等。
3.2USB驅(qū)動程序的開發(fā)過程
下面為用DriverStudio開發(fā)一個USB驅(qū)動程序的過程。寫這個驅(qū)動程序
只要用到DriverWorks161o
首先打開VC++6.0軟件?在菜單中選擇DriverStudio選項中的DrivcrWorks
則會出現(xiàn)如圖的對話框(圖3.1)。
NewPiujeulType
StartaNewDriverPr*d…CreatesanewDeviceDriverProject
RecentProjectsLastModified
LoadProjectSettings..LoadsDrivetWizardsettingsfrompreviouslygeneratedproject
圖3.1建立新工程
選擇其中的StartaNewDriverProject選項,創(chuàng)建一個新工程。(圖3.2)
圖3.2設(shè)置工程名稱及保存位置
在這里,將這個工程稱為:ForUsb,所在的目錄為E:\我的文檔'畢業(yè)設(shè)計
\drivero然后單擊按鈕“Next”。
圖3.3選擇工程類型
在(圖3.3)這個對話框中,需要選擇驅(qū)動程序的類型。由于USB設(shè)備驅(qū)
動程序是WDM類型的,所以選擇第一項,并在下邊選擇DriverworksC++
語言框架點擊按鈕“Next”。
圖3.4選擇驅(qū)動程序的類型
圖3.4對話框為選擇類型,由于的USB設(shè)備驅(qū)動是要控制的硬件設(shè)備的,
所以我們選擇第一項,單擊“Next”。
圖3.5設(shè)置設(shè)備的總線
在圖3.5的對話框中,選擇的驅(qū)動程序所操作的總線類型。這里選擇USB。
在USBVendorID和USBProductID中填入USB設(shè)備的VID和PID。USB
設(shè)備的VID和PID分別是16講制的0471和()677。點擊“Next”。
點擊對話框中的,可以選擇電腦中連接的USB設(shè)備。在這里可以找到要
識別的USB實驗板,可以點擊select來選擇這個硬件。
在接下來的對話框中,需要加入Endpointl和Endpoint2的定義。由于在
USB中規(guī)定EndpointO是必須存在的,所以不需要對EndpoinlO進行定義.點
“Add”按鈕,彈出一個的對話框,設(shè)置好如圖所示,其中,按照USB的規(guī)
定,對于端點,它的地址是1;按照前面說明的設(shè)備的特點,Endpointl的最
大的包大小為16字節(jié),因此在“MaxTranserSize”中填入16;EndpointName
可以通過"SuggestName”得到。按照這些原則,繼續(xù)設(shè)置其他的配置,接
下來繼續(xù)按“Next”按鈕。
圖3.6添加輸入與輸出信息
PipeName:|PipeO
EndpointType:|Bulk
EndpointAddre$s(1-15):I5
TransferDirection:IIn,d
MaximumPacketSize:困
MaximumTransferSize(perURB):|4。96
□K|CancelI
圖3.7設(shè)置接口信息
在對話框中,因為不需要給其他的驅(qū)動程序提供接口,也不需要提供
Flush功能,所以不需要任何修改,直接按“Next”按鈕。
HelpBackNextFinishICancel
圖3.8設(shè)置對其他設(shè)備的接口
如圖3.9所示的對話框中,是給驅(qū)動程序增加一些IOCTL接口。如利用
IOCTL來控制USB設(shè)備的LED燈、數(shù)碼管顯示等功能的接口。然后點擊
“Next”按鈕。
圖3.9設(shè)置驅(qū)動的接口
在如圖的對話框中,不需要創(chuàng)建任何注冊表項,所以直接按“Next”按
鈕。
圖3.10創(chuàng)建注冊表選項
接下來為電源設(shè)置,由于USB實驗板不能自行供電,只能靠USB傳輸
線供電。所以選擇第1項,按“Next”按鈕。
圖3.11電源設(shè)置
下圖為設(shè)置本驅(qū)動程序的提供商,廠商的名字及設(shè)備描述,服務(wù)描述等。
按“Next”按鈕。
圖3.12驅(qū)動程序的各個信息
附加選項,直接點“Next”按鈕。
圖3.13附加選項
圖3.14確認框圖
最后得到確認框圖,確認無誤后選擇"Finish”完成了USB設(shè)備的驅(qū)動
程序的初步設(shè)置。
3.3本章小結(jié)
DriverStudio軟件可以快速地產(chǎn)生一個驅(qū)動程序。即使是寫一個比較復(fù)雜
的USB驅(qū)動程序,只要專注于自己的特定應(yīng)用就可以了。
所以Windows環(huán)境下開發(fā)USB應(yīng)用程序可以歸結(jié)如下:在應(yīng)用程序可以
開始與HID交換數(shù)據(jù)前,應(yīng)用程序必須先識別該設(shè)備并且讀取它的報表信息,
這些動作需要調(diào)用一堆AP[函數(shù)。應(yīng)用程序首先需要尋找連接到系統(tǒng)上的是
哪些HID設(shè)備,然后檢驗每個信息直到找到所需的屬性。如果是客戶化的設(shè)
備,應(yīng)用程序可以尋找特定的廠商與產(chǎn)品ID?;蛘邞?yīng)用程序可以尋找特定類
型的設(shè)備。
第4章上位機界面
4.1上位機顯示界面
為了簡單適用,在創(chuàng)建工程時采用基于對話框的類型。
首先打開VisualC++軟件,選擇新建,在彈出的對話框中選擇工程中的
MFCAppWizard(cxc)工程名為MFCApp,找到放置文件的位置后點擊確定
按鈕,進入MFCAppWizardo
在MFCAppWizard應(yīng)用程序向?qū)У?步中,選擇程序類型為對話框類型,
之后單擊確定按鈕,彈出新建工程信息窗口,如果檢查完全正確后,單擊確
定按鈕生成應(yīng)用程序所需的全部文件。
通過上述操作邊生成了基于對話框的工程MFCApp⑺。首先在對話框中
把原來的項目都刪除,右鍵單擊對話框選擇屬性,把標題改為USB實驗板。
在控件欄中,選擇相應(yīng)控件添加到對話框中,對其進行編輯代碼,就可以通
過對控件的操作來完成對程序的調(diào)用。
下面分別介紹各個控件完成的功能,并對控件內(nèi)的代碼進行描述與分析。
4.2LED流水燈
圖4.1LED流水燈
1、預(yù)計完成的功能
當用鼠標點擊LED框內(nèi)的相應(yīng)按鈕時,在USB實驗板相應(yīng)位置上的流
水燈會有亮滅的交替變化,如:當所有的流水燈都為滅的狀態(tài)時,點擊LEDO
按鈕,流水燈1會變亮,再點擊此按鈕,燈1會變滅。點擊其他按鈕,相應(yīng)
的流水燈會有亮與滅的變化。界面顯示如圖4.1。
2、完成功能編寫的程序
voidCMFCAppDlg::OnLed()()
(
if(led&OxOl)
led&=Oxfe;//led=led&Oxfe
else
led|=0x01;
OnLed();
)
3、完成功能的思想
在程序中事先定義了全局字符型變量led,在控件選項中選擇按鈕控件,
首先添加8個按鈕控件到到對話框中,把每個控件的屬性名改為規(guī)定的LEDO
到LED7。每個按鈕控件分別控制8位流水燈的亮和滅。然后打開ClassWizard
在CMFCAPPDlg類中,止于按鍵的單擊屬于通告消息,在objeclIDs中選擇
按鈕的ID號IDC_BUTTON1所以選擇BN.CLICKED,增加函數(shù)在彈出的對
話框中添加OnLedO,編輯代碼。在括號中,添加程序來完成對相應(yīng)按鈕的操
作。其他按鈕的內(nèi)容同以上對按鈕LEDO的操作。
例如,當單擊LEDO按鈕時,就調(diào)用OnLedO這個函數(shù)的內(nèi)容,這個函
數(shù)的功能就是要改變當前燈的狀態(tài)。Icd&OxOl的意思是led的值與16進制數(shù)
0x01按位求與,就是取最后一位的值,這里用到了if語句,如果為1就執(zhí)行
led&=Oxfe,為0就執(zhí)行l(wèi)ed|=0x01oled&=Oxfe的與led=led&Oxfe是相等的,
意思是把原來led中的值與OxFE按位求與之后再賦給變量led,同理led|=0x01
的意思就是把led的值與0x01按位取或之后再賦給led⑻。所以,當led最后
一位原來為1,執(zhí)行過這個函數(shù)后最后一位變?yōu)?,當led最后一位為0時執(zhí)
行過這個函數(shù)最后一位變?yōu)榱?o之后執(zhí)行OnLcd()這個函數(shù),OnLcd()函數(shù)
即為控制USB實驗板上LED流水燈的語句。OnLedO。只對led最后一位進行
操作,OnLcdl。至OnLed7()對其它7位進行相應(yīng)的轉(zhuǎn)換。
voidCMFCAppDlg::OnLed()
(
charbuffl16];
charbufOutput[16];
ULONGnOutput;
buffI0]=0x01;
buff[l]=led;
if(!DeviceIoControI(hDevice,
FORUSB_IOCTL_Write,
buff,
16,
bufOutput,
0,
&nOutpuU
NULL)
)
(
m_Mes="ERROR:DeviceloControlreturns
UpdatcData(FALSE);
)
)
在OnLed()函數(shù)中,首先創(chuàng)建了2個16位的字符數(shù)組bufT[16]和
bufOutput[16],前邊的為向USB驗板發(fā)送的數(shù)據(jù),后邊的為從USB設(shè)備接
受的信息。還有1個無符號的長整型變量nOutput,把向?qū)嶒灠灏l(fā)送數(shù)據(jù)的第
一位表示為元件的名稱,從第2位開始為具體的傳輸內(nèi)容,控制相應(yīng)的元件
完成其功能。這里16位字符數(shù)組的第1位為1,即表示控制LED流水燈,
當USB實驗板接受到這樣的16位字符數(shù)組的時候先檢查第1位的數(shù)字,就
知道是要連接到相應(yīng)的設(shè)備來完成響應(yīng)的功能,第2位為變量led即為控制
流水燈的程序。來完成流水燈相應(yīng)的功能。否則如果連接不成功,則在狀態(tài)
顯示編輯框中顯示ERROR:DeviceloControlreturns0
4.3矩陣鍵盤顯示
圖4.2矩陣鍵盤
1、預(yù)計完成的功能
用鼠標點擊矩陣鍵盤中的按鈕,把16個矩陣鍵盤分別定義為16個數(shù),
在USB實驗板數(shù)碼管上會有相應(yīng)的十六進制數(shù)顯示。如點swO按鈕時數(shù)碼管
會顯示0,點swl5按鈕數(shù)碼管會顯示F。界面顯示如圖4.2。
2、完成功能需要編寫的程序
voidCMFCAppDlg::OnswO()
(
sw=0;
Onsw();
)
3、完成功能的思想
首先創(chuàng)建16個按鈕控件,分別把各個按鈕的屬性標題標注為swO到
swl5,然后打開ClassWizard在CMFCAPPDlg類中,按鈕的單擊屬于通告
消息,所以選擇swO的ID號-IDC_BUTTON1(),在右邊的Messages選項中選
擇BN_CLICKED,選擇增加函數(shù)在彈出的對話框中輸入函數(shù)名OnswO,編輯
代碼。在括號中,可以添加相應(yīng)的程序來完成對按鈕的操作⑼。對于swl到
swl5這些按鈕,如同swO按鈕的方法相同。
舉swO這個按鈕為例,當點擊swO按鈕時,程序會自動調(diào)用OnswO這個
函數(shù),這個函數(shù)首先把0賦值給了字符變量sw,然后執(zhí)行Onsw()這個函數(shù)。
當然在程序中需要首先定義字符變量sw,否則程序無法識別swO,會出現(xiàn)錯
誤。
voidCMFCAppDlg::Onsw()
(
charbuff116];
charbufOutput[16J;//Outputfromdevice
ULONGnOutput;
buffI0|=0x02;
buff[l]=sw;
if(!DeviceIoControl(hDevice,
FORUSBJOCTL.Write,
buff,
16,
bufOutput,
0,
&nOutput,
NULL)
)
{
m_Mes="ERROR:DeviceloControlreturns
Upd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東省實驗中學廣州市天河區(qū)附屬實驗學校2021-2022學年八年級下學期期中物理試題(含答案)
- 基層中醫(yī)藥知識培訓課件
- (一模)哈三中2025屆高三第一次模擬考試 英語試題(含答案)
- 物業(yè)管理服務(wù)委托及管理費支付協(xié)議
- 安東尼奇妙的冒險故事讀后感
- 項目執(zhí)行工作計劃書與時間表安排
- 山西省晉中市太谷區(qū)職業(yè)中學校2024-2025學年高一上學期期末考試生物試題
- 企業(yè)文件保密制度表格化處理記錄
- 三農(nóng)問題社會調(diào)查方法與技術(shù)指導書
- 離職員工知識產(chǎn)權(quán)保密協(xié)議
- DB3410T 34-2024特定地域單元生態(tài)產(chǎn)品價值核算規(guī)范
- 無人機操控技術(shù) 課件全套 項目1-6 緒論-無人機自動機場
- 江蘇紅豆實業(yè)股份有限公司償債能力分析
- 青島中石化輸油管道爆炸事故調(diào)查報告
- 2024年蘇州職業(yè)大學高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- 充電樁采購安裝投標方案(技術(shù)方案)
- 教科版小學科學六年級下冊單元練習試題及答案(全冊)
- 《Java程序設(shè)計》電子課件
- 乳腺癌患者的疼痛護理課件
- 研課標說教材修改版 八年級下冊
- 江西宜春城市文化介紹
評論
0/150
提交評論