教你為任何系統增加USB_第1頁
教你為任何系統增加USB_第2頁
教你為任何系統增加USB_第3頁
教你為任何系統增加USB_第4頁
教你為任何系統增加USB_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、為任何系統增加加USB引言有關通用串串行總線(UUSB)的文文章通常從UUSB是個人人電腦的一個個新連接標準準開始講起。謝謝天謝地現在在不再需要如如此做,因此此本引言可以以簡短地寫為為:如果你有有一個嵌入式式系統并且想想連到PC,主主流的連接通通道是USBB。本文介紹紹了一款Maaxim最新新推出的芯片片,MAX33420E,它它可以很容易易地把USBB加入到任何何系統中。本本文主要著重重于SPI接接口,提供了了實現通用SSPI的C例例程。最后給給出了一個簡簡單的USBB HID (人機接口口設備) 基于Wiindowss的應急按鈕鈕程序。 為任何系統增加加USB微控控制器(CC)的選擇通通常

2、基于它所所集成的外設設。許多處理理器集成了UUSB功能,但但是大多數處處理器,特別別是一些低價價位的處理器器不含USBB。有時,您您可能選用了了一個I/OO和外設都很很完美的微控控制器,但它它卻缺少USSB。您是否否希望只是添添加USB功功能而繼續使使用當前的微微控制器呢? 利用Maaxim的芯芯片MAX33420E,可可以為任何處處理器添加UUSB功能。MMAX34220E集成了了USB全速速收發器、智智能USB串串行接口引擎擎(SIE)和一個可工工作到26MMHz時鐘的的從SPI接接口。MAXX3420EE的使用如同同一個具有單單個控制端點點、兩個雙重重緩沖的644字節數據端端點和一個66

3、4字節的中中斷端點的全全速USB外外設。總線供電圖1. USB供電圖1是一個普通通的USB外外設結構。UUSB的VBBUS電源線線為3.3VV穩壓器提供供5V輸入,該該穩壓器給微微控制器和MMAX34220E供電(無需墻上適適配器)。SSPI接口可可以是3、44或5線。表表1列出了55線接口。表1. 使用33到5線的SSPI接口 如果應用中不需需要中斷(MMAX34220E的中斷斷條件可以通通過讀取寄存存器直接檢測測到)s,可可以去掉INNT引腳,得得到一個4線線接口。如果果SPI主機機具有雙向數數據接口(MMOSI/MMISO),則則可以省掉另另外一條接口口線,這樣,沒沒有中斷、支支持雙向通

4、信信的SPI接接口只需要33個引腳。如果微控制器沒沒有SPI接接口怎么辦呢呢?沒問題,可可以很容易地地設計一個直直接觸發GPPIO的、固固件形式的SSPI主控器器。USB的的一個非常強強的特性是自自控流量能力力,它自動配配合SPI側側的任何速度度(它利用在在USB側插插入NAK握握手來提示“忙忙,重試”)。很多USSB外設,特特別是與人接接口的,即使使與最低速的的SPI接口口都能應答自自如。如果圖1中的微微控制器非常常小,只有110腳以下怎怎么辦呢?難難道就不能把把這些珍貴的的I/O口用用來連USBB芯片了?不不,這就是為為什么MAXX3420EE提供了四個個通用輸出口口和四個通用用輸入口的原

5、原因,它們可可以替代被用用掉的處理器器上的I/OO口,事實上上你的系統在在接上MAXX3420EE后還得到了了更多的口線線。大規模集成芯片片圖2. 只連接大規模集成芯片的少許引腳MAX34200E不僅僅只只限用于小系系統。圖2說說明了如何給給一個ASIIC,FPGGA,DSPP和其他大芯芯片增加USSB功能。這這樣做的一個個明顯原因是是大芯片沒有有內建的USSB或內部的的USB不是是正好符合你你的所需。另另一個原因是是隨著工藝尺尺寸的縮小,這這些大片子不不能兼容USSB所需的33.3V “高高”壓,此時時使用外部帶帶低壓SPII接口的USSB芯片就是是一個很好的的方案。MAAX34200E內帶

