<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > USB在同步相量測(cè)量單元中的應(yīng)用

          USB在同步相量測(cè)量單元中的應(yīng)用

          作者: 時(shí)間:2017-02-27 來(lái)源:網(wǎng)絡(luò) 收藏

            4.6 標(biāo)準(zhǔn)請(qǐng)求處理程序

            標(biāo)準(zhǔn)設(shè)備請(qǐng)求是由USB協(xié)議決定的,由主機(jī)發(fā)出,以數(shù)據(jù)包的形式傳送到單片機(jī)。當(dāng)單片機(jī)接收到這些標(biāo)準(zhǔn)設(shè)備請(qǐng)求時(shí)就轉(zhuǎn)入相應(yīng)的處理程序。其過(guò)程包括:①獲取狀態(tài)。②清除特性。③設(shè)置特性。④設(shè)置地址。⑤獲取設(shè)備描述符。⑥設(shè)置配置。⑦獲取配置信息。⑧獲取接口信息。⑨設(shè)置接口。⑩同步幀。其中同步幀用來(lái)設(shè)置和報(bào)告一個(gè)端點(diǎn)的同步幀,在同步傳輸中才使用,如果設(shè)備不支持這個(gè)請(qǐng)求,返回停止標(biāo)志。

            4.7 主循環(huán)程序

            主循環(huán)程序主要功能是設(shè)置單片機(jī)的初始化,以及設(shè)定各個(gè)相關(guān)子程序的入口。由于使用了中斷服務(wù)程序和一系列的命令接口子程序,主循環(huán)程序中涉及USB接口的部分只是設(shè)定相關(guān)的寄存器。

            5 USB驅(qū)動(dòng)程序上位機(jī)部分

            5.1 驅(qū)動(dòng)程序基本概念

            主機(jī)驅(qū)動(dòng)程序的功能是將硬件與用戶(hù)應(yīng)用程序連接起來(lái)。編寫(xiě)的方法有多種,可以直接與硬件相連接,在應(yīng)用程序中直接讀寫(xiě)系統(tǒng)應(yīng)將,或者將與硬件直接交換數(shù)據(jù)的底層工作交給操作系統(tǒng)自動(dòng)完成,應(yīng)用程序象讀寫(xiě)普通文件一樣完成對(duì)硬件設(shè)備的操作。前一種方法的代碼開(kāi)銷(xiāo)少,但是編寫(xiě)的工作量非常大,移植性也較差。后一種方法需要大量庫(kù)函數(shù)支持,但編寫(xiě)較為簡(jiǎn)單,且移植性好,甚至只需少許修改就可以完成對(duì)另一種硬件的支持。在本系統(tǒng)中使用的是由廠商提供的驅(qū)動(dòng)程序,為了充分說(shuō)明USB系統(tǒng)的工作,還是有必要對(duì)主機(jī)驅(qū)動(dòng)程序的工作方式做一個(gè)介紹。

            從驅(qū)動(dòng)程序的角度出發(fā),每個(gè)設(shè)備都被看成若干個(gè)設(shè)備對(duì)象,這些設(shè)備對(duì)象的來(lái)歷各不相同,每個(gè)對(duì)象都有驅(qū)動(dòng)程序與之對(duì)應(yīng)。它們根據(jù)一定的規(guī)則組成設(shè)備對(duì)象堆棧,也就是對(duì)應(yīng)的驅(qū)動(dòng)程序堆棧。處于最底層的是物理設(shè)備對(duì)象,它一般由總線(xiàn)生成,驅(qū)動(dòng)程序到達(dá)這里的時(shí)候,總線(xiàn)只是按照標(biāo)準(zhǔn)作一些動(dòng)作,即可完成對(duì)設(shè)備物理上的操作。一個(gè)設(shè)備只能有一個(gè)物理設(shè)備對(duì)象,但可以有若干個(gè)其它的設(shè)備對(duì)象。功能設(shè)備對(duì)象是由所編寫(xiě)的驅(qū)動(dòng)程序生成的,它負(fù)責(zé)從邏輯上操作設(shè)備。其它的層次設(shè)備對(duì)象可以處于功能設(shè)備對(duì)象的上面或下面,它由另一些驅(qū)動(dòng)程序或者其它的系統(tǒng)組件生成,可以記錄一些設(shè)備信息,但層次設(shè)備對(duì)象不是必須的。由于驅(qū)動(dòng)程序的這種層次結(jié)構(gòu),在編寫(xiě)驅(qū)動(dòng)程序的時(shí)候不必考慮內(nèi)存分配、IO端口配置、DMA申請(qǐng)等。Windows將資源申請(qǐng)全部自動(dòng)化,由總線(xiàn)完成,編寫(xiě)驅(qū)動(dòng)程序時(shí)只要考慮控制設(shè)備本身即可。

            5.2 即插即用設(shè)備狀態(tài)及它們之間的轉(zhuǎn)換

            USB接口設(shè)備的一個(gè)顯著特點(diǎn)就是接入或者拔出時(shí)不需要關(guān)閉主機(jī)和重新啟動(dòng)系統(tǒng),而是可以在系統(tǒng)運(yùn)行時(shí)直接插入或者拔出。這與USB接口的硬件設(shè)置有關(guān),USB接口是通過(guò)檢測(cè)接口上拉電阻來(lái)判別是否有設(shè)備存在的。當(dāng)然,還必須有相應(yīng)的驅(qū)動(dòng)程序來(lái)完成對(duì)此功能的支持。下面就將簡(jiǎn)要描述一個(gè)設(shè)備完成即插即用的過(guò)程。

            用戶(hù)將設(shè)備插入計(jì)算機(jī),此時(shí)設(shè)備還沒(méi)有被系統(tǒng)檢測(cè)到。要開(kāi)始對(duì)設(shè)備進(jìn)行軟件配置,必須由即插即用管理器以及總線(xiàn)驅(qū)動(dòng)對(duì)設(shè)備進(jìn)行枚舉。即插即用管理器,有時(shí)還可能要在用戶(hù)模式下的組件工作,檢測(cè)出設(shè)備的驅(qū)動(dòng)程序,包括功能驅(qū)動(dòng)程序以及其它的層次驅(qū)動(dòng)程序。如果此時(shí)驅(qū)動(dòng)程序尚未調(diào)入,則即插即用管理器調(diào)用設(shè)備插入例程。驅(qū)動(dòng)程序完成初始化之后,接著必須對(duì)設(shè)備進(jìn)行初始化。即插即用管理器調(diào)用驅(qū)動(dòng)程序中添加設(shè)備的例程來(lái)初始化該驅(qū)動(dòng)程序控制的每個(gè)設(shè)備。當(dāng)一個(gè)驅(qū)動(dòng)程序從即插即用管理器中收到開(kāi)始設(shè)備的請(qǐng)求時(shí),驅(qū)動(dòng)程序使設(shè)備啟動(dòng)并且做好處理IO操作。在Windows2000及更高版本的操作系統(tǒng)中,和停止有關(guān)的請(qǐng)求只有在重新分配硬件資源的時(shí)候才會(huì)使用。意外卸載時(shí)是指硬件在物理上被卸載(熱拔出),驅(qū)動(dòng)程序處理這個(gè)請(qǐng)求使系統(tǒng)的損失盡可能降低。硬件卸載時(shí),調(diào)用相應(yīng)的卸載請(qǐng)求,使得該設(shè)備在軟件上也不可用。如果不對(duì)意外卸載進(jìn)行處理,就有可能造成硬件在物理意義上已不存在,但在系統(tǒng)邏輯中依然存在,造成系統(tǒng)訪問(wèn)該設(shè)備的時(shí)候出現(xiàn)錯(cuò)誤,嚴(yán)重的情況可能會(huì)造成處理器進(jìn)入死循環(huán)。當(dāng)在軟件意義上對(duì)設(shè)備進(jìn)行停止時(shí),需要等其它請(qǐng)求都操作完畢后才能進(jìn)行。

            5.3 驅(qū)動(dòng)程序結(jié)構(gòu)

            USB驅(qū)動(dòng)程序從結(jié)構(gòu)上可以分成兩大部分,驅(qū)動(dòng)程序入口以及處理各個(gè)事件的例程。驅(qū)動(dòng)程序入口是由系統(tǒng)定義的一組常數(shù),該部分主要完成兩件工作:一件是將注冊(cè)表項(xiàng)復(fù)制到一個(gè)全局變量中;另一件是給不同的設(shè)備事件指示處理例程。剩下的工作就是按照這些設(shè)備事件編寫(xiě)各自的例程。這些設(shè)備事件主要包括下面幾個(gè)部分:

            (1)打開(kāi)文件:當(dāng)用戶(hù)以打開(kāi)文件的名義打開(kāi)設(shè)備準(zhǔn)備讀寫(xiě)的時(shí)候,調(diào)用該部分例程進(jìn)行準(zhǔn)備。

            (2)關(guān)閉文件:當(dāng)用戶(hù)關(guān)閉文件(關(guān)閉設(shè)備)的時(shí)候,調(diào)用該例程清掃系統(tǒng)。

            (3)即插即用處理:處理即插即用相關(guān)的事件,該部分例程包括許多硬件相關(guān)的子程序,具體功能見(jiàn)第2節(jié)。

            (4)處理讀操作:當(dāng)用戶(hù)讀取文件時(shí),調(diào)用該例程將接口芯片緩沖區(qū)內(nèi)的信息返回主機(jī)。

            (5)處理寫(xiě)操作:當(dāng)用戶(hù)寫(xiě)文件時(shí),調(diào)用該例程將數(shù)據(jù)以包的形式發(fā)送到接口芯片。

            (6)設(shè)備操作:該部分例程完成對(duì)設(shè)備硬件的控制,一般含有IO控制碼,這些控制碼在用戶(hù)頭文件中定義,該例程根據(jù)不同的IO控制碼,完成對(duì)設(shè)備的各項(xiàng)控制任務(wù)。

            (7)驅(qū)動(dòng)程序初始化:當(dāng)?shù)谝淮伟惭b硬件時(shí)調(diào)用該部分例程,創(chuàng)建物理設(shè)備對(duì)象。對(duì)所涉及的各個(gè)變量進(jìn)行初始化。這部分程序一般操作系統(tǒng)中有自帶。

            (8)驅(qū)動(dòng)程序的卸載:用于清除硬件在系統(tǒng)中留下的痕跡,釋放全局變量中注冊(cè)表路徑字符串所占用的內(nèi)存,將資源歸還系統(tǒng)。

            (9)電源管理:所有和電源相關(guān)的例程都由這里發(fā)出,它發(fā)出的請(qǐng)求可以是指定一種新的電源狀態(tài),或者查詢(xún)更改一種狀態(tài)是否可靠。此部分對(duì)于總線(xiàn)供電的USB設(shè)備較為重要,涉及設(shè)備的掛起和喚醒等操作。在本系統(tǒng)中此部分無(wú)作用,所有下位機(jī)設(shè)備都是自供電形式的,設(shè)備處于長(zhǎng)時(shí)工作狀態(tài)。

            5.4 USB設(shè)備讀寫(xiě)

            USB設(shè)備的讀寫(xiě)操作是大部分用戶(hù)主要關(guān)心的內(nèi)容。由于設(shè)備驅(qū)動(dòng)程序的作用,用戶(hù)應(yīng)用程序和USB設(shè)備的讀寫(xiě)操作變的非常簡(jiǎn)單,用戶(hù)打開(kāi)USB設(shè)備就像打開(kāi)文件一樣。這是在添加設(shè)備中申請(qǐng)了一個(gè)符號(hào)鏈接,并在啟動(dòng)設(shè)備例程中將此鏈接激活而實(shí)現(xiàn)的。USB中的讀寫(xiě)操作分為四種:

            (1)控制型:控制型傳輸主要為對(duì)USB本身的配置,前面所描述的USB配置實(shí)際上都是通過(guò)控制傳輸實(shí)現(xiàn)的。

            (2)批量型:批量型傳輸用來(lái)處理大量的對(duì)時(shí)間要求不緊迫的數(shù)據(jù)。底層協(xié)議保證了無(wú)差錯(cuò)的傳輸,但不保證傳輸時(shí)延。

            (3)中斷型:中斷型傳輸對(duì)服務(wù)時(shí)間有較強(qiáng)的限制,但一次傳輸?shù)臄?shù)據(jù)量不多,主要為一些需要實(shí)時(shí)相應(yīng)的消息。

            (4)同步型:同步傳輸可以保證傳輸時(shí)延、保證帶寬和保證恒定的數(shù)據(jù)傳輸速率,但是在傳送失敗的情況下。不使用“重試”來(lái)傳輸數(shù)據(jù),因而可能會(huì)有一定的出錯(cuò)概率。

            對(duì)USB接口的讀寫(xiě)是按照與數(shù)據(jù)文件讀寫(xiě)相同的方式進(jìn)行的,第一步要打開(kāi)文件,即打開(kāi)設(shè)備。當(dāng)用戶(hù)以打開(kāi)文件的名義打開(kāi)設(shè)備時(shí),首先要檢查設(shè)備的狀態(tài),看設(shè)備是否處于工作狀態(tài),設(shè)備的接口信息是否已經(jīng)準(zhǔn)備好。接著檢查從上面?zhèn)飨聛?lái)的文件對(duì)象的合法性(指針不為空)。然后檢查文件名的長(zhǎng)度,當(dāng)為0時(shí),說(shuō)明打開(kāi)的只是設(shè)備本身;不為0時(shí)說(shuō)明打開(kāi)的是某個(gè)管道,調(diào)用管道相關(guān)例程,將管道明轉(zhuǎn)換為指向?qū)?yīng)管道綜合信息的指針即可。讀寫(xiě)USB設(shè)備實(shí)際上是調(diào)用同一個(gè)傳輸例程的,所區(qū)別的是傳輸方向符不同,由于通訊雙方遵守的都是USB協(xié)議,所有的數(shù)據(jù)包的格式都是一致的,所以這沒(méi)有什么問(wèn)題。驅(qū)動(dòng)程序控制的上位機(jī)讀寫(xiě)過(guò)程和單片機(jī)的情況類(lèi)似,所不同的是,單片機(jī)使用的接口芯片將數(shù)據(jù)放入硬件緩沖區(qū)內(nèi),而上位機(jī)的驅(qū)動(dòng)程序則會(huì)構(gòu)建一個(gè)虛擬的緩沖區(qū)來(lái)完成相同的工作。當(dāng)要發(fā)送的數(shù)據(jù)大于緩沖區(qū)的容量時(shí),同單片機(jī)的情況一樣,也要對(duì)數(shù)據(jù)進(jìn)行分割。當(dāng)數(shù)據(jù)發(fā)送完畢之后,例程返回一個(gè)發(fā)送成功的標(biāo)志。

            5.5 USB上位機(jī)應(yīng)用程序設(shè)計(jì)簡(jiǎn)介

            編寫(xiě)好驅(qū)動(dòng)程序以后,要在應(yīng)用程序中調(diào)用USB設(shè)備,其做法就與調(diào)用硬件類(lèi)似,可以使用WIN32 API函數(shù)像調(diào)用程序文件一樣對(duì)設(shè)備進(jìn)行讀寫(xiě),也可以使用如同串口的mscomm那樣的控件來(lái)實(shí)現(xiàn)。由于本系統(tǒng)的上位機(jī)程序是用VB開(kāi)發(fā)的,顯然調(diào)用成品動(dòng)態(tài)鏈接庫(kù)能減少很多工作量。這里就調(diào)用由廣州周立功單片機(jī)發(fā)展有限公司開(kāi)發(fā)的稱(chēng)為easyd12.dll的動(dòng)態(tài)鏈接庫(kù)。

            6 結(jié)論

            USB接口的驅(qū)動(dòng)程序編寫(xiě)是一項(xiàng)繁瑣的工作,由于硬件條件的限制,上述程序僅在仿真器上運(yùn)行通過(guò),無(wú)法實(shí)地調(diào)試,其中必然存在很多漏洞和不足。USB接口本身是并不是為智能儀表開(kāi)發(fā)的,作為批量數(shù)據(jù)傳輸用的USB總線(xiàn)在智能儀表上使用顯得有些復(fù)雜。在更高性能的通用型總線(xiàn)出現(xiàn)以前,為了實(shí)現(xiàn)信息的高速傳輸使用USB還是一個(gè)性?xún)r(jià)比較好的方案。本系統(tǒng)只使用了USB的部分功能,付出的軟硬件資源代價(jià)卻與一個(gè)完整功能的USB傳輸系統(tǒng)沒(méi)有多大區(qū)別。如果能開(kāi)發(fā)出一種比USB總線(xiàn)更簡(jiǎn)便易用的通用型總線(xiàn),那一定會(huì)引起智能儀表的革命。實(shí)際上,現(xiàn)在用驅(qū)動(dòng)程序完成的工作完全可以用純硬件的方式來(lái)實(shí)現(xiàn),不過(guò)目前而言,代價(jià)必然較大。如果能找到一個(gè)方法來(lái)直接控制USB接口各個(gè)引腳的電平,那么即使用中規(guī)模集成電路也可以完成同步串行通訊的工作,遺憾的是,在整個(gè)設(shè)計(jì)過(guò)程中,本人始終沒(méi)有發(fā)現(xiàn)這種方法,涉及USB協(xié)議以及計(jì)算機(jī)主板上相關(guān)控制器的最底層內(nèi)容仍然無(wú)法洞悉。


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();