官术网_书友最值得收藏!

第2章 我們需要做什么

前面已經(jīng)初步介紹了USB的基礎(chǔ)知識(shí),是時(shí)候開始著手USB設(shè)備開發(fā)了。我們先來看看完整開發(fā)一個(gè)USB設(shè)備需要做些什么,這有助于從宏觀上建立USB設(shè)備開發(fā)的概念,如圖2.1所示。

圖2.1 完整的USB設(shè)備開發(fā)流程

USB設(shè)備開發(fā)的首要步驟便是對(duì)系統(tǒng)需求進(jìn)行分析,它的目的就是解決這樣一個(gè)問題:你打算采用什么方案來開發(fā)USB設(shè)備呢?不同方案的實(shí)現(xiàn),其復(fù)雜程度與開發(fā)周期會(huì)完全不一樣,這需要結(jié)合自己的項(xiàng)目來決定,包括設(shè)備類型、功能、數(shù)據(jù)傳輸類型與速率、硬件資源、成本、功耗等。

既然是進(jìn)行USB設(shè)備的開發(fā),必然最終會(huì)有一個(gè)能夠拿在手里(實(shí)實(shí)在在)的東西,這就屬于硬件范疇。例如,USB鼠標(biāo)內(nèi)部通常會(huì)有印制電路板模塊(Printed Circuit Board Assembly, PCBA),上面安裝了一些“采集滾輪位置與輕觸按鍵狀態(tài)信息并發(fā)送到主機(jī)”的電路,也就是我們討論的硬件,而系統(tǒng)需求分析的最后落點(diǎn)就在于USB接口芯片的選型

現(xiàn)如今市面上的USB接口芯片總體上可以分為單純的USB接口芯片帶USB接口的單片機(jī)兩大類,它們?cè)谟布用娴膮^(qū)別如圖2.2所示。

圖2.2 兩種USB接口芯片在硬件層面的區(qū)別

單純的USB接口芯片只負(fù)責(zé)與USB主機(jī)進(jìn)行通信,通常僅包含直接與外部電信號(hào)打交道的物理層(Physical Layer, PHY),以及處理底層USB協(xié)議的單元,所以還需要另一個(gè)處理器實(shí)現(xiàn)其他更高層面的協(xié)議處理與數(shù)據(jù)交換,如菲利浦公司(Philips)生產(chǎn)的PDIUSBD12芯片(現(xiàn)已停產(chǎn))。這類芯片提供了一些接口供處理器進(jìn)行控制,不同廠商的USB接口芯片在USB協(xié)議上會(huì)有著不同程度的支持。所謂的“支持”,是指USB協(xié)議由軟件還是硬件來實(shí)現(xiàn),因?yàn)閁SB協(xié)議在邏輯上分為很多層,具體的實(shí)現(xiàn)方法可以是硬件或軟件。接口芯片的硬件實(shí)現(xiàn)層面越多,成本越高,但速度會(huì)更快,軟件編程方面也會(huì)更簡(jiǎn)單。帶USB接口的單片機(jī)則將USB接口芯片集成到了單片機(jī)中,將其作為一個(gè)USB控制器掛在內(nèi)部總線,這樣我們就可以像訪問單片機(jī)中其他諸如SPI(Serial Peripheral Interface)、I2C(Inter-Integrated Circuit)等總線控制器一樣,只需要訪問為其分配的一些寄存器或緩沖區(qū)即可,是不是很簡(jiǎn)單!相應(yīng)的典型芯片是由賽普拉斯公司(Cypress)生產(chǎn)的基于51內(nèi)核的CY7C68013。簡(jiǎn)單地說,帶USB接口的單片機(jī)屬于單芯片解決方案。

