0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Maxim USB庫(kù)

星星科技指導(dǎo)員 ? 來(lái)源:ADI ? 作者:ADI ? 2023-06-16 14:41 ? 次閱讀

Maxim USB庫(kù)是使用ARM7?處理器并基于MAX3421E/MAX3420E提供的軟件例程。本應(yīng)用筆記對(duì)系統(tǒng)及其軟件運(yùn)行進(jìn)行了說(shuō)明,在同一ARM? C語(yǔ)言代碼中同時(shí)實(shí)現(xiàn)了USB主機(jī)和外設(shè)功能。這種方法使得USB外圍設(shè)備和嵌入式主機(jī)的開(kāi)發(fā)和研究,具有在USB電纜的另一端帶有參考設(shè)備的優(yōu)勢(shì),而所有的這些都包含在同一的C語(yǔ)言代碼中。

緒論

Maxim USB庫(kù)是兩塊電路板和C語(yǔ)言程序的組合。利用這個(gè)系統(tǒng),可以:

  • 研究、操作、測(cè)試和修改基于ARM7微控制器(μC)與MAX3420E USB外設(shè)控制器連接的USB功能 設(shè)備
  • 研究、操作、測(cè)試和修改基于ARM7微控制器(μC)與MAX3421E USB主機(jī)控制器連接的USB功能 主機(jī) 。圖1顯示了主機(jī)從USB存儲(chǔ)棒中的數(shù)據(jù)檢索。
  • 使用USB電纜將主機(jī)連接至外設(shè),并同時(shí)運(yùn)行主機(jī)和外設(shè)。開(kāi)發(fā)USB主機(jī)或USB外設(shè)代碼時(shí),USB電纜的另一端有一個(gè)參考設(shè)計(jì)是非常有用的。這樣,USB電纜的兩端,主機(jī)和外設(shè)因?yàn)槎际菆?zhí)行相同的C語(yǔ)言代碼,從而具有可控性和定制性。

圖1. MAX3421主機(jī)/ARM從任意的USB外設(shè)重新得到枚舉數(shù)據(jù),并通過(guò)串口連接至運(yùn)行有終端仿真程序的PC來(lái)報(bào)告結(jié)果。

圖1. MAX3421主機(jī)/ARM從任意的USB外設(shè)重新得到枚舉數(shù)據(jù),并通過(guò)串口連接至運(yùn)行有終端仿真程序的PC來(lái)報(bào)告結(jié)果。

硬件

本應(yīng)用C語(yǔ)言代碼運(yùn)行在兩板裝置上:

圖2. Maxim評(píng)估板插進(jìn)Keil MCB2130板。

圖2. Maxim評(píng)估板插進(jìn)Keil MCB2130板。

圖2展示了板級(jí)設(shè)備。藍(lán)色電路板是Keil MCB2130,其中包含一塊ARM7芯片,Philips? LPC2138。這個(gè)微控制器包含2個(gè)SPI?硬件單元,連接至兩塊Maxim USB控制芯片。

豎立的電路板是MAX3421EEVKIT-1。一個(gè)MAX3420E外設(shè)控制器連接至ARM的一個(gè)SPI端口,并布線連接至USB的“B”連接器(J5),在圖2中用“3420 P”標(biāo)記(P代表外設(shè))。MAX3421E主機(jī)/外設(shè)控制器連接至ARM的另外一個(gè)SPI端口,并布線連接至“3421P” (J2)和“3421H” (J1)連接器(H代表主機(jī))。應(yīng)用中運(yùn)行的代碼將MAX3421E作為主機(jī)使用,因此評(píng)估套間電路板中部的USB連接器(J2)沒(méi)有使用。

主機(jī)軟件使用兩個(gè)串口中的一個(gè)(MCB2130電路板上的P1)將USB說(shuō)明信息發(fā)送到運(yùn)行終端仿真程序的PC。終端程序,如Tera終端程序,可以仿真終端(VT100),識(shí)別由程序發(fā)送的專用“轉(zhuǎn)移碼”序列以實(shí)現(xiàn)清屏和指針復(fù)位。終端程序的串口設(shè)置為38400、N、8、1,無(wú)流量控制。

圖2中的米色方盒和帶狀電纜是Keil ULINK JTAG裝載-調(diào)試器。Keil μVision?3開(kāi)發(fā)環(huán)境支持該調(diào)試單元。MCB2130附帶一個(gè)評(píng)估版μVision3,具有完整功能版本的Keil工具集。但評(píng)估版在代碼容量上有16kB的限制。