6、電平平轉換器,VVL腳設定接接口電平的范范圍,從1.7V到3.6V。隔離USB圖3. 隔離USB如圖3所示,由由于SPI接接口信號是單單向的,還很很容易進行光光隔。同時還還可以設定較較低的速率來來支持廉價的的光耦。SPI接口SPPI (串行行外設接口)是一個簡單單的串行接口口,它使用兩兩根數據線,一一根串行時鐘鐘和一個片選選信號。SPPI主控把SSS#拉低來來開始傳輸,然然后驅動串行行時鐘SCLLK來把數據據同步輸入和和輸出從設備備。SPI主主控通過把SSS#拉回到到高電平,以以終止傳輸。SPI接口有四種時鐘模式,反映了兩個信號CPOL (時鐘極性)和CPHA (時鐘相位)的兩個狀態。這兩信號

7、以(CPOL, CPHA)的形式來表示。可以證明一個接口利用正沿SCLK且在第一個正沿時鐘到來以前MOSI數據已經準備就緒可以工作在(0,0)和(1,1)模式而無需任何改變。這一屬性使MAX3420E無需額外的模式引腳設置,就可以工作在(0,0)或(1,1)模式。圖4和圖5顯示示了利用SPPI模式在微微控制器(MMAXQ20000,隨后后介紹)和MMAX34220E之間的的數據傳輸。圖圖4所示為(0,0)模模式,圖5所所示為(1,1)模式。兩兩者的區別是是SCLK信信號的無效電電平不同,(0,0)是是低無效,(1,1)是是高無效。MAX34200E每次傳輸輸接收的第一一個字節是命命令字節。命命

8、令字節包含含寄存器號和和方向位,第第二個字節和和后續字節包包含數據。在在圖4和圖55中,移入命命令字時,來來自MAX33420E (MISOO引腳)的88位數據是UUSB狀態位位。此特性只只在使用分離離MISO和和MOSI腳腳的接口中有有效。SPI代碼編寫寫MAX34420E通用用C代碼的竅竅門是把原始始的最基本的的SPI操作作封裝到獨立立的模塊中,然然后針對不同同的SPI接接口的只需客客戶化這一模模塊。最基本本的模塊只須須做三件事: 初始化SSPI口 讀讀一個字節 寫一個字節節 本文中的的應用例子使使用硬件SPPI單元。對對沒有此單元元的SPI主主控器,我們們先看看一些些位仿真SPPI接口的

9、通通用C代碼。位仿真SPIInit SPI初始化SPI口的函數會隨處理器的不同而有很多變化。比較好的做法是先指定接口使用的I/O腳,設置它們的方向,然后設定SS=1和SCLK=0的初始條件(我們假定用SPI主控器的(00)模式)。讀寄存器,寫寄寄存器rreeg是讀取MMAX34220E寄存器器的C函數,這這個宏把功能能從不同微控控制器的不同同I/O結構構中獨立出來來,使用宏使使代碼易讀且且與處理器無無關。wreeg是寫MAAX34200E寄存器的的例程。更換處理器時,只只需對宏進行行修改即可使使用這些例程程。例如:下下面是用于不不帶硬件SPPI單元的微微控制器的宏宏。 #definee SCL

10、KK_HI OOUTA = PINSSA | 00 x02;#definne SCLLK_LO OUTA = PINNSA & 0 xFD;#defiine SSS_HI OOUTA = PINSSA | 00 x04;#definne SS_LO OUUTA = PINSAA & 0 xxFB;#ddefinee MOSII(v) OOUTA = (PINNSA & 0 x7F) | (vv & 0 xx80);#definne MISSO invval |= PINSSA & 00 x01; BYTE rrreg(BYYTE r) / RRead aa regiister, retuurn

11、 itts jj;BYTEE bv,iinval;invall = 0;SS_LOObv = r3; / LLeft-sshift the rreg nuumber, WRITTE=0foor (j=0; j8; j+) / sendd the regisster nnumberr and direcction bitMOSI(bv) / putt out a bittbv = 1; / shhift oone biit lefftSCLKK_HISCCLK_LOOfor (j=0; j7; j+) / geet 7 bbits aand shhift lleft iin

