USB總線在同步相量測量單元中的應用
1? 引言
??? 同步相量測量單元(PMU)測量裝置與上位計算機之間的通訊速率普遍較低,不能將測量數據及時傳送到上位機進行分析處理,通訊接口已成為整個系統性能提高的一個瓶頸,因此有必要使用一種傳輸速率、時延、穩定性均能滿足同步相量測量數據傳輸的通用接口。
??? 采用USB接口作為上位機與下位機的通訊接口方式可以解決這些問題。利用USB接口中斷傳輸速率大,時延小,差錯率極低的特點來完成實時相量數據的傳輸。在USB接口的實際應用中,驅動程序的開發是最為困難的部分,由于USB接口誕生較晚,目前尚未成為多數單片微機的標準設備,還需要使用專門的接口芯片進行連接,用戶必須編寫相應的驅動程序將數據轉化為符合USB系統協議的格式進行傳輸。
??? 本文敘述了ATMAGE128單片機使用PDIUSBD12接口芯片完成USB接口數據通訊的過程。通過驅動程序完成對相關硬件設備的操作。該驅動程序完成USB接口的中斷傳輸功能,用戶調用通用命令就可以像使用一個普通的存儲器一樣使用USB接口芯片。該接口實現了各采樣點的低延時上傳功能,可以在1ms內完成一個工頻周期全部采樣值的傳輸。
2? USB系統及其器件選擇介紹
2.1? USB體系概述
??? USB(Universal Serial Bus)是一種通用串行總線,為了實現整個計算機系統中總線的一致性,由COMPAQ/ INTEL/MICRSOFT和NEC等公司共同開發出的一種新的、快速的、雙向的、同步傳輸的并可以熱拔插的數據傳輸總線,簡稱USB總線。USB總線由以下四個主要部分構成:①主機和設備:是指USB系統中的主要構件。②物理構成:是指USB元件的連接方法。③邏輯構成:不同的USB元件所擔當的角色和責任,以及從主機和設備的角度出發USB總線所呈現的結構。④客戶軟件與設備功能接口的關系。
??? USB總線有四種數據傳輸方式:①控制傳輸:主要用于主機把命令傳給設備以及設備把狀態返回給主機。②中斷傳輸:用來支持那些偶然需要少量數據通信,但服務時間受限制的設備。③批量傳輸:用來傳輸大量的數據而沒有周期和傳輸速率的設備上。批量傳輸方式并不能保證傳輸的速率,但可以保證傳輸的可靠性,當出現錯誤的時候會要求發送方重發。④同步傳輸:以一個恒定的速率進行傳輸。同步傳輸的方式的發送和接收方都必須保證傳輸速率的匹配,不然會造成數據的丟失。
2.2? USB器件簡介及應用
??? 實現USB傳輸的方法主要有使用接口轉換芯片和專用的接口芯片兩種。前者就是將USB接口轉換為標準的RS232接口使用,在操作方式和傳輸速度上與RS232接口完全相同。后者則可以實現真正的USB傳輸,使用USB1.1標準的接口芯片如PDIUSBD12可以達到最高12Mb/s的傳輸速率,使用USB2.0標準的接口芯片如ISP1581則可以達到480Mb/s的傳輸速率。如果要使用專用的USB接口芯片就必須編寫相應的下位機與上位機驅動程序,由于USB傳輸不同于串口傳輸,USB傳輸的方式都是通過協議規定的數據包來完成的,所以下位機的軟件必須實現對接口器件的硬件管理功能,及對協議發出的各種請求作出響應。而上位機驅動程序需完成對接口芯片的枚舉、地址分配等工作。
2.3? USB接口在本系統中的作用
??? USB接口在本系統中用來完成下位機與上位機的通訊,具體就是連接AVR單片機與PC,將下位機采集的數據及一些相關信息傳送到PC進行處理。傳輸的數據包括:①電壓值(每周期采樣64個點,12位數據)。②電流值(每周期采樣64個點,12位數據)。③同步時間信號(取自GPS)。
??? 上位機在接收到這些信息后將會對其進行描點,故障錄波,遠程傳送等處理。12位的電壓電流數據都要經過變換,成為16位數據,占一個字節。每通道1秒鐘傳輸的數據在6KB以上,多個通道合計,接口的傳輸速率至少要40KB/s,這一要求已經超過RS232接口所能提供的傳輸速率。如果使用CAN總線進行傳輸,則硬件設備較為復雜。綜合比較后,采用PDIUSBD12作為接口芯片進行數據傳輸是較合適的選擇。采用塑料極小封裝的PDIUSBD12可以很容易安置在電路板上。而且對上位機的要求也較為寬松,只要有USB接口的計算機都可以作為本系統的上位機。
3? ATMAGE128單片機
3.1? ATMAGE128單片機介紹
??? ATMAGE128單片機是由ATMEL公司出品的一款高性能低功耗的8位微型控制器,最高時鐘頻率可以達16MHz。片內集成有容量為128KB的閃存作為程序存儲器,4KB的EEPROM,以及4KB的片內存儲器,最高可支持64KB的片外存儲器。
3.2? 開發過程簡述
??? TMAGE128的開發一般是由ATMEL公司提供的免費仿真工具avrstudio完成的,與常用的51單片機略有不同,使用c語言進行開發的時候必須使用第三方編譯器對源代碼進行編譯后才能在仿真環境下運行。本次采用的是icc作為編譯器,本文所有的單片機程序都在此環境下運行調試。USB接口器件采用總線控制方式,數據傳輸形式采用中斷傳輸。USB接口器件在使用上與一個普通的外部存儲器相同,所有的控制與數據傳輸都必須對ATMAGE128中相應的寄存器進行讀寫操作才能完成。
4? USB驅動程序MCU部分
??? MCU即設備方控制器,可以是各類型單片機或者是PC,它們的驅動程序在結構上是類似的,而具體的代碼,由于使用的系統環境不同,存在較大差異,下面就詳細說明以ATMAGE128單片機作為設備方控制器的USB驅動程序結構以及具體實現的代碼。
4.1? 程序整體結構
??? 對于CPU而言,PDIUSBD12芯片與一個外部存儲器完全相同,CPU通過總線控制的方式對PDIUSBD12進行操作。USB接口的傳輸并不會占用許多CPU資源,CPU可以執行前臺操作,而USB接口傳輸的工作則在后臺完成,兩者之間通過中斷服務程序連接。當PDIUSBD12 從USB 收到一個數據包,那么就對CPU 產生一個中斷請求,CPU 立即響應中斷。在ISR中固件將數據包從PDIUSBD12 內部緩沖區移到循環數據緩沖區,并在隨后清零PDIUSBD12 的內部緩沖區以使能接收新的數據包CPU 可以繼續它當前的前臺任務直到完成,然后返回到主循環檢查循環緩沖區內是否有新的數據,并開始其它的前臺任務。無論是上傳或者下載數據都是對循環緩沖區內的數據進行處理,主循環只要檢查循環緩沖區內是否有要處理的新數據。程序整體結構框圖如圖1所示。
各模塊分工如下:
??? (1)硬件提取層:對單片機的I/O口、數據總線等硬件接口進行操作。
??? (2)PDIUSBD12命令接口:對PDIUSBD12器件進行操作的模塊子程序集。
??? (3)中斷服務程序:當PDIUSBD12向單片機發出中斷請求時,讀取PDIUSBD12的中斷傳輸來的數據,并進行相關處理。
??? (4)標準請求處理程序:對USB的標準設備請求進行處理。
??? (5)廠商請求處理程序:對用戶添加的廠商請求進行處理。
??? (6)主循環程序:發送USB請求、處理USB總線事件和用戶功能處理等。
圖1? USB驅動MCU整體結構圖
4.2? 硬件提取層相關程序
??? 硬件提取層執行對單片機I/O口、數據總線等的操作,包含向PDIUSBD12發送數據或命令的子程序及從PDIUSBD12讀取數據的子程序,該部分代碼需對地址總線和數據總線進行直接操作。PDIUSBD12的任何操作都是由命令指令和數據指令組合完成的,通過改變A0引腳的電平就可以完成命令模式/數據模式的切換。
4.3? 命令接口
??? 該部分是由一系列命令接口子程序構成的,包含了所有PDIUSBD12給出的訪問功能接口的命令。在命令接口中調用了硬件提取層中的子程序。PDIUSBD12的所有功能都必須由類似的方法完成,先發送一條命令,然后寫該命令的具體參數。有的命令參數是多個字節的,如設置模式命令,此時就必須調用兩次寫數據線的指令。命令接口程序的編寫格式相對固定,按照PDIUSBD12說明書中給出的命令匯總表依次編寫即可。
4.4? 中斷服務程序
??? 中斷服務程序代碼處理由PDIUSBD12產生的中斷,它將數據從PDIUSBD12內部的緩沖區內取出,并建立正確的標志,通知主循環進行處理。當PDIUSBD12向單片機發出中斷請求后,單片機調用讀取中斷寄存器的標準命令接口子程序d12_readinterruptregister( )來決定中斷源,然后跳轉到相應的中斷服務子程序進行處理。中斷服務程序從PDIUSBD12收集數據,而主循環程序對數據進行處理。當中斷服務程序收集到足夠的數據時,它通知主程序已經做好準備等待處理。例如在發送數據包階段建立包時,中斷服務程序將建立包和數據都存入緩沖區內,然后將setup_packet標志送到主循環,這樣主循環就可以節省不必要的服務時間。
4.5? 總線復位和掛起
??? 當接收到總線復位或掛起的請求時,中斷服務程序將bus_set或suspends標志位置位,然后退出。
??? 控制傳輸總是由建立階段開始,之后為可選的數據階段,然后結束于狀態階段。單片機需通過選擇控制輸出端點來提取建立包的內容來決定端點是為滿還是為空。如果控制端點是為滿,單片機將從緩沖區內讀出內容并將其存入存儲區。之后,單片機將從存儲區使主設備請求生效。如果是一個有效的請求,單片機需向控制端點發送應答建立命令,以重新使能下一個建立階段。接下來單片機需要證實傳輸是控制讀還是寫,這可以通過建立包重定向的請求類型位來實現。
建立階段結束后,主機就會執行數據階段。PDIUSBD12等待接收控制輸入包。單片機首先需要讀取最后處理狀態寄存器清零中斷標志位。確認PDIUSBD12處于傳輸模式后,進行數據包的發送。
當下一個控制輸入標志來到時,單片機將確定剩余的字節是否為零。如果已經沒有數據要發送,單片機需要發送一個空的包以指示主機數據已經發送完畢。如果建立包的為獲得描述符請求,那么建立包中的控制傳輸將指示此包為控制寫類型。在執行完獲得描述符請求過程后,單片機處于等待數據階段。主機發送一個控制輸出的標志,單片機從PDIUSBD12緩沖區內減去數據。此時單片機確認PDIUSBD12是否處于USB接收模式,然后單片機通過檢查選擇控制輸出端點確認緩沖區是否已滿,并將數據從緩沖區內讀出。
4.6? 標準請求處理程序
??? 標準設備請求是由USB協議決定的,由主機發出,以數據包的形式傳送到單片機。當單片機接收到這些標準設備請求時就轉入相應的處理程序。其過程包括:①獲取狀態。②清除特性。③設置特性。④設置地址。⑤獲取設備描述符。⑥設置配置。⑦獲取配置信息。⑧獲取接口信息。⑨設置接口。⑩同步幀。其中同步幀用來設置和報告一個端點的同步幀,在同步傳輸中才使用,如果設備不支持這個請求,返回停止標志。
4.7? 主循環程序
??? 主循環程序主要功能是設置單片機的初始化,以及設定各個相關子程序的入口。由于使用了中斷服務程序和一系列的命令接口子程序,主循環程序中涉及USB接口的部分只是設定相關的寄存器。
5? USB驅動程序上位機部分
5.1? 驅動程序基本概念
??? 主機驅動程序的功能是將硬件與用戶應用程序連接起來。編寫的方法有多種,可以直接與硬件相連接,在應用程序中直接讀寫系統應將,或者將與硬件直接交換數據的底層工作交給操作系統自動完成,應用程序象讀寫普通文件一樣完成對硬件設備的操作。前一種方法的代碼開銷少,但是編寫的工作量非常大,移植性也較差。后一種方法需要大量庫函數支持,但編寫較為簡單,且移植性好,甚至只需少許修改就可以完成對另一種硬件的支持。在本系統中使用的是由廠商提供的驅動程序,為了充分說明USB系統的工作,還是有必要對主機驅動程序的工作方式做一個介紹。
??? 從驅動程序的角度出發,每個設備都被看成若干個設備對象,這些設備對象的來歷各不相同,每個對象都有驅動程序與之對應。它們根據一定的規則組成設備對象堆棧,也就是對應的驅動程序堆棧。處于最底層的是物理設備對象,它一般由總線生成,驅動程序到達這里的時候,總線只是按照標準作一些動作,即可完成對設備物理上的操作。一個設備只能有一個物理設備對象,但可以有若干個其它的設備對象。功能設備對象是由所編寫的驅動程序生成的,它負責從邏輯上操作設備。其它的層次設備對象可以處于功能設備對象的上面或下面,它由另一些驅動程序或者其它的系統組件生成,可以記錄一些設備信息,但層次設備對象不是必須的。由于驅動程序的這種層次結構,在編寫驅動程序的時候不必考慮內存分配、IO端口配置、DMA申請等。Windows將資源申請全部自動化,由總線完成,編寫驅動程序時只要考慮控制設備本身即可。
5.2? 即插即用設備狀態及它們之間的轉換
??? USB接口設備的一個顯著特點就是接入或者拔出時不需要關閉主機和重新啟動系統,而是可以在系統運行時直接插入或者拔出。這與USB接口的硬件設置有關,USB接口是通過檢測接口上拉電阻來判別是否有設備存在的。當然,還必須有相應的驅動程序來完成對此功能的支持。下面就將簡要描述一個設備完成即插即用的過程。
??? 用戶將設備插入計算機,此時設備還沒有被系統檢測到。要開始對設備進行軟件配置,必須由即插即用管理器以及總線驅動對設備進行枚舉。即插即用管理器,有時還可能要在用戶模式下的組件工作,檢測出設備的驅動程序,包括功能驅動程序以及其它的層次驅動程序。如果此時驅動程序尚未調入,則即插即用管理器調用設備插入例程。驅動程序完成初始化之后,接著必須對設備進行初始化。即插即用管理器調用驅動程序中添加設備的例程來初始化該驅動程序控制的每個設備。當一個驅動程序從即插即用管理器中收到開始設備的請求時,驅動程序使設備啟動并且做好處理IO操作。在Windows2000及更高版本的操作系統中,和停止有關的請求只有在重新分配硬件資源的時候才會使用。意外卸載時是指硬件在物理上被卸載(熱拔出),驅動程序處理這個請求使系統的損失盡可能降低。硬件卸載時,調用相應的卸載請求,使得該設備在軟件上也不可用。如果不對意外卸載進行處理,就有可能造成硬件在物理意義上已不存在,但在系統邏輯中依然存在,造成系統訪問該設備的時候出現錯誤,嚴重的情況可能會造成處理器進入死循環。當在軟件意義上對設備進行停止時,需要等其它請求都操作完畢后才能進行。
5.3? 驅動程序結構
??? USB驅動程序從結構上可以分成兩大部分,驅動程序入口以及處理各個事件的例程。驅動程序入口是由系統定義的一組常數,該部分主要完成兩件工作:一件是將注冊表項復制到一個全局變量中;另一件是給不同的設備事件指示處理例程。剩下的工作就是按照這些設備事件編寫各自的例程。這些設備事件主要包括下面幾個部分:
??? (1)打開文件:當用戶以打開文件的名義打開設備準備讀寫的時候,調用該部分例程進行準備。
??? (2)關閉文件:當用戶關閉文件(關閉設備)的時候,調用該例程清掃系統。
??? (3)即插即用處理:處理即插即用相關的事件,該部分例程包括許多硬件相關的子程序,具體功能見第2節。
??? (4)處理讀操作:當用戶讀取文件時,調用該例程將接口芯片緩沖區內的信息返回主機。
??? (5)處理寫操作:當用戶寫文件時,調用該例程將數據以包的形式發送到接口芯片。
??? (6)設備操作:該部分例程完成對設備硬件的控制,一般含有IO控制碼,這些控制碼在用戶頭文件中定義,該例程根據不同的IO控制碼,完成對設備的各項控制任務。
??? (7)驅動程序初始化:當第一次安裝硬件時調用該部分例程,創建物理設備對象。對所涉及的各個變量進行初始化。這部分程序一般操作系統中有自帶。
??? (8)驅動程序的卸載:用于清除硬件在系統中留下的痕跡,釋放全局變量中注冊表路徑字符串所占用的內存,將資源歸還系統。
??? (9)電源管理:所有和電源相關的例程都由這里發出,它發出的請求可以是指定一種新的電源狀態,或者查詢更改一種狀態是否可靠。此部分對于總線供電的USB設備較為重要,涉及設備的掛起和喚醒等操作。在本系統中此部分無作用,所有下位機設備都是自供電形式的,設備處于長時工作狀態。
5.4? USB設備讀寫
??? USB設備的讀寫操作是大部分用戶主要關心的內容。由于設備驅動程序的作用,用戶應用程序和USB設備的讀寫操作變的非常簡單,用戶打開USB設備就像打開文件一樣。這是在添加設備中申請了一個符號鏈接,并在啟動設備例程中將此鏈接激活而實現的。USB中的讀寫操作分為四種:
??? (1)控制型:控制型傳輸主要為對USB本身的配置,前面所描述的USB配置實際上都是通過控制傳輸實現的。
??? (2)批量型:批量型傳輸用來處理大量的對時間要求不緊迫的數據。底層協議保證了無差錯的傳輸,但不保證傳輸時延。
??? (3)中斷型:中斷型傳輸對服務時間有較強的限制,但一次傳輸的數據量不多,主要為一些需要實時相應的消息。
??? (4)同步型:同步傳輸可以保證傳輸時延、保證帶寬和保證恒定的數據傳輸速率,但是在傳送失敗的情況下。不使用“重試”來傳輸數據,因而可能會有一定的出錯概率。
??? 對USB接口的讀寫是按照與數據文件讀寫相同的方式進行的,第一步要打開文件,即打開設備。當用戶以打開文件的名義打開設備時,首先要檢查設備的狀態,看設備是否處于工作狀態,設備的接口信息是否已經準備好。接著檢查從上面傳下來的文件對象的合法性(指針不為空)。然后檢查文件名的長度,當為0時,說明打開的只是設備本身;不為0時說明打開的是某個管道,調用管道相關例程,將管道明轉換為指向對應管道綜合信息的指針即可。讀寫USB設備實際上是調用同一個傳輸例程的,所區別的是傳輸方向符不同,由于通訊雙方遵守的都是USB協議,所有的數據包的格式都是一致的,所以這沒有什么問題。驅動程序控制的上位機讀寫過程和單片機的情況類似,所不同的是,單片機使用的接口芯片將數據放入硬件緩沖區內,而上位機的驅動程序則會構建一個虛擬的緩沖區來完成相同的工作。當要發送的數據大于緩沖區的容量時,同單片機的情況一樣,也要對數據進行分割。當數據發送完畢之后,例程返回一個發送成功的標志。
5.5? USB上位機應用程序設計簡介
??? 編寫好驅動程序以后,要在應用程序中調用USB設備,其做法就與調用硬件類似,可以使用WIN32 API函數像調用程序文件一樣對設備進行讀寫,也可以使用如同串口的mscomm那樣的控件來實現。由于本系統的上位機程序是用VB開發的,顯然調用成品動態鏈接庫能減少很多工作量。這里就調用由廣州周立功單片機發展有限公司開發的稱為easyd12.dll的動態鏈接庫。
6? 結論
??? USB接口的驅動程序編寫是一項繁瑣的工作,由于硬件條件的限制,上述程序僅在仿真器上運行通過,無法實地調試,其中必然存在很多漏洞和不足。USB接口本身是并不是為智能儀表開發的,作為批量數據傳輸用的USB總線在智能儀表上使用顯得有些復雜。在更高性能的通用型總線出現以前,為了實現信息的高速傳輸使用USB還是一個性價比較好的方案。本系統只使用了USB的部分功能,付出的軟硬件資源代價卻與一個完整功能的USB傳輸系統沒有多大區別。如果能開發出一種比USB總線更簡便易用的通用型總線,那一定會引起智能儀表的革命。實際上,現在用驅動程序完成的工作完全可以用純硬件的方式來實現,不過目前而言,代價必然較大。如果能找到一個方法來直接控制USB接口各個引腳的電平,那么即使用中規模集成電路也可以完成同步串行通訊的工作,遺憾的是,在整個設計過程中,本人始終沒有發現這種方法,涉及USB協議以及計算機主板上相關控制器的最底層內容仍然無法洞悉。
評論
查看更多