帳號:
密碼:
最新動態
產業快訊
CTIMES / 文章 /
為產品添加USB功能
 

【作者: Lane Hauck】   2007年05月04日 星期五

瀏覽人次:【7155】

微處理器的選擇通常以內建的週邊功能做為考量,部份的微處理器包含有USB功能,但大部分,特別是價格相對較低的產品則沒有,您是否曾經有選定了具備完美輸出入與週邊功能組合的微處理器後,卻發現缺少了USB功能?如果能夠在不需要購買新工具或學習另一種處理器架構的情況下就能進行USB週邊的設計,那不正是美事一樁嗎?


透過美商美信(Maxim)所推出的MAX3420E晶片產品,將USB功能添加到任何微處理器變得相當容易實現,這款晶片提供了USB全速收發器、智慧型USB串列介面引擎(Serial Interface Engine;SIE),以及一個能夠以高達26MHz SCK時脈信號運作的SPI從屬介面,MAX3420E以單控制端點、兩個雙緩衝64byte資料端點以及一個64byte中斷端點的全速USB週邊方式運作。


由匯流排供電

(圖一)描述了常見的USB週邊架構,USB的Vbus接線提供5V電源給一個3.3V的穩壓器,用來供應微控器以及MAX3420E電源,完全不需交流變壓器。SPI介面可以由3、4或5條接線組成,基本的SPI信號為串列時脈(Serial ClocK;SCK)、用來表示一個SPI傳輸程序動作的晶片選擇(Chip Select;CS)、主控端輸出從屬端輸入資料(Master Out Slave In data;MOSI)以及主控端輸入從屬端輸出資料(Master In Slave Out data;MISO),部分介面可以將MOSI與MISO結合成雙向接腳,帶來3接腳式的介面。


MAX3420E同時也提供有一個能夠節省SPI介面上資料流量的中斷接腳,因此微處理器可以簡單地只讀取中斷接腳來取得狀態,而不需要一直透過SPI連接埠來抓取USB的狀態位元,或者在較複雜的系統中也可以用它做為真正的中斷信號。


那麼如果微處理器沒有具備SPI連接埠呢?不用擔心,可以相當簡單地透過直接控制通用輸出入接腳的狀態來製作一個韌體驅動的SPI主控介面。USB的一個強大功能是能夠自行控制速度,自動調整來配合SPI端的任何速度介面,這主要透過USB端的NAK交握信號來表示「忙線中請再試一次」,許多USB週邊,特別是與人機介面相關的都能夠相當高效率地進行互動運作,甚至是在最慢的SPI介面上。


但如果圖一中的微處理器相當小型,例如在10根接腳以下,那麼是不是在耗掉寶貴的接腳與USB晶片進行通訊後就沒有額外的接腳可以使用了呢?沒錯,這也就是為什麼MAX3420E提供了四根通用輸入以及四根通用輸出接腳來補償與它通訊所耗掉的接腳,甚至還更多,因此事實上系統在和MAX3420E連接後還取得了更多的可用輸出入接腳。


MAX3420E在應用上並不侷限於小型系統,(圖二)描述了如何為ASIC、FPGA、DSP或其他大型晶片添加USB功能,這樣做一個相當明顯的理由是這些晶片可能沒有內建USB功能,或者是內含的USB功能並不符合您的需求,這個架構作法的另一個好處是,大型晶片因製程技術而逐漸縮小後,在處理USB所需的較高電壓,例如3.3V的能力就會越來越差,這時具備低電壓SPI介面的外接USB晶片就是一個理想的解答,為了執行低電壓介面,MAX3420E內建了位準轉換電路以及一個VL接腳來選擇介面接腳的工作電壓,範圍在1.7V到3.6V之間。


如(圖三),SPI介面同時也是加入光隔離器相當方便的位置,由於信號為單向,因此可以規劃以相對較低的速度運作以支援低成本的光隔離元件。



《圖一 透過USB 5V Vbus接線供電的USB裝置,SPI介面可以使用3、4或5根接腳,不過MAX3420E可以提供超過它所耗用的輸出入接腳。》
《圖一 透過USB 5V Vbus接線供電的USB裝置,SPI介面可以使用3、4或5根接腳,不過MAX3420E可以提供超過它所耗用的輸出入接腳。》

SPI介面