12、to invallSCLK_HIMISSOinvaal = 1; / shiift inn one bitSCCLK_LOOSCLK_HI / one more bit, but ddont shiftt invval tthis ttimeMIISOSCLLK_LOSSS_HIrreturnn invaal; / retuurn thhe bytte we read invoid wrreg(BYYTE r,BYTE v) / regiister, valuueint jj;BYTEE bv;SSS_LObbv = (r3)+2; / Lefft-shiift thhe regg numbb

13、er, sset thhe WRIITE diirectiion biitfor (j=0; j8; j+) / ssend tthe reegisteer nummber aand diirectiion biitMOSI(bv) / putt out a bittbv = 1; / shhift oone biit lefftSCLKK_HISCCLK_LOOfor (j=0; j8; j+) / seend thhe reggisterr dataaMOSI(v) / put out aa bitvv = 1; / shifft onee bit leftSSCLK_HHISCLKK_L

14、OSS_HII硬件SPI這一一部分討論上上面提到的MMAXQ20000微控制制器,簡單地地說,MAXXQ20000是低功耗、116位、高性性能RISCC處理器家族族中的第一個個。“Q”代代表安靜,表表示這一結構構能夠與敏感感的模擬電路路很好地協調調工作。MAAXQ20000內建了一一個SPI口口,它與MAAX34200E配合特別別合適,下面面的例子使用用MAXQ22000開發發板和MAXX3420EE搭建了一個個簡單、有趣趣的Winddows小產產品。MAXXQ20000硬件SPII單元提供了了SCK、MMOSI和MMISO,但但是沒有SSS#。由于SSS#的操作作方式會變化化(比如尋址址一個

15、字節與與突發的字節節串),最好好用通用I/O腳做SSS#。MAXQ I/O單元圖6. MAXQ I/O單元圖6所示是一個個基本的MAAXQ I/O單元。II/O口以格格式porrt.bitt表示,p代表端端口,b代表位。作作為例子,我我們主要討論論I/O口55,第3位(用P53)表示。每一個I/O單單元有一個觸觸發器,本例例中用一個稱稱為PO5.3的位來寫寫。O代代表輸出。你你一直可以寫寫這個觸發器器,它的輸出出有沒有與引引腳相連由方方向位決定。配配置輸出腳時時,實際應用用時先寫觸發發器再連到引引腳比較好,這這樣它可以避避免引腳上出出現毛刺。P53腳的方向向由稱作PDD5.3的位位來設定。D代

16、表方方向,D信號號充當引腳驅驅動的輸出使使能:1 = 驅動,00 = 浮空空。引腳的狀狀態一直可以以通過稱作PPI5.3的的位讀取,I代表輸輸入,無論引引腳是如何驅驅動的,被內內部觸發器(PD5.33 = 1)還是被外部部的信號(PPD5.3 = 0),PPI位表示引引腳狀態。這種結構的一個個好處是如果果引腳被配制制成輸入(PPD5.3 = 0),觸觸發器的輸出出沒有被用作作輸出,那么么它可以作為為上拉電阻的的開關重新利利用。如果DD = 0,00信號被重新新定義,表示示“連接一個個上拉電阻”,如如圖6中的點點狀線所示。許多I/O腳有有中斷功能,如如圖6下面的的框圖所示,中中斷模塊有三三個信號

17、: 一個中斷標志位位,中斷請求求有效時被置置位,由CPPU來復位。 一個邊沿選選擇位,決定定是正信號跳跳變還是負信信號跳變引起起中斷請求。 對每一個能能引起中斷的的引腳有一個個中斷使能位位。 我們的的應用例子把把MAX34420E的中中斷輸出配置置成正邊沿觸觸發中斷,在在MAXQ22000這邊邊,程序直接接測試USBB中斷的中斷斷觸發器,而而不是使用MMAXQ20000的中斷斷系統。程序序除了檢測按按鍵的狀態和和響應USBB請求外什么么都不干,因因此只需一個個查詢循環。初始化SPIMAXQ2000的I/O引腳由通用I/O和像SPI單元這樣的特殊功能硬件共享。使用特殊功能硬件時,先配置硬件塊,然

