新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 我學(xué)習(xí)USB設(shè)計(jì)的歷程

我學(xué)習(xí)USB設(shè)計(jì)的歷程

作者: 時(shí)間:2016-12-14 來源:網(wǎng)絡(luò) 收藏
最初想學(xué)習(xí)USB的原因在于當(dāng)時(shí)非常非常想有一臺(tái)通用編程器,商用的編程器雖然功能好,但是價(jià)格昂貴,僅僅為了編程幾種芯片就去買一個(gè)似乎很可惜(我現(xiàn)在已經(jīng)買了編程器了:))。于是想自己做一個(gè)很簡(jiǎn)單的,用串口?并口?一想到要加個(gè)又大又笨的外置電源就不喜歡,用USB,不錯(cuò),有總線供電,這點(diǎn)很吸引人,就是當(dāng)時(shí)我對(duì)USB一竅不通,那就找資料看看吧。


當(dāng)時(shí)USB技術(shù)剛剛興起,USB器件在電子市場(chǎng)上還是很少見,在網(wǎng)上逛了很多天,最后決定用Philips公司的PDIUSBD12作為USB控制器,主要原因是Philips提供的技術(shù)文檔比較詳細(xì)??戳薖hilips公司的相關(guān)資料,似乎硬件電路并不難,于是自己畫了原理圖,檢查了N遍,應(yīng)該沒問題了,然后制PCB,初步硬件調(diào)試,一切都很順利。接下來就是考慮軟件怎么寫。一提到軟件,這下頭大了。看了幾天PDIUSBD12的數(shù)據(jù)手冊(cè),天啊,這么多稀奇古怪的寄存器都是些什么呀,見鬼。看來不了解USB的協(xié)議根本就無法去對(duì)PDIUSBD12進(jìn)行程序設(shè)計(jì)。于是只好去翻USB1.1規(guī)范,那可是200多頁的英文哪,又不是74系列的手冊(cè)那樣幾個(gè)參數(shù)一看就OK了,好在我的專業(yè)英語還不算太差,硬著頭皮看吧。當(dāng)時(shí)看了近一個(gè)月,簡(jiǎn)直象進(jìn)了迷宮一樣,根本搞不清東西南北。當(dāng)時(shí)書店關(guān)于USB的書只有一本國(guó)防科大的USB總線接口開發(fā)指南,買回來回來仔細(xì)一看,天,簡(jiǎn)直是英文USB1.1規(guī)范的中文簡(jiǎn)化版,有些英文的術(shù)語一翻譯過來怎么著看都不舒服,而且省略了很多部分,一樣看的不得其門而入,于是扔掉了書(冤枉國(guó)防科大的這本書了,后來講USB的書滿天飛,我都翻過,不敢說它們都是垃圾,但是我認(rèn)為國(guó)大的書的編者言語之間對(duì)USB確實(shí)還是了解很深的,其他大多數(shù)書的編者/譯者,有的竟然能把pullup resistor of collector翻譯成“向上電阻收集器”,嘿嘿,我就不多說了),繼續(xù)研究E文。當(dāng)時(shí)另外一個(gè)朋友在我的極力鼓吹下也跟我一起沒日沒夜熱情高漲地研究了很多天,可惜后來沒有修成正果:)。當(dāng)時(shí)身邊雖然博士教授們一大堆,可是沒有人研究過USB,只好裝上獵狗的鼻子,去網(wǎng)上四處搜索,倒是有一些線索,可是沒有很有用的。


這時(shí)一個(gè)網(wǎng)友給了我一份傳說是Philips的C51固件代碼,我大喜過望,興沖沖編譯一下,天,無數(shù)的Error。硬著頭皮去改,發(fā)現(xiàn)源文件殘缺不全,注釋也非常的少,一點(diǎn)點(diǎn)地自己摸索著把代碼補(bǔ)上來,這期間我把代碼和USB規(guī)范結(jié)合著看,模模糊糊有些明白了,就這樣磕磕絆絆地又搞了一個(gè)月,熬了無數(shù)通宵,程序終于編譯通過了。當(dāng)我顫抖著手把我的板插上USB電纜的時(shí)候,奇跡竟然出現(xiàn)了,硬盤一陣狂響之后,Windows赫然蹦出一個(gè)發(fā)現(xiàn)新硬件的對(duì)話筐。My God!我成功了也??!歡喜還沒過去,裝上Philips的驅(qū)動(dòng)程序,想看看我的板上的開關(guān)呀、燈呀的動(dòng)一動(dòng),這才發(fā)現(xiàn)我的硬件和Philips的不完全一樣,所以和Philips的應(yīng)用程序不能完全兼容,雖然驅(qū)動(dòng)裝上了,板子上的燈啊、開關(guān)呀卻無法控制??磥淼酶母某绦蛄?。