串列週邊介面(Serial Peripheral Interface;SPI)是一個使用兩條資料線、一條串列時脈以及一個晶片選擇信號的簡單型串列式介面,SPI主控端首先將CS#接腳拉低來啟動傳輸動作,接著透過推動串列時脈SCK的同時將資料送出或由從屬元件讀入資料,SPI主控端藉由將CS#接腳拉回高電位來完成整個傳輸程序。


SPI介面擁有四種時脈模式,反應在兩個稱為時脈極性(Clock POLarity;CPOL)以及時脈相位(Clock PHAse;CPHA)的信號模式中,這些信號以(CPOL,CPHA)的形式表示,因此一個期望正向邊緣SCKS並同時希望MOSI資料在第一個正向時脈邊緣前出現的介面可以在模式(0,0)與模式(1,1)下運作而不需變換,這樣的特性使得MAX3420E可以在模式(0,0)或(1,1)下運作而不需要一根模式選擇接腳。


(圖四)描述了MAXQ2000微處理器與MAX3420E之間使用SPI模式(0,0)與(0,1)傳輸資料的情形,其中的差異在於SCK信號的未動作位準,其中低位準時為模式(0,0),高位準時則為模式(1,1)。


MAX3420E將每次傳輸動作的第一個位元組視為命令位元組,命令位元組包含了暫存器編號以及方向位元,第二個以及接下來的的位元組則包含傳輸資料,您可能會想知道,圖四中當命令位元組送入(MOSI)時,MAX3420E會提供什麼樣的輸出(MISO),事實上當每次命令位元組送入時會有八個USB狀態位元輸出,但這項功能只有在採用獨立MISO與MOSI輸出入接腳時才會啟動。



《圖二 MAX3420E並不侷限於小型系統,內建的位準轉換電路可以處理低於3.3V的介面電壓,SPI連接埠則可以以高達26 MHz的速度運作。》
《圖二 MAX3420E並不侷限於小型系統,內建的位準轉換電路可以處理低於3.3V的介面電壓,SPI連接埠則可以以高達26 MHz的速度運作。》

SPI程式碼

撰寫MAX3420E通用C語言程式碼的訣竅在於將最細的SPI運作流程隔離在一個模組中,並依不同的SPI介面進行這個模組的調整,在最低程度的要求上,這個模組可以只做三件事,分別為SPI連接埠的初始化、讀取位元組以及送出位元組。


本文的範例應用採用硬體式的SPI單元,對於沒有獨立SPI硬體的主控端,將會先討論採用位元操控(bit-banged)方式的SPI介面程式碼。


位元操控式SPI介面

進行SPI連接埠的初始化函數會因處理器而有所不同,主要用來指定介面所使用的特定輸出入接腳,設定它們的方向,然後設定CS=1以及SCK=0的初始狀態,在此假設使用模式(0,0)的SPI主控端。


(公式一)顯示了讀寫MAX3420E暫存器的通用程式碼,開頭始的巨集定義了推動SCK信號高低電位、推動CS高低電位,並使用MOSI以及MISO接腳透過時脈將資料送出或讀入的低階接腳運作,這個巨集將函數與各類不同處理器的不同輸出入接腳安排方式隔離,巨集的使用可以讓程式碼更容易閱讀,同時也能夠排除和處理器間的相關性,列表一中的巨集主要提供給沒有內含硬體SPI單元的典型舊式微處理器使用。


硬體SPI

Tom Cantrell在2004年9月號的Circuit Cellar雜誌中為讀者介紹了MAXQ2000,簡單來說,MAXQ2000是美商美信(Maxim/Dallas)所推出一系列低耗電高效能RISC處理器的第一個產品,其中Q代表安靜與平和,表示這個架構在設計上能夠平順地與敏感的類比線路搭配。從USB介面的觀點來看,MAXQ2000特別適合MAX3420E,原因是它內建了SPI連接埠,以下的例子將利用MAXQ2000開發工具組以及MAX3420E來架構一個簡單但有趣的Windows裝置,請參考(圖五)。


MAXQ2000的硬體式SPI單元提供有SCK、MOSI以及MISO,但沒有CS#,由於CS#在運作上有許多變化,例如在存取一個位元組或多個連續位元組時,因此最好使用一根通用輸出入接腳做為CS#使用。


(圖六)描述了MAXQ系列的基本輸出入單元,每一個輸出入單元都擁有一個正反器,在這個例子中透過稱為PO5.3的位元寫入,其中O代表輸出,(我們)可以隨時寫入這個正反器,而它的輸出是否與輸出入接腳連接則由方向位元決定,在進行輸出接腳組態時,最好能夠在將它連接到接腳前先將資料寫入正反器以避免突波雜訊。