18、后把它連到I/O腳上。程序清單中的SPI_Init()過程設置了引腳方向,配置了SPI接口,最后使能它。 void SPPI_Iniit(voiid)/ MAAXQ20000 SPII porttCKCN = 0 x000; / systtem cllock ddivisoor is 1SS_HHI / SS# hhigh PPD5 |= 0 x0770; / Set SPI ooutputt pinss (SS, SCLKK, DOUUT) ass outpput.PDD5 &= 0 x0880; / Set SPI iinput pin (DIN) as innput.SSPICK = 0

19、 x000; / fasttest SSPI cllock-div bby 2 SSPICF = 0 x000; / modee(0,0), 8 bbit daataSPIICN_biit.MSTTM = 11; / Set QQ2000 as thhe masster.SSPICN_bit.SSPIEN = 1; / Ennable SPI/ MAX33420E INT ppin iss tiedd to MMAXQ20000 P660; maake itt an iinputPPD6 &= 0 x001; / PD6.0=0 (turn off ooutputt)讀寄存器,寫寄寄存器以下函

20、函數利用了MMAXQ20000硬件SSPI單元的的優點,因此此比起那些位位仿真代碼尺尺寸小而且快快。 / Read a MAXX3420EE regiister, retuurn itts vallue.BYYTE rrreg(BYYTE reeg)BYTE dum;SSS_LOSSPIB = reg3; / regg numbber w. dir=0 (INN)whille(SPIICN_biit.STBBY); / looop if data stilll beinng senntdum = SPIIB; / readd and toss the iinput byteSSPIB=00 x

21、00; / daata iss dont carre, weere cclockiing inn MISOO bitsswhilee(SPICCN_bitt.STBYY); / loopp if ddata sstill beingg senttSS_HIIreturrn(SPIIB);/ Writte a MMAX34220E reegisteer.voiid wreeg(BYTTE regg, BYTTE datt)SS_LOO / SSet SSS# lowwSPIB = (reeg3)+2; / sennd regg. nummber ww. DIRR bit (b1) set tto

22、 WRIITEwhiile(SPPICN_bbit.STTBY); / looop iff dataa stilll beiing seentSPIIB = ddat; / sennd thee dataawhilee(SPICCN_bitt.STBYY); / loopp if ddata sstill beingg senttSS_HII / sset SSS# higgh例子:基于Wiindowss的應急按鈕鈕這個USBB小產品是一一個USB HID,或或人體學輸入入設備-單個個按鍵。當你你按下按鍵,所所有的活動窗窗口被最小化化,你看到的的僅剩桌面,再再按一下它,所所有的應用窗窗口又重新

23、彈彈回來。USSB鍵盤很有有意思,如果果插入幾個鍵鍵盤,它們將將同時有效。所所以我們的小小應急按鈕可可以和你的正正常鍵盤一起起工作。如果PC在待機機,這個應急急按鈕擔當了了一個新角色色-它可以充充當PC的遠遠程喚醒按鍵鍵。不過這取取決于你的PPC支持不支支持USB喚喚醒,有些可可以,有些不不可以。這個個按鈕可以幫幫你判斷你的的PC可不可可以。此例程在帶有一一個USB子子卡(包含MMAX34220E)的MMAXQ20000開發板板上運行。USB詳細說明明這個應用代代碼包含了UUSB做枚舉舉類型瑣碎工工作的樣板代代碼,此設備備的屬性已經經用Paniic_Buttton_EEnum_DData.hh

24、中的特性陣陣列完全描述述。這個應用使用了了兩個端點,強強制的CONNTROL端端點0,和EEP3-INN,單緩沖664字節端點點。雖然MAAX34200E內含兩個個雙重緩沖的的64字節端端點(EP11-OUT和和EP2-OOUT),在在這個應用中中并不需要雙雙重緩沖的吞吞吐優勢。一個普遍存在HHID錯誤概概念是HIDD設備僅僅工工作在低速下下,本例展示示了即使是像像鍵盤這樣的的東西也可以以從全速運行行中得到好處處,通過發送送12MHzz的包來而不不是1.5MMHz包,它它可以使用更更低的總線帶帶寬。圖7. 應急按鈕的流程圖中斷端點有查詢詢間隔,它決決定了USBB主設備隔多多久向IN端端點要數據