本應(yīng)用筆記的附件包含整個(gè)Keil工程的源文件,另還有.hex格式的裝載模塊。如有ULINK JTAG單元,可編譯該代碼,并可通過(guò)JTAG端口進(jìn)行加載和調(diào)試。這對(duì)于快速開(kāi)發(fā)USB、修改工作主機(jī)和/或外設(shè)代碼使其適合開(kāi)發(fā)目的是一條極好的途徑。如果沒(méi)有ULINK,可使用稱為Flash Magic的免費(fèi)程序加載、運(yùn)行hex文件,這個(gè)程序可從網(wǎng)站www.esacademy.com獲得。參考Maxim應(yīng)用筆記3937可獲得如何配置和使用該程序的信息。

圖3. MAX3421EEVKIT-1電路板框圖。帶陰影的橢圓形是主要軟件模塊。

圖3. MAX3421EEVKIT-1電路板框圖。帶陰影的橢圓形是主要軟件模塊。

程序功能

圖3顯示了MAX3421EEVKIT-1電路框圖和本應(yīng)用筆記的軟件模塊。MAX3420E和MAX3421E都使用SPI總線訪問(wèn)其寄存器組。LPC2138含有2個(gè)硬件SPI單元:

  • 一個(gè)專用SPI端口(SPI)
  • 一個(gè)通用串行接口(SSP,同步串行端口)

可對(duì)SSP編程以實(shí)現(xiàn)第二個(gè)SPI端口。這些端口的編程不同。例如,SSP有8個(gè)發(fā)送、接收FIFO,而SPI只有1個(gè)讀緩存器。為與MAX3420E和MAX3421E兼容,兩個(gè)SPI接口都編程工作在8位數(shù)據(jù)模式下。軟件模塊SPI_FNs.C包含兩個(gè)USB控制器都使用的寄存器訪問(wèn)函數(shù)。

MAX3420E屬于SPI單元,所以對(duì)這塊芯片來(lái)說(shuō)函數(shù)有一個(gè)“P” (例如Prreg和Preg)前綴,表明外設(shè)操作。MAX3421E屬于SSP單元,所以其訪問(wèn)函數(shù)有一個(gè)“H”前綴(例如Hwreg),表明為主機(jī)操作。

外設(shè)程序

C模塊3420_HIDKB.C實(shí)現(xiàn)一個(gè)通過(guò)使用評(píng)估電路的連接器J5連接至PC機(jī)的USB外設(shè)。MAX3420E的INT輸出引腳連接至ARM7的EINT0 (外部中斷0)引腳。這個(gè)中斷可在由MAX3420E實(shí)現(xiàn)的USB外設(shè)需要服務(wù)時(shí)隨時(shí)觸發(fā)。

本應(yīng)用列舉和實(shí)現(xiàn)了標(biāo)準(zhǔn)的USD HID (人性化接口設(shè)備)。符合標(biāo)準(zhǔn)Windows?平臺(tái)的一大優(yōu)勢(shì)是設(shè)備驅(qū)動(dòng)內(nèi)置在Windows中,從而不需要安裝專用的驅(qū)動(dòng)。Windows將由本應(yīng)用實(shí)現(xiàn)的設(shè)備識(shí)別為一個(gè)標(biāo)準(zhǔn)鍵盤(pán)。按任意的連接至MAX3420E GP-IN引腳的四個(gè)按鈕,將使“鍵盤(pán)”在任意打開(kāi)的接收文本窗中輸入文本字符串,如記事本和寫(xiě)字板。


注意 :本應(yīng)用可在任何可接收文本應(yīng)用中輸入文本,如電子郵件、匯編編輯器、或Word文檔。在按鍵之前請(qǐng)確認(rèn)有一個(gè)安全的應(yīng)用,如記事本被打開(kāi),并處于有效狀態(tài)。作者根據(jù)經(jīng)驗(yàn)可以確定:在一個(gè)打開(kāi)的C源文件中輸入無(wú)效文本將不能進(jìn)行完全編譯。---

主機(jī)代碼

3241_Host_EVK.C文件包含主機(jī)代碼,其使MAX3421E完成一定的枚舉步驟,該枚舉步驟與有USB設(shè)備插入連接器J4時(shí)PC所執(zhí)行的枚舉步驟相似。這個(gè)模塊中的 main() 函數(shù)就像HID鍵盤(pán)代碼的中斷服務(wù)程序。EINT0中斷服務(wù)程序簡(jiǎn)單如下:

// EINT0 Interrupt handler--MAX3420E INT pin
void INT3420 (void) __irq
{
service_irqs();         // Do the USB thing in 3420_HIDKB_INT_EVK.C module
EXTINT      = 1;        // Clear EINT0 interrupt flag (b0)
VICVectAddr = 0;        // Dummy write to indicate end of interrupt service
}

基礎(chǔ)程序 main( ) 包含以下無(wú)限循環(huán)子程序:

while(1)
  {
  detect_device();
  waitframes(200);      // Some devices require this
  enumerate_device();
  wait_for_disconnect();
  }