那么實(shí)際進(jìn)行USB設(shè)備應(yīng)用開發(fā)時(shí)選擇哪種好一些呢?主要考慮因素還是成本單純的USB接口芯片成本低,接口使用也方便,即使現(xiàn)有產(chǎn)品需要重新設(shè)計(jì)時(shí)也不需要做很大的改變,非常有利于整合與重用現(xiàn)有資源。例如,你們公司所有產(chǎn)品如果都在使用某幾款基于51內(nèi)核的單片機(jī),那么在進(jìn)行新的USB設(shè)備開發(fā)時(shí),肯定也希望能夠重用它們,這樣有利于共享其他資源,而且開發(fā)工程師對(duì)相應(yīng)單片機(jī)已經(jīng)非常熟悉,也就能夠縮短開發(fā)周期,提前一步將產(chǎn)品推出去,這些都有利于降低成本。帶USB控制器的單片機(jī)的優(yōu)勢(shì)當(dāng)然是更簡(jiǎn)單,但它不一定與你們公司現(xiàn)有的單片機(jī)內(nèi)核相同,開發(fā)者可能需要重新學(xué)習(xí)。更重要的是,如果某一天需要切換到另一款帶USB控制器的單片機(jī)更是困難,源碼移植可得費(fèi)不少工夫。如果采用單純的USB接口芯片,則沒有這個(gè)問題,USB接口芯片即使進(jìn)行了更換,單片機(jī)源代碼只需要修改與USB接口芯片通信的那部分即可。

本書為了闡述的方便,決定采用帶USB控制器的單片機(jī),即基于ARM 32位Cortex-M3內(nèi)核的STM32F103C8T6單片機(jī),它集成了USB 2.0全速控制器。需要特別注意的是:本書雖然使用STM32F103C8T6作為闡述平臺(tái),但并沒有對(duì)與USB控制器無關(guān)的其他模塊進(jìn)行深入探討,因?yàn)楸緯荚谠敱M闡述USB設(shè)備的開發(fā)思路及透徹理解USB 2.0規(guī)范,這對(duì)于所有平臺(tái)都是通用的。換句話說,只要你需要學(xué)習(xí)USB設(shè)備開發(fā),無論使用的單片機(jī)型號(hào)與本書是否相同(包括其他廠商帶USB控制器的單片機(jī),或單純的USB接口芯片),本書所述內(nèi)容對(duì)你都是適用的。

USB接口芯片選型完成后,就開始進(jìn)入U(xiǎn)SB設(shè)備的硬件設(shè)計(jì)環(huán)節(jié),包括原理圖與PCB設(shè)計(jì)、PCB制造、元器件采購(gòu)及焊接調(diào)試等步驟,如圖2.3所示。值得一提的是,現(xiàn)如今網(wǎng)絡(luò)電商已經(jīng)非常發(fā)達(dá)了,不僅僅是元器件采購(gòu),即使是PCB制造也能夠輕松找到PCB廠商,我們只需要到相應(yīng)的官方網(wǎng)站自助上傳PCB生產(chǎn)文件(通常是PCB光繪文件)下單,再等待比較短的周期就能夠(通過快遞方式)收到制作完成的高質(zhì)量PCB,跟以前在學(xué)校使用機(jī)器手工制作單面PCB相比,實(shí)在是太方便了。

圖2.3 USB設(shè)備的硬件設(shè)計(jì)

USB設(shè)備的硬件設(shè)計(jì)完成之后,就得著手USB設(shè)備的軟件設(shè)計(jì)了,我們將最終下載(也常稱為“燒寫”或“編程”)到單片機(jī)內(nèi)部只讀存儲(chǔ)器(Read-Only Memory, ROM)的程序稱為固件(Firmware),它是USB設(shè)備的核心,通常總是會(huì)完成至少一個(gè)功能。例如,對(duì)于USB鼠標(biāo)設(shè)備,固件的作用是采集用戶的操作信息并將其上傳到主機(jī)。對(duì)于使用USB接口的邏輯分析儀,固件的作用是根據(jù)主機(jī)設(shè)置的數(shù)據(jù)采集參數(shù),將采集到的參數(shù)回傳給主機(jī)。為了區(qū)別于主機(jī)端的軟件設(shè)計(jì),我們稱為USB設(shè)備的固件設(shè)計(jì)