P53接腳的方向由稱為PD5.3的位元決定,其中D代表方向,同時D信號也可以做為接腳驅動的輸出控制功能,1代表受到驅動,0則為浮動(float)。


接腳的狀態則可以隨時由稱為PI5.3的位元讀入,其中I代表輸入,不管接腳的驅動方式是使用內部正反器(PD5.3=1)或外部電路(PD5.3=0),PI位元都能夠提供接腳的目前狀態。


這個結構的一個優點是,如果接腳設定為輸入(PD5.3=0),那麼正反器的輸出就不會成為輸出,因此能夠被用來做為提升電阻的切換開關,當D=0時,O信號就重新定義為「連接提升電阻」,請參考(圖六)中的虛線和切換開關。


部分的輸出入接腳還擁有中斷功能,請參考圖六下方,中斷電路方塊擁有三個信號,當中斷要求動作時會設定一個旗標位元,並透過CPU加以重置,邊緣選擇位元則可以決定正向或負向信號變化會產生中斷要求,最後,每個接腳並提供一個可以用來控制是否能夠提出中斷要求的中斷功能啟動位元。


本文的範例應用程式將MAX3420E的INT輸出接腳設定為正向變化邊緣觸發中斷,在MAXQ2000端,程式碼會直接測試中斷正反器來決定是否有待處理的USB中斷而不使用MAXQ2000本身的中斷系統,程式隨時檢查按鈕開關的狀態並回應USB的要求,因此持續檢查迴圈是程式唯一的需求。


MAXQ2000的輸出入接腳可以規劃為通用輸出入或特殊功能硬體,例如SPI單元,如果要使用特殊的硬體,首先必須進行硬體電路方塊的設定,然後將它連接到輸出入接腳上,程式碼中的SPI_Init()常式先設定了接腳的方向,接著進行SPI介面的組態,最後再加以啟動。


程式碼中的rreg以及wreg函數利用了MAXQ2000中的硬體SPI單元,因此在程式碼上比採用位元操控方式要簡潔,執行速度也較快。


範例:Windows Panic Button

這個USB裝置屬於USB人機介面裝置,擁有單一按鈕,當按鈕按下時,所有已開啟的視窗會立即最小化,讓我們可以直接看到桌面,再按一次,所有的應用程式視窗會再重現。


USB鍵盤相當有趣,如果插入多個鍵盤,那麼它們可以同時動作,因此按鈕裝置事實上可以搭配正常的鍵盤運作。


如果PC進入暫停模式,那麼這個單一按鈕裝置還可以扮演新的角色,例如做為PC的遠端喚醒按鍵,不過這項功能必須視PC是否支援USB喚醒功能而定,有些可以,有些則不行,不過最少這個按鈕裝置可以幫助確認PC是否支援這項功能。這個程式碼範例在擴充連接槽上插有內含MAX3420E小型USB子板的MAXQ2000開發工具組上執行,程式碼本身事實上是一個更為完整USB程式碼範例的精簡版,可以透過Maxim/Dallas網站下載完整的程式碼。


《圖三 SPI介面提供了將USB連接埠與控制器隔離的理想位置,SPI信號為單向,同時速度也可以相對較低(1 MHz SCK),讓我們可以使用低成本的光隔離元件。》 - BigPic:606x305
《圖三 SPI介面提供了將USB連接埠與控制器隔離的理想位置,SPI信號為單向,同時速度也可以相對較低(1 MHz SCK),讓我們可以使用低成本的光隔離元件。》 - BigPic:606x305

USB的動作細節

這個應用程式包含了進行繁雜列舉(enumeration)工作的USB程式碼,裝置的特定資訊可以由程式列表中Panic_Button_Enum_Data.h內的字元陣列完整描述。


這個應用使用兩個端點,包括必要的CONTROL控制端點0,以及一個單緩衝64byte端點EP3-IN,雖然MAX3420E內含了兩個雙緩衝64byte端點(EP1-OUT與EP2-IN),但雙緩衝所提供的輸出效能優勢在這個應用中並不需要。


一個有關HID的常見錯誤觀念是HID只能以低速運作,這個應用顯示,就算是像鍵盤這類的低速裝置也能夠由全速運作獲益,由於它透過12MHz而非1.5MHz封包傳送資料,因此使用了較少的匯流排頻寬。