Enumerate_device() 函數(shù)完成絕大部分的工作,向連接設(shè)備發(fā)送USB請(qǐng)求,并通過(guò)串口報(bào)告結(jié)果。任意的USB設(shè)備插入評(píng)估板的連接器J1,這個(gè)函數(shù)將向設(shè)備發(fā)送枚舉請(qǐng)求,并通過(guò)串口報(bào)告結(jié)果(圖1)。

同步主機(jī)/外設(shè)操作

因?yàn)镸AX3421EEVKIT-1電路板包含一個(gè)USB外設(shè)和一個(gè)USB主機(jī),且它們使用ARM7上單獨(dú)的SPI接口,所以軟件將可以很容易的編寫(xiě),使主機(jī)和外設(shè)應(yīng)用同時(shí)的運(yùn)行。主機(jī)應(yīng)用運(yùn)行 main() 在后臺(tái)與MAX3421E對(duì)話,而HID外設(shè)代碼使用MAX3420E中斷激活 service_irqs() 函數(shù)。

如果用USB電纜連接評(píng)估板的連接器J5和J1,ARM處理器可作為USB主機(jī)與外設(shè)對(duì)話,而這個(gè)外設(shè)就是其自身。圖4顯示了3421_Host.C的主機(jī)代碼詢問(wèn)由3420_HIDKB.C實(shí)現(xiàn)外設(shè)的報(bào)告。

圖4. 通過(guò)USB詢問(wèn)自身的代碼演示

圖4. 通過(guò)USB詢問(wèn)自身的代碼演示

主機(jī)代碼開(kāi)發(fā)

通讀 enumerate_device() 函數(shù)有助于理解USB主機(jī)是如何工作的,也有助于理解如何命令MAX3421E完成枚舉USB設(shè)備時(shí)的各種主機(jī)操作。而開(kāi)發(fā)主機(jī)代碼,如果對(duì)外設(shè)插入主機(jī)的響應(yīng)過(guò)程不清楚,有時(shí)將很難診斷問(wèn)題。如果在全部的控制中(3420_HIDKB.C模塊)擁有參考外設(shè),將使問(wèn)題很容易發(fā)現(xiàn),并可改變?cè)O(shè)備的響應(yīng)以測(cè)試主機(jī)紉件。

外設(shè)代碼開(kāi)發(fā)

主機(jī)是用于開(kāi)發(fā)USB外設(shè)代碼的優(yōu)秀詢問(wèn)工具。MAX3421E和3421_Host.C模塊的結(jié)合,產(chǎn)生一個(gè)簡(jiǎn)單但功能強(qiáng)大的USB信息包生成器和分析器。通過(guò)編寫(xiě)C語(yǔ)言主機(jī)代碼,可以控制外設(shè)狀態(tài);MAX3421E顯示外設(shè)的響應(yīng)過(guò)程。

實(shí)例

假設(shè)編寫(xiě)外設(shè)代碼以處理USB字符串。在hidkb_enum_tables.h文件中按如下方式編寫(xiě)生產(chǎn)商字符串XYZ Widget Company:

// STRING descriptor 1--Manufacturer ID
{
18,             // bLength
0x03,           // bDescriptorType = string
'X','Y','Z',' ','W','i','d','g','e','t',' ','C','o','m','p','a','n','y'
},

編譯該文件,將其裝入ARM的flash存儲(chǔ)器,并運(yùn)行。主機(jī)程序?qū)?bào)告如下生產(chǎn)商字符串:

圖5. 不良結(jié)果,例程沒(méi)有按照要求顯示生產(chǎn)商名字,代碼有問(wèn)題。

圖5. 不良結(jié)果,例程沒(méi)有按照要求顯示生產(chǎn)商名字,代碼有問(wèn)題。

出現(xiàn)了什么問(wèn)題? 原來(lái),USB規(guī)定文本字符串用Unicode表示,即每個(gè)字符用兩個(gè)字節(jié)表示?;仡櫷庠O(shè)的源代碼,更改如下:

// STRING descriptor 1--Manufacturer ID
        {
        35                      // bLength
        0x03,                   // bDescriptorType = string
        'X',0,'Y',0,'Z',0,' ',0,'W',0,'i',0,'d',0,'g',0,'e',0,'t',0,
        ' ',0,'C',0,'o',0,'m',0,'p',0,'a',0,'n',0,'y' // Unicode!
        },

編譯、運(yùn)行,應(yīng)該可以看到:
微信截圖_20200307100422.png
圖6. 正常的代碼例程,使用Unicode格式,可看到結(jié)果。

該結(jié)果有所改善,但并不完美。Company中的“y”到哪去了? 仔細(xì)計(jì)數(shù)該字符串有35個(gè)字符,并將其作為第一個(gè)字節(jié)輸入以顯示字符串長(zhǎng)度。設(shè)計(jì)沒(méi)有注意的是:長(zhǎng)度字節(jié)也是字符串,必須包含前兩個(gè)字節(jié)。代碼最終的修改如下:

// STRING descriptor 1--Manufacturer ID
        {
        37               // bLength
        0x03,                   // bDescriptorType = string
        'X',0,'Y',0,'Z',0,' ',0,'W',0,'i',0,'d',0,'g',0,'e',0,'t',0,
        ' ',0,'C',0,'o',0,'m',0,'p',0,'a',0,'n',0,'y' // Unicode!
        },

這是結(jié)果應(yīng)為如下所示:

圖7. 最佳的代碼實(shí)例。代碼現(xiàn)在可實(shí)現(xiàn)設(shè)計(jì)想要實(shí)現(xiàn)的功能。

圖7. 最佳的代碼實(shí)例。代碼現(xiàn)在可實(shí)現(xiàn)設(shè)計(jì)想要實(shí)現(xiàn)的功能。

通過(guò)測(cè)試外設(shè)代碼和使用主機(jī)控制器及編碼運(yùn)行/分析,由于報(bào)告的結(jié)果是由MAX3420E發(fā)送至MAX3421E的實(shí)際USB報(bào)文,從而可以看到與PC機(jī)響應(yīng)完全相同的結(jié)果。最好的是,這些都可在一個(gè)可控的基礎(chǔ)上實(shí)現(xiàn),因而不必?fù)?dān)心PC機(jī)的如何響應(yīng)而使代碼開(kāi)發(fā)出現(xiàn)錯(cuò)誤。

代碼說(shuō)明

圖8. Keil工程的結(jié)構(gòu)

圖8. Keil工程的結(jié)構(gòu)

圖8顯示了三個(gè)主要模塊,并展開(kāi)顯示了它們的文件依靠。沒(méi)有展開(kāi)的模塊是Keli開(kāi)發(fā)環(huán)境所需要的內(nèi)部處理文件。

SPI_FNs.C

這個(gè)模塊包含由其它兩個(gè)模塊調(diào)用的公用函數(shù)。

void init_PLL(void)

此函數(shù)設(shè)定LPC2138的PLL和時(shí)鐘除法器。附著于LPC2138 (F OSC )的晶體為12.000MHz。根據(jù)公式CCLK = FOSC × M,設(shè)定CPU頻率為48MHz,其中M = 4。LPC2138使用內(nèi)部CCO (電流控制振蕩器)倍頻FOSC以獲得更高的內(nèi)部頻率。FCCO = CCLK × 2 × P。FCCO必須處于156MHz和320MHz之間。對(duì)于P = 2,F(xiàn)CCO = 48MHz × 2 × 2 = 192MHz。


注意 :Keil文件startup.s也包含設(shè)置PLL參數(shù)的啟動(dòng)代碼。 init_PLL() 函數(shù)將有效的取代這些設(shè)置。---


重要警告 :修改這些設(shè)定會(huì)有一定的風(fēng)險(xiǎn)。錯(cuò)誤的設(shè)定能迫使LPC2138超出其規(guī)定的限度,從而使Keil調(diào)試器停止作用。如果這種情況發(fā)生,補(bǔ)救方法是使用Flash Magic公用軟件擦除LPC2138的flash存儲(chǔ)器(使用第二個(gè)串口,連接至Keil電路板的P2),修改代碼中的PLL設(shè)定,然后再試驗(yàn)。---

init_IO

這個(gè)函數(shù)初始化LPC2138的I/O引腳和SPI單元(SPI和SSP):

  • SPI由CCLK/8時(shí)鐘控制,允許最大值。SCLK為48MHz/8 = 6MHz。
  • SSP由CCLK/(2 × VBDIV)時(shí)鐘控制。VBDIV設(shè)置為1,使MAX3421E的SCK信號(hào)為48MHz/2 = 24MHz。MAX3421E的SCK輸入最高可運(yùn)行至26MHz。

關(guān)于SPI接口

SPI接口使用如下信號(hào):* MOSI 主機(jī)輸出數(shù)據(jù),從機(jī)輸入數(shù)據(jù)

  • MISO 主機(jī)輸入數(shù)據(jù),從機(jī)輸出數(shù)據(jù)
  • SCLK 串口時(shí)鐘,由LPC2138提供
  • SS# 從機(jī)選擇,由LPC2138驅(qū)動(dòng)

LPC2138的SPI硬件控制前三個(gè)信號(hào),但SS#使用一個(gè)GP-OUT引腳(P0.7)直接設(shè)置和清除。

關(guān)于SSP接口

雖然SSP有一個(gè)硬件SS#引腳,但使用GP-OUT引腳作SS# (P0.20)更簡(jiǎn)單。

**Hwreg

Hwritebytes**

