<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • [資料分享] 悍馬1788USB學習筆記

    發布時間:2016-12-22 10:54    發布者:旺寶科技測試丘
    關鍵詞: 悍馬 , 1788USB , 學習筆記
    LPC1788—USB學習 第一章;開發板和PC實現連接 第一篇:了解硬件 本開發板是基于NXP的LPC1788FBD208基礎上研發的一款開發板。LPC1788內部集成ARM Cortex-M3微控制器,是NXP 半導體針對各種高級通訊,高質量圖像顯示等應用場合而設計的一款具有高集成度的SOC。居然是針對各種高級通訊,那么學習USB那就是可以的。 USB電路圖如下圖

    圖(111
    如果想要開發USB Device需要把J19J20兩個撥碼開關的“1”和“2”接通,使USBD2-D2+連接到J16USB Device接口。下面的J17USB主機的,有人就會問現在學USB DeviceUSB Host電路圖貼出來干嘛!不急等下我們就會說到,現在先不用管它。
    第二篇:USB基礎知識
    當我們每次用到帶有USB接口的設備感覺就是兩個字“方便”。拿到USB數據線兩頭一插就OK,F在我們就從把數據線插入電腦的那一瞬間開始說起。那些什么同步啊拓撲結構啊啥的先拋開,嫩得我們費腦子胡思亂想,到后來想了半天不知道干嘛。
    有細心的朋友可能都看到圖(11)電路圖,USB DeviceUSB Host兩個電路的不同,在USB Device電路中D2+的線上連接了一個1.5K電阻經過了一個三級管Q13.3V(高電平),而在USB Host電路中D2-D2+上各經過了一個10K的電阻到地(低電平)。我們電腦上的USB接口就是USB Host,內部電路就和上圖的USB Host類似。當我們把USB Device插入到電腦時,電腦上的USB接口就會有一個5V電壓給我們的USB DeviceUSB Device內部硬件初始化,而內部的硬件就會從USB_CONNECT2輸出一個信號給三極管Q1讓三極管導通把USB DeviceD2+拉為高電平,這時電腦上USB HostD2+由原來的低電平也變為高電平。這時在電腦上就會檢測到發現新硬件,而且是一個無法正常運行的設備,如圖121。這設備管理器中的通用串行總線控制器會出現一個未知設備,如圖122。
    圖(121
    圖(122
    這個過程當中主機檢測到有設備插入就會向設備發送一些數據,而這些數據是設備剛插入主機時主機所要設備描述符的控制傳輸,F在我們的設備沒有任何驅動程序來響應“組織的號召”,所以我們的“中央”就不知道如何來加載主機驅動來管理我們的設備,“中央”就會把它拉入黑名單說,硬件安裝出現問題,設備不能正常運行,所以在設備管理器中就冒出了一個未知設備。在未知設備上點右鍵屬性,在詳細信息選項卡中會看到VIDPID都是0。如圖23a,圖23b是枚舉成功的大容量存儲設備。
                              圖(123a                                                                                                  圖(123b
    第三篇:軟件配置
    我們來看一下程序在悍馬1788是如何實現連接的。工程創建不講述。
    /**********************************************************************
    函數功能;主函數
    函 數 名;main
    函數參數;無
    函數返回;無
    ***********************************************************************/
    int main (void)
    {
            debug_frmwrk_init();                /*串口調試初始化,
    用于打印調試信息
    和主機發給開發板
    的數據還有開發板
    發給主機的數據。*/
            print_menu();                                        //打印字符串。
            USB_Init();                              // 初始化USB
            USB_SetDevCondition(DEV_CON);        // 鏈接USB                     
            while (1)
            {      
                    ;
            }
    }
    看起來好像很簡單,main函數里面關于USB的代碼就兩行,F在我們就來看下USB_Init();
    /**********************************************************************
    函數功能;初始化USB函數
    函 數 名;USB_Init
    函數參數;無
    函數返回;無
    ***********************************************************************/
    void USB_Init (void)
    {      
            PINSEL_ConfigPin ( 0, 31, 1);                        //P0.31管腳設置為USB_D2+的功能
            PINSEL_ConfigPin ( 0, 14, 3);                        //P0.14管腳設置為USB_CONNECT2功能
            CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUSB, ENABLE);        //配置USB時鐘/電源
              LPC_USB->USBClkCtrl = 0x1A;        /*USB時鐘控制寄存器,
    它控制了AHB、端口選
    擇寄存器、設備時鐘,
    這些時鐘的使能和失能。*/
              while ((LPC_USB->USBClkSt & 0x1A) != 0x1A);                /*USBClkSt 寄存器是
    時鐘狀態寄存器,檢查
    是否設置為0x1A。*/
              LPC_USB->StCtrl = 0x3;                             //端口選擇寄存器我們用的USB2所以是就是0x3
    }
    在初始化函數里面就只有USB_D2+USB_CONNECT2引腳被配置了,而USB_D2-VBUS沒有配置。我們來看下LPC1788Data Sheet里對USB Device的管腳描述。
    VBUS引腳描述的大概意思是,VBUS是一個輸入狀態,在沒有IOCON寄存器,它的內部是上拉的。反正大概意思就是這樣。如果是上拉那么它就可以觸發內部的硬件。為了程序的簡單我們就不對它進行配置。VBUS可以不管那USB_D2-咋不配置呢?現在來看一下原理圖,如圖24。
    圖(124
    這個管腳是默認為USB_D2-,可以不用配置。LED管腳也不用配置,應為我們沒有用到LED燈。
    接下來就是USB基本配置用庫函數的CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUSB, ENABLE);來使能時鐘和電源,下一行是USBClkCtrl寄存器配置,這個寄存器是USB時鐘控制寄存器,它控制了AHB、端口選擇寄存器、設備時鐘,這些時鐘的使能和失能,下面就是USBClkSt寄存器,這個寄存器是時鐘狀態寄存器,只是用來檢測USBClkCtrl寄存器是否成功配置,還有一個是StCtrl寄存器,它是用來選擇是用那一個USB端口,我們用的USB2看下數據手冊,從寄存器里看設置為3是對的。
    實現簡單的連接功能,初始化這些就可以搞定,F在分析USB_SetDevCondition(DEV_CON)函數;
    /**********************************************************************
    函數功能;設置USB設備狀態
    函 數 名;USB_SetDevCondition
    函數參數;con;DEV_CON      0x01連接位表示設備的當前連接狀態。用于CONNECT輸出
    DEV_CON_CH  0x02連接發生改變
      DEV_SUS      0x04掛起位表示當前的掛起狀態
                              DEV_SUS_CH  0x08掛起位(DEV_SUS)的變化指示,
                                                                      設備進入掛起狀態、設備斷開連接、                                                                                                  設備在其上行端口上接收到恢復信號,                                                                                                  會發生翻轉
                               DEV_RST      0x10總線復位位
    函數返回;無
    ***********************************************************************/
    void USB_SetDevCondition(uint32_t con)
    {
      WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(con));
    }
    我們看到USB_SetDevCondition(DEV_CON);函數里面還調用了WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(con));函數這個函數是一個寫命令數據函數。
    /**********************************************************************
    函數功能;寫命令數據函數
    函 數 名;WrCmdDat
    函數參數;cmd;命令
                      val: 數據
    函數返回;無
    ***********************************************************************/
    void WrCmdDat (uint32_t cmd, uint32_t val)
    {
      LPC_USB->DevIntClr = 1<<4;                /*DevIntClr寄存器是設備中斷清除寄存器
                                                                            寫相應的位就會清除DevIntSt設備中斷狀態
                                                                    寄存器相應位,應為我們要寫命令,所以我
                                                                    們要把命令代碼寄存器為空中斷標志位清除*/

      LPC_USB->CmdCode = cmd;                /*寫入命令*/

      while ((LPC_USB->DevIntSt & 1<<4) == 0);        /*等待命令代碼寄存器
    為空中斷標志位置位*/

      LPC_USB->DevIntClr = 1<<4;                                /*清除中斷*/                                               
      LPC_USB->CmdCode = val;                                /*寫入數據*/      
      while ((LPC_USB->DevIntSt & 1<<4) == 0);        /*清除中斷*/
    }
    在寫命令數據函數里DevIntClr 寄存器有很詳細的注釋,關鍵要看的就是CmdCode寄存器,下面就是CmdCode寄存器的描述。
    /*命令格式
    低八位保留。
    8--15位是命令段,
    0x02代表讀、0x01代表寫、0x05代表命令。
    16--23位是多用途字段,
    當命令階段為0x05命令或0x02讀時,該域包含著命令代碼,
    當命令階段為0x01寫狀態時,該域包含著命令寫數據。*/

    現在來看第一次給CmdCode寄存器賦值,后面的注釋是說,/*寫入命令*/而我們的命令是這樣定義的,如下代碼。

    #define CMD_SET_DEV_STAT  0x00FE0500        //FE設置設備狀態,05命令

    按照上面的命令格式分析。815位是命令段值是0x05說明代表的是命令,1623位是就是命令代碼了值是0xFE,F在看手冊上說FE命令代表的是啥。

    再看描述的時候一定要注意,上面寫的Command: 0xFE, Data: write 1 byte
    意思是,命令0xFE,數據寫入一個字節,而寫入的一個字節是下一次向CmdCode寄存器執行寫數據時就可以操作0xFE命令所提供的功能,注釋/*寫入數據*/的那一行代碼。就是我們要實現的連接功能,現在來看下定義的數據是多少!

    #define DAT_WR_BYTE(x)   (0x00000100 | ((x) << 16))        //x為要寫入的數據,01寫。

    用前面說的命令格式分析就知道這條命令是寫命令。在main函數中調用的USB_SetDevCondition(DEV_CON);函數的參數DEV_CON的定義是;

    #define DEV_CON  0x01        //連接位表示設備的當前連接狀態。用于CONNECT輸出

    這說明寫入0xFE命令所提供功能的數據是0x01,對照前面0xFE提供的功能可以知道這就是讓CONNECT輸出低電平。這樣就實現了D2+拉高了。

    到此第一章的知識講完。結合代碼和數據手冊可以更好的理解。不足之處還請多多指點。此帖會不斷更新,以實現一個USB HID的整個過程。附件有實現本章的代碼!

    開發環境:集成開發環境μVision4 IDE版本4.60.0.0。
    主機系統:Microsoft Windows XP。
    開發平臺:旺寶悍馬1788開發板。
    USB例程.rar (6.4 MB)



    本文地址:http://www.portaltwn.com/thread-182339-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
    • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
    • Dev Tool Bits——使用DVRT協議查看項目中的數據
    • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