新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用嵌入式USB主控進行設計

        利用嵌入式USB主控進行設計

        作者: 時間:2013-10-26 來源:網絡 收藏

        USB(通用串行總線)于1995年面世,目前已發展成為一種解決個人計算機與外設連接問題的事實標準。由于USB的應用極為廣泛,因此對嵌入式系統的總線外部擴展與連接應用來說,它也有著巨大的吸引力。

        如今,集成后,嵌入式產品(如測試設備等)就可以和各種價格低廉、獲取方便的外設實現連接,如鍵盤、鼠標和打印機。對同時扮演USB主端、外設(從端)雙重角色的裝置的需求,在移動裝置迅速流行的推動下也在不斷增長。具有雙重身份的這些裝置,可以讓PDA、打印機等傳統USB外設在無PC的情況下直接實現相互通信。

        USB之所以廣受歡迎,其原因主要在于使用的方便性。消費者不論何時、把何種USB裝置插入PC中,它都可以實現無縫工作。這種即插即用能力的實現,離不開各式各樣的USB主端裝置以及Microsoft Windows中驅動軟件的有力支持,但在嵌入式應用環境中卻還找不到這樣的支持。

        我們從不同層次上對USB通信流進行考察,就會發現完整的系統要包含如下三種基本要素:

        傳統的USB主控設計將整個主控系統劃分為主端控制器(host controller)和控制器之外的整套USB軟件。圖1示出了USB主控系統組成單元與傳統的主機體系結構間的

        主端控制器一般制作成單獨的一塊芯片,其中包括了物理和數據鏈路層硬件(如USB收發器)、SIE(串行接口引擎)等,以及一個可以附加到上的總線接口。USB固件(主控棧和裝置驅動)駐留在帶有USB主端控制器的中。

        USB硬件和固件的分離反映了一個現實:USB從根本上來說是一種PC總線的外部擴展機制。從USB固件的角度來看,PC提供了無窮無盡的系統資源。此外,PC行業已經實現標準化,統一于一個OS平臺——Microsoft Windows,而這一操作系統天生就具備支持USB主控棧和裝置驅動的能力。由于擁有極為豐富的系統資源和軟件支持,所以傳統的USB主控體系結構是PC應用的一種理想的解決方案。

        相形之下,嵌入式系統的設計者們若要把傳統的USB主控移植到嵌入式裝置中,卻需要理清多方面的問題。嵌入式設計的挑戰,根源在于把USB固件與嵌入式應用及其基礎計算平臺集成為一體時所需解決的復雜問題。

        首先,嵌入式裝置一般帶有的系統資源(和存儲器)容量有限。在系統處理器上運行USB主控固件,不僅會占用目標應用的資源,而且還會造成對應用固件的大量反復寫入和優化。

        其次,嵌入式應用一般要對實時事件作出明確的響應。把USB固件添加到系統中,就會增加復雜性,導致在實時應用的設計和調試中出現更多中斷和實時事件。

        最后,嵌入式市場具有種類繁多的處理器和實時操作系統。將USB固件開發和移植到任何特定處理器/實時操作系統平臺的努力都將花費大量時間,而且需要工作人員在USB技術上具有很高的專業技能。由于USB規范的內容繁多,因此,對于一個設計周期為6~12個月的典型嵌入式項目來說,學習過程實在過長,也過于艱深。

        克服嵌入式裝置中USB主控設計的復雜性問題,方法之一就是把與USB即插即用能力相關的智能揉入USB主端控制器本身之中。要做到這一點,所采取的辦法是:

        該設計方法,可以為我們帶來一個無需系統處理器干預就能處理USB主控活動的USB主端控制器。它不僅讓系統資源的消耗降至最低,而且也將通過系統總線的USB數據流減至最小。

        這種設計方法的另一個好處則是簡化了所生成的API。API的設計將簡單易行,并且獨立于處理器和實時操作系統,從而有效地降低了API集移植和集成的難度。

        相應的,任何一種專用USB裝置驅動都可以由這一不大的API集開發而成。為了進一步降低USB主控實現的復雜程度,USB裝置的驅動也應該以獨立于處理器/實時操作系統的API形式建立,并呈現給系統設計者。裝置驅動API可讓已有的和新出現的嵌入式應用很快集成USB主控功能。

        Atmel公司的AT43USB370 USB主控/功能處理器的設計,采用了上文提到的設計方法,其目標就是將復雜的USB問題屏蔽掉。下面的實例將向讀者表明,利用AT43USB370 海量存儲裝置驅動API,開發一個海量存儲器應用只需少數幾個步驟即可。設計目標是從相連的USB儲存裝置的根目錄下讀取一個文件。

        file://step1: 等待裝置完成盤點
        connectStatus = MS_Get_Final_Stat();
        DeviceAddr = connectStatus.Dev_Addr; file://裝置地址
        DriveNum = connectStatus.Part_Num;//分區數
        // Step2:獲取根目錄的內容 (ID 0x00)
        cmdResponse = Get_Dir(DeviceAddr,DriveNum,0x00);
        CommandId = cmdResponse.CmdId;
        getDirStatus = MS_Get_Final_Stat(); file://等待目錄信息
        if (getDirStatus.Get_Cmd_Id == CommandId)
        {
        file://目錄信息采取getDirStatus.pDir_Buff結構
        }
        // Step 3:為文件內容安排緩沖
        int* pMSC_File =(int*)malloc(0x00008023*(sizeof (unsigned char)));
        // Step 4:將文件內容讀到緩沖器內
        // ID據報為 0x0000F17C,大小= 0x8023
        cmdResponse = Read_File(DeviceAddr,DriveNum ,
        0x0000F17C,pMSC_File, 0x00008023);
        CommandId = sreadIntCmdResponse.CmdId;
        readStatus = MS_Get_Final_Stat();
        if (readStatus.Get_Cmd_Id == CommandId)
        {
        file://文件已被拷貝到pMSC_File緩沖中
        }

        總而言之,USB的即插即用功能需要充分的固件支持。嵌入式環境中USB主控和裝置驅動固件的缺乏會導致產品開發周期的延長。因此,在選擇嵌入式USB主控時,固件的體系結構和可用性應該作為重點來考慮。設計完善的嵌入式主控應該將消耗的系統資源降至最低,讓傳輸到系統處理器的USB往來數據流量、中斷等減至最少,讓所呈現的API集簡單化,并將復雜的USB協議問題隱藏起來。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 高密市| 河西区| 沭阳县| 师宗县| 辛集市| 庆阳市| 枣阳市| 湘西| 长葛市| 深泽县| 绿春县| 原阳县| 得荣县| 威宁| 准格尔旗| 淮滨县| 河池市| 琼海市| 蓬安县| 常德市| 沂南县| 岳阳县| 永丰县| 大洼县| 葵青区| 汶川县| 肥城市| 五台县| 铜川市| 汉寿县| 太仓市| 加查县| 宁国市| 印江| 五莲县| 清水县| 濮阳县| 锡林郭勒盟| 海兴县| 武宁县| 自治县|