25、。每每隔一段時間間我們可以預預計到主控制制器發了一個個IN請求給給我們的設備備端點3。圖圖7顯示了處處理這些請求求的一個簡單單的狀態機。只只要設備被例例舉了,處理理器重復地執執行這一過程程。為了簡單單起見,該應應用程序查詢詢中斷腳是否否有效,當然然,如果你還還有其他事要要微控制器處處理,你會用用中斷來激活活Do_INN3函數。狀態機使用了兩兩個全局變量量:statte和buttton。CC宏定義了三三個狀態:IIDLE, RELEAASE和 WWAIT 。狀狀態變量初始始化為IDLLE。如果連連在MAX33420E的的GPIN00上的按鍵按按下,變量bbuttonn是高,否則則為低。Maain

26、()中中的無窮循環環增加一個按按鍵檢查定時時器,當定時時器到時它會會讀一下MAAX34200E中的GPPIO寄存器器來決定按鍵鍵狀態。此方方法省掉了不不必要的SPPI流量。當按鍵處于彈起起狀態時,狀狀態圖轉到左左邊的兩個分分支,不做任任何事。如果果按鍵在IDDLE狀態被被按下,就發發一個清除桌桌面上活動窗窗口的鍵碼。鍵鍵碼次序是008 (wiindowss鍵) 000 (保留)和07 (字母d)。下下一個狀態轉轉到RELEEASE,這這樣就完成了了。只要MAX34420E把數數據包送到UUSB,它就就產生另一個個EP3-IIN中斷請求求來表示EPP3-IN FIFO可可以再一次裝裝載數據。然然

27、后再次進入入圖7函數,此此時狀態sttate = RELEEASE ,因因此函數發送送序列00 00 000來表示“按按鍵彈起”,下下一個狀態進進入WAITT,意思是“等等待按鍵被釋釋放”。現在函數要做的的所有工作是是利用WAIIT狀態分支支程序來檢測測按鍵釋放。如如果按鍵一直直按著,程序序不做任何事事,當按鍵一一被釋放,狀狀態圖就進到到右邊的兩個個分支,重新新初始化sttate 變變量為IDLLE,使函數數等候下一個個按鍵按下。占大部分運行時時間的代碼只只有少數幾行行,圖7給出出了流程圖: void Doo_IN3(void)switcch(staate)case IDLE:if (bbut

28、tonn)wreg(rEP3IINFIFOO,0 x088); / Winndows preffix keeywregg(rEP33INFIFFO,0);wreg(rEP3IINFIFOO,0 x077); / D keywrreg(rEEP3INBBC,3); / aarm itt statte = RRELEASSE; / nextt statte sennds thhe keeys upp coddebreakk; / else do noothingg (andd the SIE wwill NNAK)/case RELEAASE:wreg(rEP3IINFIFOO,0 x000);

29、/ key upwreeg(rEPP3INFIIFO,0 xx00);wwreg(rrEP3INNFIFO,0 x00); / key uupwregg(rEP33INBC,3); / armm itsttate = WAITT; / next statee waitts forr the PB too be uunpresssedbreakk; casse WAIIT:if (!buttton)sstate = IDLLE;breeak;deefaultt: staate = IDLE; / end sswitchh 代碼關鍵需要對對代碼中的一一些細節加以以說明。時間間敏感的USSB事件MA

30、AX34200E 通過在在USB總線線上送K狀態10mms時間發了了一個遠程喚喚醒信號,為為了避免用SSPI主控器器來做設定時時間這種雜活活,MAX33420E用用自己內部來來定時這個信信號(事實上上,所有的UUSB時間敏敏感事件),然然后在時間到到時給SPII主控器發一一個中斷。SSPI主控器器對這些事件件不必用上它它自己的定時時器-它只需需啟動操作,然然后等待完成成中斷。ACKSTATT位函數rrregAS和和wregAAS的功能與與rreg和和wreg只只有一點不同同,它們在SSPI命令字字中設了ACCK STAATUS位。SSPI主控器器(我們的例例子中是MAAXQ20000)用這一一位表示MAAX34

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論