中斷端點擁有一個定時讀取的時間間隔,決定了USB主控端詢問IN端點讀取資料的時間間隔,在每個時間間隔中可以期待主控端會發送一個IN要求到裝置的端點3,(圖七)描述了一個處理這個需求的簡單狀態機,當裝置經過列舉程序後,微處理器會重複執行這個常式,為了簡化,這個應用程式會反覆讀取中斷接腳來取得狀態,當然如果微處理器需要進行其他的工作,那麼可能會想要啟動Do_IN3函數的中斷功能。


狀態機中使用了兩個全域變數state與button,C巨集定義了三個狀態,分別為IDLE、RELEASE以及WAIT,其中state變數初使化為IDLE,變數button則在連接到MAX3420E GPIN0接腳的按壓式按鈕按下時為1,否則為0,在main()中的無盡迴圈會持續進行並增加按鈕檢查計時器的計數值,當超過設定值時則會讀取MAX3420E中的GPIO暫存器來決定按鈕的狀態,這將可以節省不必要的SPI動作。


當按鈕沒被按下時,狀態圖會依左邊的路徑行進,因此不會有任何反應,如果按鈕在IDLE狀態下被按住,那麼就必須送出將開啟視窗最小化的按鍵碼,內容為08(視窗按鍵)00(反向)與07(字母d)的連續序列,接著將下一個狀態設定為RELEASE,這時工作就已結束。


當MAX3420E將這個封包由USB發出時,它會產生另一個EP3-IN中斷要求來表示EP3-IN的FIFO中已經可以再一次提供資料讀取,圖七中的函數會再次進入,這時state=RELEASE,因此函數會送出00 00 00的位元組序列,代表按鈕放開,下一個狀態則設定為WAIT,代表等待按鈕被放開。


並非所有的函數都必須使用WAIT狀態分支來偵測按鈕放開的動作,當按鈕還被按住時,不需任何反應,當按鈕放開後,狀態圖就會經過右方的路徑並將state變數重新初始化為IDLE,準備迎接下一次的按鈕動作。


大部分時間所執行的程式只佔了23行的C語言碼,請參考Do_IN3函數來了解圖七中流程圖的實現方式。


程式碼解說

在程式碼中有一些部分值得進一步探討。



《圖四 上方的4個波形狀態顯示了在SPI模式(0,0)下運作的SPI介面,下方則是使用相同介面發送相同資料,但在SPI模式(1,1)下運作的波形狀態,兩者的差別在於靜態SCK位準以及第一個正向SCK邊緣發生的時間。》 - BigPic:640x403
《圖四 上方的4個波形狀態顯示了在SPI模式(0,0)下運作的SPI介面,下方則是使用相同介面發送相同資料,但在SPI模式(1,1)下運作的波形狀態,兩者的差別在於靜態SCK位準以及第一個正向SCK邊緣發生的時間。》 - BigPic:640x403

與時間密切相關的USB事件

MAX3420E透過驅動K狀態到匯流排上10ms來發出遠端喚醒的動作,為了讓SPI主控端免除時間計數的負擔,可以利用MAX3420E內部來進行時間信號的計數,事實上所有USB與時間相關的事件都可以,然後在計時時間到達後提供給SPI主控端一個中斷信號,這時SPI主控端就不需要讓自己的計時器束縛在這些事件上,它只要直接啟動運作,然後等待完成的中斷信號即可。



《圖五 這個應用在安裝了內含MAX3420E小型擴充子板的MAXQ2000評估套件上運行,圖中標示了連接埠到SPI信號的指定方式,可以做為閱讀程式碼時的參考。》
《圖五 這個應用在安裝了內含MAX3420E小型擴充子板的MAXQ2000評估套件上運行,圖中標示了連接埠到SPI信號的指定方式,可以做為閱讀程式碼時的參考。》

ACKSTAT位元

rregAS與wregAS函數和rreg與wreg函數的一個不同點是會在SPI命令位元組中設定ACK STATUS狀態位元,SPI主控端,在例子中為MAXQ2000,使用這個位元來告知MAX3420E它已經完成目前的CONTROL要求,因此透過確認狀態來結束CONTROL的傳送,ACKSTAT同時也以內部暫存器位元的形式存在,但包含在SPI命令位元組中,這個經常用到的動作可以取得更快的執行速度,同時也更節省程式碼。