這些函數(shù)使用LPC2138的SSP硬件向MAX3421E寫(xiě)入寄存器和FIFO數(shù)據(jù)。H前綴表示主機(jī)操作。Hwreg寫(xiě)入一個(gè)信號(hào)寄存器值;Hwritebites向MAX3421E的FIFO寫(xiě)入多個(gè)字節(jié)。

**Hrreg

Hreadbytes**

這些函數(shù)使用LPC2138的SSP硬件從MAX3421E中讀出寄存器和FIFO數(shù)據(jù)。

SSP接口

SSP硬件需要譯碼,從而在發(fā)送和接收通道上需要數(shù)據(jù)FIFO。在一個(gè)SPI操作中,每8位數(shù)據(jù)移總是伴隨著8位數(shù)據(jù)移 。LPC2138使用如下步驟訪問(wèn)MAX3421E的SPI接口:

  1. 觸發(fā)SS# (低)
  2. 發(fā)送由登記號(hào)和方向位構(gòu)成的命令字節(jié)
  3. 發(fā)送/接收一個(gè)或多個(gè)數(shù)據(jù)字節(jié)
  4. 釋放SS# (高)

SPI寫(xiě)操作簡(jiǎn)單明了—每個(gè)數(shù)據(jù)都會(huì)移出,輸入FIFO內(nèi)的數(shù)據(jù)可以被忽略。但讀操作更加復(fù)雜,因?yàn)樽xFIFO至少包含一個(gè)壞字節(jié),即步驟2中自動(dòng)由時(shí)鐘控制記入的。由于以前的多字節(jié)寫(xiě)操作也可以使輸入數(shù)據(jù)失時(shí)效。輸入FIFO不能由硬件禁止或清除。因此,讀SPI數(shù)據(jù)的代碼首先要手動(dòng)清除FIFO,即從SSPDR中讀出字節(jié),直至表示“讀FIFO不為空”的標(biāo)志位被釋放。

**Pwreg

PwregAS

Pwritebytes**

這些函數(shù)使用LPC2138的SPI硬件向MAX3420E寫(xiě)入寄存器和FIFO數(shù)據(jù)。第二個(gè)函數(shù)與第一個(gè)函數(shù)一樣寫(xiě)入寄存器值,但其還設(shè)置SPI命令字節(jié)中的ACKSTAT位。這是停止USB控制轉(zhuǎn)移的捷徑。細(xì)節(jié)請(qǐng)參考應(yīng)用筆記3598,"MAX3420E編程指南"。

**Prreg

PrregAS

Preadbytes**

這些函數(shù)使用LPC2138的SPI硬件從MAX3420E中讀出寄存器和FIFO數(shù)據(jù)。第二個(gè)函數(shù)與第一個(gè)函數(shù)一樣讀出寄存器值,但還設(shè)置SPI命令中的ACKSTAT位。

readout

readout這個(gè)函數(shù)更新連接至MAX3421E通用輸出引腳GPO[6:0]的7段信息顯示,函數(shù)保留GPO[7]的設(shè)置,GPO[7]控制USB “A”連接器(評(píng)估板的J1)的VBUS開(kāi)關(guān)。

3421_Host.C

這個(gè)模塊實(shí)現(xiàn)MAX3421E USB主機(jī),該主機(jī)訪問(wèn)USB設(shè)備并通過(guò)MCB22310的串口報(bào)告枚舉數(shù)據(jù)。作為參考,附錄A給出了主機(jī)枚舉由3420_HIDKB.C實(shí)現(xiàn)的內(nèi)置設(shè)備的LeCroy (CATC)總線過(guò)程。

這個(gè)模塊中有三種函數(shù)類型:

  1. 初始化函數(shù)
  2. 公用函數(shù)
  3. main() 中調(diào)用的高級(jí)函數(shù)

下面的說(shuō)明將按此順序。

Reset_Host

MAX3421E包含上電復(fù)位,因此這個(gè)操作并不是必須的。盡管如此,程序開(kāi)發(fā)階段使用該字段,不需要重復(fù)上電即可初始化調(diào)試過(guò)程,是復(fù)位功能的很好方式。啟動(dòng)該函數(shù)使器件清零,不會(huì)帶有以前的調(diào)試信息。

復(fù)位MAX3421E使片上振蕩器停止工作。解除復(fù)位后,這個(gè)函數(shù)在返回之前將等待OSCOKIRQ位(振蕩器正常中斷請(qǐng)求)變?yōu)橛行А?/p>

initialize_3420

這個(gè)函數(shù)在3420_HIDKB.C模塊中。

initialize_ARM_Interrupts

這個(gè)函數(shù)建立ARM向量中斷如下:

  1. EINT0連接至MAX3420E的INT引腳,使用優(yōu)先級(jí)0 (最高)。
  2. Timer0用于功能發(fā)光體閃爍,使用優(yōu)先級(jí)1。
  3. EINT2連接至MAX3421E的INT引腳,指定優(yōu)先級(jí)為2,在這個(gè)程序中沒(méi)有使用到該中斷。當(dāng)然,這個(gè)中斷是為了方便才提供的。
  4. Timer1用于檢測(cè)發(fā)送/停止按鈕(在3420_HIDKB.C中使用),使用優(yōu)先級(jí)3。