這一改程序才知道自己現(xiàn)在對(duì)USB協(xié)議不過僅僅是略懂了一些皮毛,當(dāng)按照自己的理解去做了修改以后,PC根本就不能正確識(shí)別出我的設(shè)備。然后我明白,沒有真正理解USB協(xié)議,就不會(huì)真正地寫出自己的程序,更談不上開發(fā)USB接口產(chǎn)品。好在這一段時(shí)間的摸索得到了一些經(jīng)驗(yàn),對(duì)USB也有了一些基本正確的認(rèn)識(shí),精神上受到了一些鼓舞,于是我繼續(xù)研究USB E文規(guī)范。一個(gè)月過去了,又一個(gè)月過去了,我感覺雖然理解了很多了,但是有些關(guān)鍵的地方仍然沒有真正透徹理解,似乎只差薄薄的一層半透明的紙了,只要稍稍有人點(diǎn)撥一下就能頓悟了,可惜仙人沒有出現(xiàn),因此我的程序始終存在問題,此時(shí)我真的有些絕望了,USB開發(fā)暫時(shí)擱置。


不久我到一家公司從事USB方面的工作,接觸到了一種SOC的USB程序設(shè)計(jì)。生存的壓力使我不得不努力去克服對(duì)USB通訊的心理恐懼,仔細(xì)研讀USB協(xié)議,此時(shí)USB的相關(guān)資料也漸漸豐富了,并且現(xiàn)在手邊有了邏輯分析儀、高檔示波器等設(shè)備,我甚至用邏輯分析儀仔細(xì)捕捉過USB通訊的協(xié)議實(shí)現(xiàn)的物理過程,也用Verilog HDL寫過USB host的行為仿真模型提供給FPGA系統(tǒng)模擬。兩個(gè)月以后,我終于對(duì)USB的理解有了質(zhì)的飛躍,對(duì)USB傳輸數(shù)據(jù)流過程已經(jīng)很熟悉,對(duì)那片SOC,我可以僅用不到600字節(jié)的代碼使PC發(fā)現(xiàn)新硬件。


后來我撿起從前的那塊PDIUSBD12 USB板,按照自己對(duì)USB的理解完全重新做了程序設(shè)計(jì),這次非常順利,完成PC主機(jī)對(duì)USB設(shè)備的枚舉過程已經(jīng)是輕松的事情了。但是要完全完成一個(gè)USB設(shè)備的設(shè)計(jì),這只是走過了第一個(gè)階段,下一個(gè)艱苦的過程則是驅(qū)動(dòng)程序的設(shè)計(jì),沒有驅(qū)動(dòng)程序,用PC軟件控制USB設(shè)備根本就是天方夜談。最初我用Windriver做了硬件診斷,一切都OK之后,可以選擇用Windriver生成一個(gè)驅(qū)動(dòng)程序和測(cè)試臺(tái)應(yīng)用程序,但是Windriver的驅(qū)動(dòng)程序安裝方法讓我覺得很別扭,我認(rèn)為一個(gè)可以商用級(jí)的USB設(shè)備不應(yīng)該采用這種方法。另外,Windriver502版本似乎和Xilinx的ISE6.1軟件沖突,ISE安裝過程經(jīng)常藍(lán)屏,而且這個(gè)版本的Windriver在Win2K SP3以上系統(tǒng)中安裝必定會(huì)導(dǎo)致系統(tǒng)黑屏。另外有一個(gè)近于專業(yè)級(jí)的驅(qū)動(dòng)程序開發(fā)工具DriverStudio,我看過一段時(shí)間,感覺它外表和Windows DDK完全不同,但是實(shí)際上它并沒有把DDK做過于嚴(yán)實(shí)的封裝,處處可以看到DDK的影子,掌握DriverStudio其實(shí)也同樣需要對(duì)DDK有較多的理解。我選擇了Windows DDK作為驅(qū)動(dòng)設(shè)計(jì)工具,雖然我還沒有計(jì)劃做一個(gè)專業(yè)級(jí)的驅(qū)動(dòng)程序設(shè)計(jì)者,但是在這方面多做一些深入的理解決沒有壞處。DDK有很多驅(qū)動(dòng)程序的例子,其中有一個(gè)bulkusb的例子,仔細(xì)看過之后,其實(shí)把它修改一下就可以變成自己設(shè)備的驅(qū)動(dòng),這也正是Microsoft推薦驅(qū)動(dòng)設(shè)計(jì)者開發(fā)設(shè)備驅(qū)動(dòng)程序的方法。DDK確實(shí)過于博大精深,我想,能夠達(dá)到自己的設(shè)備驅(qū)動(dòng)可以正常工作這個(gè)目的就可以了,沒有必要搞清楚驅(qū)動(dòng)程序設(shè)計(jì)中的每一個(gè)細(xì)節(jié)。當(dāng)時(shí)我也曾經(jīng)花了很大的力氣才終于達(dá)到這個(gè)目的,其中的艱難到讀者自己去經(jīng)歷的時(shí)候就能夠體會(huì)了(你可能會(huì)把Microsoft號(hào)稱非常穩(wěn)定的Win2K整的死去活來:))。好,現(xiàn)在是最后一個(gè)階段了:設(shè)計(jì)應(yīng)用程序。這個(gè)應(yīng)該是整個(gè)設(shè)計(jì)中最輕松的階段了,通過驅(qū)動(dòng)程序控制硬件設(shè)備,VC++是很好的工具,當(dāng)然這個(gè)并不是每個(gè)人都必然的選擇。當(dāng)寫完最后一句代碼,運(yùn)行程序,看到設(shè)備在鼠標(biāo)鍵盤點(diǎn)動(dòng)之間隨心所欲受你的控制的時(shí)候,那種令人飄然的成就感真的是難以形容。