一般說來,硬件方案確定之后,相應(yīng)USB設(shè)備的開發(fā)環(huán)境也就基本確定了。為什么這樣說呢?因?yàn)樾酒闹圃鞆S商并不單純地制造出芯片就完事了,為了讓客戶更容易地使用而達(dá)到快速占領(lǐng)市場(chǎng)的目的,總會(huì)有單獨(dú)的部門進(jìn)行演示板(Demonstration, DEMO)或評(píng)估板(Evaluation Board, EVB)的設(shè)計(jì)與開發(fā),筆者曾經(jīng)入職過的某集成電路設(shè)計(jì)公司的客戶服務(wù)(Customer Service,CS)部門就是做這種事情的。簡(jiǎn)單地說,評(píng)估板存在的意義就是將廠商制造該芯片的市場(chǎng)戰(zhàn)略意圖表達(dá)出來,它通常包含相關(guān)的硬件原理圖、PCB文件、物料清單(Bill of Material, BOM)、數(shù)據(jù)手冊(cè)(Datasheet)、設(shè)計(jì)說明書及必要的軟件例程等。通俗地說,評(píng)估板就是想告訴你:我這個(gè)芯片可以做什么?如果你要快速使用它,應(yīng)該怎么做?

評(píng)估板在芯片推廣過程中扮演了非常重要的角色,它不僅存在于很多簡(jiǎn)單的純硬件類芯片中,對(duì)于稍顯復(fù)雜(或需要單片機(jī)控制)的芯片更是如此,USB接口芯片的底層還是有些復(fù)雜的,所以相應(yīng)的芯片廠商必然會(huì)準(zhǔn)備好配套的評(píng)估板。

當(dāng)我們開始設(shè)計(jì)USB設(shè)備固件時(shí),一般都會(huì)直接參考廠商發(fā)布的固件例程。例如,將相關(guān)源代碼復(fù)制到自己原來產(chǎn)品的工程目錄下。當(dāng)然,也有更直接的方式:直接在廠商發(fā)布例程的基礎(chǔ)上更改!有些人可能會(huì)想:這也太沒有技術(shù)含量了吧?我要重新編寫固件來體現(xiàn)自己非凡的技術(shù)水平!行,你想這么做我當(dāng)然不會(huì)阻止,但你的老板肯定不會(huì)答應(yīng),既然有現(xiàn)成且經(jīng)過驗(yàn)證的成熟案例參考,為什么還要自己重新編寫呢?在這方面,我還是跟你的老板站在同一戰(zhàn)線的,因?yàn)樾酒瑥S商肯定對(duì)自己的產(chǎn)品理解更深刻,發(fā)布的例程相對(duì)而言會(huì)更穩(wěn)定。在極端情況下,芯片本身可能存在一些設(shè)計(jì)缺陷,需要在固件層面進(jìn)行彌補(bǔ),這種情況我們通常是無法知道的。有些芯片廠商會(huì)針對(duì)內(nèi)部與外部(客戶)開放兩套數(shù)據(jù)手冊(cè)(披露的細(xì)節(jié)不一樣),所以我勸你還是別打“重新設(shè)計(jì)固件”的主意了!