service_irqs

該函數(shù)在3420_HIDKB.C模塊中。它進(jìn)行HID鍵盤(pán)仿真。初始化ARM中斷的代碼僅需將該地址置為一個(gè)中斷向量。

waitframes

用于USB主機(jī)測(cè)量時(shí)間的一個(gè)簡(jiǎn)單方法是計(jì)算1ms幀標(biāo)志的個(gè)數(shù)。當(dāng)微控制器設(shè)定寄存器位SOFKANAB = 1時(shí),MAX3421E自動(dòng)產(chǎn)生這些由全速模式的SOF數(shù)據(jù)包或低速模式的“保持激活”脈沖組成的幀標(biāo)志,隨后FRAMIRQ位每毫秒觸發(fā)一次。

USB 規(guī)定要求確定的長(zhǎng)延遲時(shí)間,例如復(fù)位一個(gè)設(shè)備后給它一個(gè)“復(fù)位恢復(fù)時(shí)間”。調(diào)用waitframes函數(shù)將是實(shí)現(xiàn)相對(duì)長(zhǎng)的延遲時(shí)間的一個(gè)簡(jiǎn)便方法。

detect_device

這個(gè)函數(shù)在檢測(cè)到一個(gè)USB設(shè)備插入U(xiǎn)SB-A連接器J1后返回。

wait_for_disconnect

該函數(shù)在檢測(cè)到一個(gè)插入U(xiǎn)SB-A連接器的設(shè)備斷開(kāi)后返回。

Send_Packet

所有發(fā)送USB數(shù)據(jù)包的函數(shù)都調(diào)用這個(gè)函數(shù)。圖9顯示了IN事務(wù)處理的總線過(guò)程和實(shí)現(xiàn)它的C程序。

圖9. 啟動(dòng)USB總線動(dòng)作,由MAX3421E調(diào)用C程序函數(shù)

圖9. 啟動(dòng)USB總線動(dòng)作,由MAX3421E調(diào)用C程序函數(shù)

  1. 微控制器在FNADDR寄存器中設(shè)定函數(shù)地址。因?yàn)樵谖⒖刂破髦匦螺d入FNADDR寄存器之前,裝載值一直保持不變,所以每個(gè)數(shù)據(jù)包不需重復(fù)這個(gè)步驟。
  2. 微控制器通過(guò)寫(xiě)入HXFR寄存器開(kāi)始傳輸數(shù)據(jù),指明USB令牌和終端。然后等待HXFRDNIRQ (主機(jī)傳輸完成)觸發(fā)IRQ,發(fā)送信號(hào)完成。
  3. 微控制器讀HRSL (主機(jī)計(jì)算結(jié)果)寄存器來(lái)決定事務(wù)處理的結(jié)果。16個(gè)計(jì)算結(jié)果代碼表示下列結(jié)果:

    A.成功(ACK)

    B.設(shè)備占用(NAK)

    C.非正常握手(STALL)

    D.設(shè)備故障,如超時(shí)、串音或總線錯(cuò)誤

  4. 微控制器讀計(jì)數(shù)寄存器字節(jié),然后卸載RCVFIFO并將數(shù)據(jù)存入一個(gè)字節(jié)數(shù)組中。

這個(gè)函數(shù)處理NAK重試,連續(xù)重新啟動(dòng)數(shù)據(jù)傳輸直到:

  1. 收到ACK握手,或
  2. 超過(guò)常數(shù)NAK_LIMIT設(shè)定的預(yù)設(shè)限制

如果設(shè)備無(wú)反應(yīng),函數(shù)重試傳輸,直至受到RETRY_LIMIT限制。

CTL_Write_ND

這個(gè)函數(shù)以無(wú)數(shù)據(jù)模式執(zhí)行控制-寫(xiě)操作( _ND = no data )。這個(gè)函數(shù)僅在主機(jī)Set_Address請(qǐng)求時(shí)調(diào)用。它可以實(shí)現(xiàn)Sent_Packet的兩個(gè)調(diào)用:第一個(gè)用于SETUP數(shù)據(jù)包,第二用于IN-Handshake數(shù)據(jù)包。

IN_Transfer

這個(gè)函數(shù)盡可能多地調(diào)用Send_Packet (指定的IN),以重新獲得USB的數(shù)據(jù)記錄。MAX3420E和MAX3421E終端FIFOS為64字節(jié)長(zhǎng),如此長(zhǎng)的字符描述,舉例來(lái)說(shuō),需要多個(gè)IN請(qǐng)求數(shù)據(jù)包組成一個(gè)大數(shù)組(XfrData[2000])。

