新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 我學習USB設計的歷程

我學習USB設計的歷程

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


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


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


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


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


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


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


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


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


關鍵詞: USB設計歷

評論


技術專區(qū)

關閉