對(duì)于有些USB設(shè)備,設(shè)計(jì)完硬件電路與設(shè)備固件后,整個(gè)USB設(shè)備開發(fā)流程可以算是完成了。有些人會(huì)想:好像不對(duì)吧!不是聽說還要開發(fā)主機(jī)端的設(shè)備驅(qū)動(dòng)程序應(yīng)用程序嗎?這里可以回復(fù):它們并不是必需的步驟!當(dāng)你購(gòu)買USB鼠標(biāo)或鍵盤時(shí),恐怕很少聽說還要安裝驅(qū)動(dòng)或應(yīng)用程序吧!換句話說,是否需要設(shè)計(jì)USB主機(jī)端的設(shè)備驅(qū)動(dòng)程序與應(yīng)用程序,取決于你開發(fā)的USB設(shè)備的具體功能。Windows操作系統(tǒng)為了方便用戶使用USB總線與主機(jī)進(jìn)行通信,已經(jīng)提供了很多USB標(biāo)準(zhǔn)設(shè)備類驅(qū)動(dòng)程序,如果你開發(fā)的USB設(shè)備符合某一種標(biāo)準(zhǔn)設(shè)備類,那么設(shè)備驅(qū)動(dòng)程序的開發(fā)并不是必需的。例如,USB鼠標(biāo)與鍵盤就不需要開發(fā)驅(qū)動(dòng)程序與應(yīng)用程序,因?yàn)樗鼈兪前凑找欢ǖ囊?guī)范(格式)向主機(jī)傳遞數(shù)據(jù)的,操作系統(tǒng)有能力進(jìn)行適當(dāng)?shù)慕馕觥?/p>

當(dāng)然,是否需要開發(fā)設(shè)備驅(qū)動(dòng)程序,還取決于選擇的開發(fā)方式,即使兩個(gè)USB設(shè)備的功能完全一樣,你可以選擇按某類標(biāo)準(zhǔn)設(shè)備進(jìn)行開發(fā),也可以自行開發(fā)設(shè)備驅(qū)動(dòng)程序。選擇前者就意味著不需要單獨(dú)開發(fā)設(shè)備驅(qū)動(dòng)程序(甚至應(yīng)用程序),帶來的好處就是開發(fā)流程簡(jiǎn)潔且周期短,大多數(shù)簡(jiǎn)單的USB設(shè)備都可以這么做,而缺點(diǎn)在于無法最大限度地挖掘USB設(shè)備的潛力。換句話說,USB主機(jī)只能以一定有限的能力與USB設(shè)備打交道。如果你對(duì)USB設(shè)備開發(fā)已經(jīng)非常熟悉了,開發(fā)周期對(duì)你來說也完全不是事,而且對(duì)USB設(shè)備要求比較高,那么你也可以選擇自行開發(fā)設(shè)備驅(qū)動(dòng)程序。

設(shè)備驅(qū)動(dòng)程序的具體開發(fā)形式也有幾種,Windows 2000/XP/2003平臺(tái)采用Windows驅(qū)動(dòng)模型(Windows Driver Model, WDM),使用相應(yīng)的驅(qū)動(dòng)程序開發(fā)包(Driver Developer Kit, DDK)是開發(fā)方式之一,但是它對(duì)開發(fā)者要求比較高,可以理解為專門開發(fā)驅(qū)動(dòng)的工程師采用的方式(簡(jiǎn)單地說,開發(fā)難度大)。為了簡(jiǎn)化驅(qū)動(dòng)程序的開發(fā),康博(Compuware)公司開發(fā)的DriverStudio軟件平臺(tái)對(duì)DDK進(jìn)行了封裝,使用起來更加方便,減少了開發(fā)時(shí)間,曾一度成為設(shè)備驅(qū)動(dòng)程序的主流開發(fā)方式之一。后來,微軟對(duì)WDM進(jìn)行了優(yōu)化,推出了全新的Windows驅(qū)動(dòng)框架(Windows Driver Foundation, WDF),并提供相應(yīng)的驅(qū)動(dòng)開發(fā)包(Windows Driver Kit, WDK),它提供了面向?qū)ο蠛褪录?qū)動(dòng)的驅(qū)動(dòng)程序開發(fā)框架,大大降低了開發(fā)難度,也直接導(dǎo)致了DriverStudio軟件平臺(tái)退出了歷史舞臺(tái)(不再支持最新的操作系統(tǒng)),掌握Windows設(shè)備驅(qū)動(dòng)程序的開發(fā)人員,由過去的“專業(yè)”人士變?yōu)椤捌胀ā贝蟊姟?/p>