CTL_Read

這個(gè)函數(shù)處理3態(tài)CONTROL-Read USB事務(wù),調(diào)用三個(gè)函數(shù):

  1. 調(diào)用Send_Packet發(fā)送SETUP數(shù)據(jù)包
  2. 調(diào)用IN_Transfer使數(shù)據(jù)進(jìn)入XfrDaTa[]中
  3. 調(diào)用Send_Packet發(fā)送OUT-Handshake數(shù)據(jù)包

enumerate_device

這個(gè)函數(shù)執(zhí)行附錄A所示的10個(gè)數(shù)據(jù)傳輸。因?yàn)樗{(diào)用以前的函數(shù)來(lái)實(shí)現(xiàn)低級(jí)USB操作,所以通過(guò)研究這個(gè)函數(shù)可很容易理解枚舉步驟。

print_error

這個(gè)函數(shù)檢查4位HRSL值(圖9中的第3項(xiàng))以打印輸出主機(jī)的傳輸結(jié)果。如果通過(guò)數(shù)據(jù)為0,不打印輸出。這個(gè)函數(shù)返回HRSL值,因此調(diào)用這個(gè)函數(shù)可以很容易地檢測(cè)錯(cuò)誤,例如:

if(print_error(HR)) return;

3420_HIDKB.C

這個(gè)模塊使用MAX3420E實(shí)現(xiàn)一個(gè)USB外設(shè),符合標(biāo)準(zhǔn)HID類,可以象標(biāo)準(zhǔn)鍵盤(pán)輸入一樣自動(dòng)輸入文本。入口點(diǎn)是service_irqs函數(shù),該函數(shù)在響應(yīng)LPC2138的EINT1引腳時(shí)作為中斷服務(wù)程序調(diào)用。ENT1引腳連接至MAX3420E的INT輸出引腳。

Reset_Peripheral

這個(gè)函數(shù)以與Reset_Host相同的方式復(fù)位MAX3420E。

initialize_3420

這個(gè)函數(shù)完成三件事:

  1. 配置MAX3420E SPI接口以實(shí)現(xiàn)全雙工操作(分離MOSI和MISO引腳)
  2. 配置MAX3420E INT引腳為上升沿有效
  3. 通過(guò)應(yīng)用程序使能MAX3420E中斷

service_irqs

這個(gè)函數(shù)直接處理總線復(fù)位和設(shè)備斷開(kāi)。這個(gè)函數(shù)也調(diào)用do_SETUPC處理枚舉和do_IN3處理鍵盤(pán)輸入。


注意 :為精簡(jiǎn)代碼,本應(yīng)用不處理USB的掛起-恢復(fù)任務(wù)。實(shí)現(xiàn)該功能的例子可參考Maxim應(yīng)用筆記3690,"MAX3420E的USB杖舉程序(及其他)"。AN3690中的枚舉代碼作為3420_HIDKB.C的基礎(chǔ)。---

do_SETUP

這個(gè)函數(shù)通過(guò)檢查8字節(jié)SETUP數(shù)據(jù)包中的各個(gè)字節(jié)處理設(shè)備枚舉,然后調(diào)用函數(shù)以處理特定的請(qǐng)求。代碼僅處理USB標(biāo)準(zhǔn)請(qǐng)求類,因?yàn)楸緫?yīng)用程序中沒(méi)有實(shí)現(xiàn)USB分類或客戶請(qǐng)求。

do_IN3

這個(gè)函數(shù)根據(jù)HIDKB_enum_tables.h中的Message[]字符數(shù)組發(fā)出按鍵信息。每字符三個(gè)字節(jié)的格式定義在與HID Report Descriptor相同的文件中,如圖10所示。

圖10. Report Descriptor詳述了一個(gè)鍵盤(pán)按鍵的3字節(jié)數(shù)據(jù)格式

圖10. Report Descriptor詳述了一個(gè)鍵盤(pán)按鍵的3字節(jié)數(shù)據(jù)格式

最終考慮和免責(zé)聲明