readbytes(), writebytes()函數

這些函數藉助了MAX3420E的連續發送能力,不再採用每次使用時發送分別為命令位元組與資料位元組的兩個位元組作法,它們首先拉低CS#,送出命令位元組,接著送出或讀入一序列的位元組,最後拉高CS#來結束這次的SPI傳輸程序。


產品ID在哪裡

存在Panic_Button_Enum_Data.h中的產品ID字串,提供了第一次插入單按鈕裝置時所顯示的訊息,會在列舉程序顯示做為單按鈕HID裝置的辨識資料,並與內建的視窗驅動程式連結。


接下來的動作都相當簡單,除了在插入USB裝置時所聽到的視窗聲響外,如果想要檢查裝置的狀態,那麼可以進入USB人性化介面裝置內容畫面。可以透過在我的電腦上按下滑鼠右鍵,選擇內容、硬體、裝置管理員、展開人性化介面裝置,並在USB人性化介面裝置上按下右鍵並選擇內容,將可以看到「MAX3420E USB Panic Button」等文字。



《圖六 MAXQ系列輸出入單元,輸出入連接埠位元以P.B表示,其中P為連接埠,B則代表位元,圖中為連接埠5中的位元3。》
《圖六 MAXQ系列輸出入單元,輸出入連接埠位元以P.B表示,其中P為連接埠,B則代表位元,圖中為連接埠5中的位元3。》

USB的相容性

當看到程式碼時可能會覺得,就算是只有單顆按鈕的USB裝置難道都需要這麼複雜的工作嗎?這是因為對任何USB裝置來說,都必須有一些基本動作需要執行,幸運地是,USB在設計上規劃詳細,因此整個列舉程式碼可以用來做為任何其他USB裝置的範本,幾乎上只要直接拷貝貼上就可使用。


所有聰明的開發工程師都希望進行的設計能夠取得USB-IF論壇的認證,這將可以擁有使用USB商標的權利,並確保設計可以在任何PC上運行,這個應用通過了USBCV命令驗證(USB Command Verifier 1.2.1.0版)以及USB-IF論壇網站上提供給開發工程師測試套件中的HID測試。



《圖七 Windows Panic Button應用的動作流程圖,這個演算法僅使用29行的C語言程式碼,這個應用包含了連接到USB連接埠的單一按鈕,按下按鈕可以立即縮小或還原開啟中的所有視窗。》 - BigPic:711x532
《圖七 Windows Panic Button應用的動作流程圖,這個演算法僅使用29行的C語言程式碼,這個應用包含了連接到USB連接埠的單一按鈕,按下按鈕可以立即縮小或還原開啟中的所有視窗。》 - BigPic:711x532

結語

如果需要設計一個USB週邊,那麼請參考MAX3420E,這是一款小型、容易設計同時搭配大量免費程式碼的產品,可以為設計添加輸出入接腳,並且能夠與具備SPI支援的系統搭配,由於SPI相當容易利用位元操控的技巧實現,因此這也代表了這個產品可以搭配任何微處理器使用,如果需要更高效能,還可以讓SPI介面以高達26MHz的時脈運作。


---作者為Maxim美商美信公司資深科學家---


相關文章
USB供電5.8 GHz RF LNA具有輸出電源保護
選擇USB轉接驅動器的須知三要點
輕鬆有趣地提高安全性:SoC元件協助人們保持健康
醫療設備高效電源管理之高性能設計
聚焦工業與網通 以生態系統觀點布局市場
相關討論
  相關新聞
» 三動作完成防跌鑑測 AI量測掌握老者個人健康指標
» 2024智慧創新跨域競賽成果出爐 虛實居家樂高體驗遊戲奪冠
» 從創新到落地!精誠AGP攜手8家新創搶攻企業AI商機
» 學研界攜手以AI技術提升碳中和園區、養生村創新服務
» 智慧住宅AI科技上線 開創智能服務新體驗


刊登廣告 新聞信箱 讀者信箱 著作權聲明 隱私權聲明 本站介紹

Copyright ©1999-2024 遠播資訊股份有限公司版權所有 Powered by O3  v3.20.2048.18.116.89.70
地址:台北數位產業園區(digiBlock Taipei) 103台北市大同區承德路三段287-2號A棟204室
電話 (02)2585-5526 #0 轉接至總機 /  E-Mail: webmaster@ctimes.com.tw