現(xiàn)在,帶USB接口的器件很多了,而且有很多已經(jīng)是USB2.0 High speed設(shè)備了。我有幸見識(shí)了許多USB器件的應(yīng)用,感覺不論是USB full speed還是High speed,也不管這個(gè)器件到底只是一個(gè)USB控制器還是復(fù)雜的SOC,USB通訊部分其實(shí)大家都是大同小異的?,F(xiàn)在USB OTG技術(shù)經(jīng)過幾年有些沉默的發(fā)展之后終于柳暗花明,開發(fā)USB OTG設(shè)備應(yīng)該是USB通訊技術(shù)下一階段的熱點(diǎn)。其間還曾出現(xiàn)了一類USB Host器件,算是彌補(bǔ)USB1.1和USB OTG之間暫時(shí)的空白吧。


也許我悟性太差,學(xué)習(xí)USB的歷程真的是非常艱難,還有許多朋友也許會(huì)有和我一樣的痛苦,我把自己的USB學(xué)習(xí)經(jīng)歷寫出來,希望能夠給后來者一些有益的啟示,同時(shí)也希望能夠給大家一些鼓舞:再大的困難,只要肯努力,也是能夠克服的;USB通訊完全不同RS232,要能夠硬著頭皮看E文,要有懂USB的朋友指點(diǎn),要有很好的參考代碼,要自己肯動(dòng)腦筋去思考,要有強(qiáng)烈的興趣和恒心,這樣的話,即使時(shí)間稍長(zhǎng)一點(diǎn),最終你也是能掌握USB的。


我不希望我的經(jīng)歷讓想學(xué)習(xí)USB的朋友感到恐怖,在你學(xué)習(xí)USB之前,先要給自己定一個(gè)將要達(dá)到的標(biāo)準(zhǔn):如果你希望自己能夠完全掌握USB通訊技術(shù),達(dá)到能夠設(shè)計(jì)USB physical和SIE部分的水平,那麼這就是USB硬件設(shè)計(jì)的至高境界了,不過只有IC設(shè)計(jì)公司集中若干人力花費(fèi)若干年時(shí)間投入若干經(jīng)費(fèi)才能夠做得了的。如果你想掌握硬固件編程、驅(qū)動(dòng)程序設(shè)計(jì),那么你需要準(zhǔn)備吃點(diǎn)苦;如果你不需要關(guān)心USB通訊的具體過程,只是固件應(yīng)用中和底層簡(jiǎn)單的進(jìn)行數(shù)據(jù)交換,或者是PC應(yīng)用程序設(shè)計(jì),呵呵,恭喜了,你會(huì)發(fā)現(xiàn)USB通訊其實(shí)很簡(jiǎn)單。


關(guān)鍵詞: USB設(shè)計(jì)歷

評(píng)論


技術(shù)專區(qū)

關(guān)閉