隨著時(shí)代的快速發(fā)展,設(shè)備驅(qū)動(dòng)程序的開發(fā)也已經(jīng)變得更加簡(jiǎn)單了,即使我們不編寫任何一行核心驅(qū)動(dòng)程序代碼,也能夠輕松訪問操作系統(tǒng)上的任意一個(gè)USB設(shè)備,只需要安裝USB通用設(shè)備驅(qū)動(dòng)程序即可,WinUSB與LibUSB就是目前應(yīng)用廣泛的兩種,前者由微軟提供且僅適用于Windows操作系統(tǒng),后者則適用于包含Windows在內(nèi)的多種操作系統(tǒng),也是本書重點(diǎn)討論的對(duì)象。

如果實(shí)在有必要,可能還需要開發(fā)與USB設(shè)備配套的應(yīng)用程序,你可以將其理解為“能夠進(jìn)行數(shù)據(jù)分析、展示、控制等功能”的窗口界面(當(dāng)然,也可以沒有窗口界面)。如果你的USB設(shè)備不需要這樣的功能,那就不需要做什么。例如,USB鼠標(biāo)就不需要開發(fā)對(duì)應(yīng)的應(yīng)用程序,我們直接將其插入主機(jī)的USB接口就可以使用。而很多諸如邏輯分析儀、示波器等USB設(shè)備還會(huì)配帶相應(yīng)的應(yīng)用程序,設(shè)備采集完數(shù)據(jù)發(fā)送到主機(jī)之后,還需要配套的應(yīng)用程序進(jìn)行數(shù)據(jù)分析并以圖形的方式展示出來方便觀察,此時(shí)應(yīng)用程序設(shè)計(jì)就是必需的步驟。換句話說,如果USB設(shè)備往主機(jī)傳輸?shù)臄?shù)據(jù)需要特定應(yīng)用程序去解析,通常就需要進(jìn)行應(yīng)用程序的設(shè)計(jì)。

使用成熟的框架是Windows應(yīng)用程序的主要開發(fā)手段,比較常用的有MFC(Microsoft Foundation Class,微軟基礎(chǔ)類庫(kù))、.NET與QT。其中,MFC與.NET是微軟提供的框架(相應(yīng)的開發(fā)工具為Microsoft Visual Studio),后者更是微軟當(dāng)前主推的框架,QT是一個(gè)跨平臺(tái)的C++圖形用戶界面應(yīng)用程序開發(fā)框架。本書決定選擇MFC,因?yàn)槠湎嚓P(guān)學(xué)習(xí)資料很豐富,非常有利于初學(xué)者快速定位開發(fā)過程中的問題所在。當(dāng)然,你并不需要對(duì)MFC很熟悉,我們只會(huì)使用向?qū)?chuàng)建一個(gè)對(duì)話框應(yīng)用程序,并在其中編寫一些用來訪問USB設(shè)備的簡(jiǎn)單源代碼。你也可以根據(jù)自身的知識(shí)儲(chǔ)備選擇其他熟悉的框架,只要在Windows平臺(tái)下進(jìn)行USB主機(jī)應(yīng)用程序的開發(fā),不同開發(fā)框架的選擇對(duì)理解相關(guān)內(nèi)容并沒有影響,關(guān)鍵在于掌握Windows平臺(tái)下訪問USB設(shè)備的基本原理

主站蜘蛛池模板: 繁峙县| 梅州市| 娄烦县| 乌审旗| 乐陵市| 教育| 明星| 黄平县| 土默特左旗| 新巴尔虎左旗| 鄯善县| 南昌县| 西吉县| 南平市| 通榆县| 古浪县| 芮城县| 神农架林区| 驻马店市| 西和县| 越西县| 林周县| 健康| 岳阳县| 临颍县| 潮州市| 建阳市| 泰来县| 同心县| 琼海市| 方山县| 团风县| 龙州县| 绥化市| 延川县| 哈密市| 荥经县| 海宁市| 青神县| 邹城市| 新建县|