插入J1的USB設(shè)備可能是十億個(gè)左右可用設(shè)備的任意一個(gè),因此不必說(shuō),將有各種各樣的響應(yīng)滿足主機(jī)的枚舉請(qǐng)求。任意一個(gè)通過(guò)兼容性測(cè)試的設(shè)備(有USB標(biāo)識(shí)顯示證明)都將在枚舉時(shí)顯示無(wú)誤。本程序中的故障檢測(cè)由每次主機(jī)事務(wù)處理后對(duì)HRSL值的檢查完成。因?yàn)樵S多故障條件難以模擬,所以故障檢查沒(méi)有進(jìn)行廣泛的測(cè)試。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    18924

    瀏覽量

    227210
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7772

    瀏覽量

    262366
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134031
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    建立Maxim USB庫(kù)

    建立Maxim US
    發(fā)表于 04-24 17:31 ?717次閱讀

    Maxim USB庫(kù)

    摘要:Maxim USB庫(kù)是使用ARM7™處理器并基于MAX3421E/MAX3420E提供的軟件例程。本應(yīng)用筆記對(duì)系統(tǒng)及其軟件運(yùn)行進(jìn)行了說(shuō)明,在同一ARM® C語(yǔ)言代碼中同時(shí)實(shí)現(xiàn)了
    發(fā)表于 04-24 17:32 ?1255次閱讀
    <b class='flag-5'>Maxim</b> <b class='flag-5'>USB</b><b class='flag-5'>庫(kù)</b>

    usb插座封裝庫(kù)(包含立式插座)

    自己制作的usb接口的封裝庫(kù),包含市面上常見(jiàn)的usb插座封裝及兩種立式usb插座封裝
    發(fā)表于 09-12 18:22 ?0次下載

    USB培訓(xùn)_Part3_USB_OTG_IP及其庫(kù)的使用

    USB培訓(xùn)_Part3_USB_OTG_IP及其庫(kù)的使用
    發(fā)表于 03-31 10:11 ?23次下載

    USB培訓(xùn)_Part3 USB OTG IP及其庫(kù)的使用

    USB培訓(xùn)_Part3 USB OTG IP及其庫(kù)的使用
    發(fā)表于 09-21 09:48 ?9次下載
    <b class='flag-5'>USB</b>培訓(xùn)_Part3 <b class='flag-5'>USB</b> OTG IP及其<b class='flag-5'>庫(kù)</b>的使用

    STM32 USB培訓(xùn)_Part2 USB IP及其庫(kù)的使用

    STM32 USB培訓(xùn)_Part2 USB IP及其庫(kù)的使用
    發(fā)表于 09-21 09:52 ?5次下載
    STM32 <b class='flag-5'>USB</b>培訓(xùn)_Part2 <b class='flag-5'>USB</b> IP及其<b class='flag-5'>庫(kù)</b>的使用

    04 USB庫(kù)介紹

    04 USB庫(kù)介紹
    發(fā)表于 10-11 09:26 ?4次下載
    04 <b class='flag-5'>USB</b><b class='flag-5'>庫(kù)</b>介紹

    STM32的USB庫(kù)深入解析

    STM32的USB庫(kù)深入解析
    發(fā)表于 10-15 09:21 ?89次下載
    STM32的<b class='flag-5'>USB</b><b class='flag-5'>庫(kù)</b>深入解析

    usb集成封裝庫(kù)下載

    usb集成封裝庫(kù)
    發(fā)表于 04-22 11:55 ?598次下載

    介紹USB IP庫(kù)是什么?

    USB IP庫(kù)介紹(上)
    的頭像 發(fā)表于 07-05 00:13 ?6302次閱讀
    介紹<b class='flag-5'>USB</b> IP<b class='flag-5'>庫(kù)</b>是什么?

    AD USB C封裝庫(kù)下載

    AD-USB-C封裝庫(kù)免費(fèi)下載。
    發(fā)表于 07-12 14:37 ?0次下載

    AT32講堂046 | 雅特力AT32 MCU USB設(shè)備庫(kù)的架構(gòu)和使用方法

    AT32USB設(shè)備協(xié)議庫(kù)這部分主要介紹AT32USB設(shè)備庫(kù)的結(jié)構(gòu)和庫(kù)的使用方法,AT32USB
    的頭像 發(fā)表于 02-22 11:23 ?5676次閱讀
    AT32講堂046 | 雅特力AT32 MCU <b class='flag-5'>USB</b>設(shè)備<b class='flag-5'>庫(kù)</b>的架構(gòu)和使用方法

    USB IP及其庫(kù)的使用

    電子發(fā)燒友網(wǎng)站提供《USB IP及其庫(kù)的使用.pdf》資料免費(fèi)下載
    發(fā)表于 07-31 11:15 ?0次下載
    <b class='flag-5'>USB</b> IP及其<b class='flag-5'>庫(kù)</b>的使用

    USB IP設(shè)備庫(kù)講解

    電子發(fā)燒友網(wǎng)站提供《USB IP設(shè)備庫(kù)講解.pdf》資料免費(fèi)下載
    發(fā)表于 08-01 10:07 ?1次下載
    <b class='flag-5'>USB</b> IP設(shè)備<b class='flag-5'>庫(kù)</b>講解

    STM32Cube USB設(shè)備庫(kù)

    電子發(fā)燒友網(wǎng)站提供《STM32Cube USB設(shè)備庫(kù).pdf》資料免費(fèi)下載
    發(fā)表于 09-21 11:06 ?8次下載
    STM32Cube <b class='flag-5'>USB</b>設(shè)備<b class='flag-5'>庫(kù)</b>