作者:涂望明;魏友國;陳運濤;段道聚
一、 引言
USB是應用在PC領域中的新型接口技術,它由三部分組成:具有USB接口的PC系統,能夠支持USB的系統軟件和使用USB接口的設備。它的提出是基于采用通用連接技術,實現外設的簡單快速連接,達到方便用戶、降低成本、擴展PC連接外設范圍的目地。它的最顯著優點是支持熱插拔,當用戶插入USB外設后,計算機能夠自動識別接入的外設,而不需要重新啟動系統。
二、USB設備硬件結構
為了提高系統的可擴展性,也便于選擇高性能的單片機,以實現更多的功能,我們使用較為廣泛的Philip公司的單純的接口芯片PDIUSBD12。下面介紹USB設備硬件的相關情況。
1. PDIUSBD12芯片的內部結構
芯片內部集成SIE、320B的FIFO緩存、收發器以及電壓調整電路和終結電阻器,提供2MB/s速率的并行接口,具有全自治本地DMA功能,芯片提供的多重中斷模式有利于批量和等時數據傳輸模式。芯片還提供了可編程時鐘、上電復位和低電壓復位電路。
2. PDIUSBD12芯片的控制字
D12的控制字分為初始化命令、數據流命令和通用命令三種基本類型。在USB 設備列舉過程中使用初始化命令,這些命令用來啟動設備、設置地址、端點和工作模式。數據流命令用于管理USB 和單片機之間的數據流。很多數據流是通過一個發給單片機的中斷請求開始的。控制器使用數據流命令來存取數據,確認在FIFO中的數據是否有效。通用命令主要在數據傳輸過程中使用,包括恢復和讀取當前幀號。
3. PDIUSBD12 與單片機的連接
以PDIUSBD12和89C52單片機之間的連接如圖所示,ALE接到單片機的ALE上,使用地址總線復用方式。A0通過電阻接VCC。VCC接+5V,VOUT3.3通過電容接地,同時腳20RESET_N和腳18DMACK_N接高電平。GND接地。8根數據線接至數據總線。腳11CS_N端接至控制器或譯碼器的相應端, PDIUSBD12可以通過CS_N端,映射為控制器的任何地址。腳14中斷接至控制器的中斷線,并用電阻拉高。XTAL1和XTAL2接6MHZ晶振,EOT_N拉高,D-、D+分別接到USB 總線的D-、D+上。在實際產品中,腳21GL_N可接LED顯示設備狀態。
三、USB設備固件的設計
固件的設計要求非常熟悉USB設備的具體通信步驟以及單片機的指令系統。
1. 固件介紹
PDIUSBD12是一種高速并行總線的USB接口設備,支持本地DMA傳輸。固件設計的目標是使D12在USB上能達到最快的傳輸率。外圍設備如打印機等使用D12傳送大量的數據。這些設備中的CPU忙于處理許多任務象設備控制,數據和圖象處理。D12的固件設計成完全的中斷驅動模式。當CPU在處理前臺任務時,USB傳輸在后臺被處理。這保證了最好的傳輸率和較好的軟件結構,簡化了編程和調試。
在后臺中斷服務程序和前臺主程序之間的數據交換是通過標志和數據緩沖區來實現的。例如, D12主要的大量輸出端點用一個圓形的數據緩沖區。當D12從USB接收到數據封包,就向CPU產生一個中斷請求,CPU會馬上執行中斷服務程序。在中斷服務程序內部,固件把數據封包從D12的內部緩沖區送到圓形緩沖區,然后清除PDIUSBD12的內部緩沖區使它能接收下一個新的數據包。CPU能繼續執行當前前臺的任務直到完成。然后它返回到主循環,檢查圓形緩沖區是否有新的數據,開始另外一個前臺任務。
使用這種結構,主函數不關心數據源是來自USB設備,串行口還是并行口。主函數只檢查圓形緩沖區是否有新數據需要處理。因此,主函數將目標定為數據處理,而中斷服務程序做的工作是以可能的最快速度傳送數據。類似地,控制端點在數據封包處理上使用了同樣的概念。中斷服務程序在數據緩沖區里接收和存儲控制傳輸內容并設置相應的標志寄存器。主函數將發送請求到協議處理程序。一旦所有的標準設備,類,和用戶請求在協議處理程序處理了,中斷服務程序就能保持它的效率。
2. 固件結構和任務
1) 固件結構
固件由6部分組成,它們如下: 主程序:發送USB設備請求,讀測試鍵,控制發光二極管,處理USB總線事務,等等、標準請求、用戶請求、中斷服務程序、PDIUSBD12命令接口、硬件層。下面依次簡略介紹:
硬件層:這是固件中最低的層,它完成向PDIUSBD12的硬件通道。當固件轉向其他的CPU 平臺,這部分需要修改或增加內容。
PDIUSBD12命令接口:為進一步簡化用PDIUSBD12編程,固件定義了一系列命令接口,它們壓縮了使用PDIUSBD12的所有功能。
中斷服務程序:這部分代碼處理由PDIUSBD12產生的中斷。它接收從PDIUSBD12內部的FIFO區到CPU存儲器的數據,并且建立合適的標志以通知主程序處理。
主程序:主程序檢查事件的標志,轉移到合適的子程序做進一步的處理。它也包含人機接口代碼,例如,發光二極管和鍵盤掃描。
協議層:協議層處理標準USB設備請求,也處理具體的用戶請求諸如DMA和TWAIN。
2) 固件任務
在編寫固件程序的過程中,PDIUSBD12 作為接口芯片硬件為我們做了大量的工作,其中包括:
a.檢測新的進入事務;翻譯從USB 總線上獲得的信息;b. 檢測事務的目的地址,以決定是否響應;e. 確定事務的類型;d. 從USB 總線上接收數據到FIFO;e. 從FIFO 中發送數據到USB 總線上;f. 計算校驗位,檢測并報告結果。
但還有相當一部分的工作由固件程序來完成。這部分任務包括:
a.初始化PDIUSBD12并處理PDIUSBD12的中斷;b.響應各種請求,至少要響應標準的11種請求;c.選擇適當的數據寫入PDIUSBD12的FIFO;d.從PDIUSBD12的FIFO中讀取數據;
3) PDIUSBD12 的初始化
與一般的接口芯片一樣,PDIUSBD12必須先初始化以后再使用,初始化的步驟如下:
a.用Set Address/Enable命令使能芯片功能,地址應設為0;b.用Set Endpoint Enable命令使能芯片上除端點0、1外的所有端點;c.用Set Mode 命令斷開連接,延時1-2s;用Set Mode 命令連接;d. 用命令Read Interrupt Register清空中斷寄存器;
初始化完后,D12就可以接收USB 總線上的信息了。之后,主機通過端點0、1來讀取設備信息,配置設備、設置設備地址,完成設備列舉。
4) USB 設備的列舉
當有一個USB 設備連接到主機上時,主機的USB總線驅動、根集線器驅動獲得設備連接的通知,開始列舉設備。在主機一端,列舉設備的過程是向設備發出一系列的標準請求。在設備一端,則需要響應主機發出的請求。其順序如下:
a響應獲取設備描述符的請求。務必保證設備描述符的正確發送;b.響應設置地址的請求,設備進入編址態;c.連續三次響應獲取設備描述符請求;d.響應獲取配置描述符的的請求,務必保證配置描述符的正確發送;e.發送全部的配置描述符,同時發送所有的接口描述符、端點描述符;
如果以上步驟都正確,則主機會提示找到新設備,安裝驅動程序。否則,提示找到未知設備,設備不可用。
5) USB 設備固件框架的實現
從上面的討論發現編寫USB設備的固件實質上是處理各種主機提出的請求。其中,標準的11個請求是必須實現的,如果要求設備有其它的功能還必須加入自定義的請求。按照USB 2.0 中的定義,稱這些固件程序為USB設備的框架。下面介紹USB設備框架的實現。
3. 主程序的結構
一旦加電,MCU就要初始化所有的端口,存儲器,定時器和中斷服務子程序。之后,MCU需要重新連接USB。這個程序很重要因為它保證了在MCU未準備好服務D12之前,D12不會動作。
在主循環程序里面,MCU會詢問鍵盤上的任何動作。如果任何一個具體的鍵被按下,處理鍵的命令就會執行處理程序,之后返回主程序。這個程序僅是用來調試用。1ms定時是用來啟動檢查被按下鍵的子程序。
當詢問到達檢查Setup包時,它需要先確定setup標志是否建立。如果setup標志已經確立,它將發送設備請求到協議層進行處理。下面的流程圖顯示了主程序在前臺執行的情況。
4. 中斷服務程序的實現
PDIUSBD12固件是完全中斷驅動的,因此中斷服務程序是整個固件編寫過程中非常重要的一環。在進入中斷服務程序后首先要發用命令Read Interrupt Register(控制字為F4H)讀取中斷寄存器,根據中斷寄存器的內容判斷中斷源,然后跳轉到不同的服務程序中去處理中斷。
中斷服務程序(ISR)與主程序通信是通過事件標志“EPPFLAG”和數據緩沖區“Control-XFER”。
主程序和中斷服務程序(ISR)之間任務分配是,ISR從D12收集數據,主程序將處理這些數據。ISR只在它收集了足夠的數據才通知主程序準備處理,這樣會減少不必要的主程序服務時間,也簡化了主程序。
總線重置和空閑在ISR里面不需要特殊的處理。ISR要么設置總線重置標志,要么在EPPFLAG里暫停這一位并退出。
控制型傳輸總是以setup階段開始的,接著是數據階段。然后以狀態階段結束。
下面以處理Control OUT和Control IN這兩個最復雜最重要的中斷子程序為例,說明編寫中斷服務程序的一些問題。
Control OUT主要是主機用來傳遞控制請求的,也可用于傳輸數據,進入服務程序后首先要發送控制字Read Last Transaction Status(40H)給PDIUSBD12,讀取管道狀態,根據讀取的狀態判斷是因為有數據包還是有SETUP包的到來而中斷。當SETUP包被USB設備的D12接收后,設備將會向MCU產生中斷。微控制器將通過讀取D12中斷寄存器的內容判斷封包是送到Control端點還是Genric端點而進行處理。如果封包是送到Control端點,MCU將會進一步通過讀D12的“Read Last Transaction Status Register”判斷數據是不是SETUP 封包。對于獲取描述符設備請求,第一個封包必須是SETUP封包。
之后,MCU需要讀出SETUP封包的內容通過選擇Control Out端點來判斷這個端點是滿的還是空的。如果控制端點是滿的,MCU就從緩沖區中讀出它的內容并將它存在存儲器里。然后,它將從存儲器里去驗證主機設備請求是否合法。如果是合法請求,MCU必須送“Acknowledge Setup command”到Control Out端點使能接收下一個封包。下一步,MCU需要確定控制傳輸是控制讀還是控制寫。這可以通過從SETUP 封包里讀bmRequestType的8個字節來完成。控制傳輸是控制讀,設備需要在下一個數據時相回送數據包給主機。MCU需要建立一個標志,表明USB設備現在正處于傳送模式。應主機的要求準備送數據。
Control IN主要是用來向主機傳送數據的,進入服務子程序后,首先要通過讀Read Last Transaction Status(40H)來清除Control-In interrupt Bit,在確認D12是處于傳送模式下后,MCU將數據包送往主機。但是,由于D12只有16字節的FIFO,所以MCU必須控制好傳送的總量,如果要求的長度大于16字節的話。MCU必須檢查當前和剩下的要送往主機的數據,如果剩下的字節大于16字節的話,MCU將先送頭16字節。在下一個Control-IN令牌包到來的時候,MCU將先判斷剩下的字節是否為0,如果是,MCU將發一個空包給主機,通知它數據已經傳送完畢。
結束語:
功能強大的USB規格已經成為PC的眾多標準之一,鉆研計算機科技的種種發展,都離不開USB的相關知識。本文創新點:使用USB通信方面的具體協議,用單片機匯編語言編程,利用單片機的指令系統去實現USB設備與PC主機的具體通信,設計出適合用戶需求的USB設備。
責任編輯:gt
-
單片機
+關注
關注
6032文章
44514瀏覽量
632981 -
接口
+關注
關注
33文章
8497瀏覽量
150834 -
usb
+關注
關注
60文章
7892瀏覽量
263983
發布評論請先 登錄
相關推薦
評論