新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 2440下的USB實驗

        2440下的USB實驗

        作者: 時間:2016-11-25 來源:網絡 收藏
        static void __irq IsrUsbd(void)

        {
        U8 usbdIntpnd, epIntpnd;
        U8 saveIndexReg = rINDEX_REG; //保存索引寄存器值(現場保護)
        usbdIntpnd = rUSB_INT_REG;//保存中斷標志寄存器
        epIntpnd = rEP_INT_REG;

        本文引用地址:http://www.104case.com/article/201611/321179.htm


        if(usbdIntpnd&SUSPEND_INT)//總線上超過 3ms 沒有活動信號引起中斷
        {
        rUSB_INT_REG = SUSPEND_INT;//清除中斷標志位
        }

        if(usbdIntpnd&RESUME_INT)
        {
        rUSB_INT_REG = RESUME_INT; //恢復引起的中斷
        }

        if(usbdIntpnd&RESET_INT)//接收到復位信號引起的中斷
        {
        //ResetUsbd();
        ReconfigUsbd();//重新配置 USB device
        rUSB_INT_REG = RESET_INT; //RESET_INT should be cleared after ResetUsbd().
        PrepareEp1Fifo();
        }


        if(epIntpnd&EP0_INT)//端點 0 中斷
        {
        rEP_INT_REG = EP0_INT;
        Ep0Handler();//進入控制傳輸中斷處理程序
        }

        if(epIntpnd&EP1_INT)
        {
        rEP_INT_REG=EP1_INT;
        Ep1Handler();//進入 Ep1 中斷處理程序(BULK IN)
        }


        if(epIntpnd&EP2_INT)
        {
        rEP_INT_REG = EP2_INT;
        //Ep2Handler();
        }


        if(epIntpnd&EP3_INT)
        {
        rEP_INT_REG = EP3_INT;
        Ep3Handler();//進入 Ep3 中斷處理程序(BULK OUT)
        }


        if(epIntpnd&EP4_INT)
        {
        rEP_INT_REG = EP4_INT;
        //Ep4Handler();
        }


        ClearPending(BIT_USBD);//USB 設備中斷處理完畢,清除中斷標志位
        rINDEX_REG = saveIndexReg;//恢復索引寄存器原來的值(恢復現場)
        }


        6.2 端點 1 的數據傳輸程序


        void Ep1Handler(void)

        {
        U8 in_csr1;


        rINDEX_REG = 1;

        in_csr1 = rIN_CSR1_REG;


        //I think that EPI_SENT_STALL will not be set to 1.
        if(in_csr1 & EPI_SENT_STALL) //USB 已經發布了一個 STALL 握手信號,由此引起該中斷

        {
        CLR_EP1_SENT_STALL();//清除 SENT_STALL 位,STALL 狀態結束

        return;

        }


        //IN_PKT_READY is cleared


        //The data transfered was ep1Buf[] which was already configured transferIndex++;
        if(UsbState==0x01234567)
        PrepareEp1Fifo();//準備好發送的數據,把 IN_PKT_READY 置位

        //IN_PKT_READY is set

        //This packit will be used for next IN packit.

        return;

        }

        6.3 USB Device 初始化函數


        void UsbdInit(U8 fun)

        {

        isUsbdSetConfiguration = 0;

        //MDIV=40,PDIV=4,SDIV=1

        //Upll = (m * Fin) / (p * 2**s)

        //m = (MDIV + 8), p = (PDIV + 2), s = SDIV

        //Upll=48MHz

        rUPLLCON = (40<<12) | (4<<4) | 1;
        //初始化描述符 InitDescriptorTable(fun); ReconfigUsbd();


        UsbState = 0;
        }


        6.4 USB 下載函數

        static int BoardUsbDownload(U32 addr, U32 run)

        {

        U8 fun;

        int len;


        //GPH9-->output GPH10-->output

        rGPHCON = rGPHCON&~(0xf<<18)|(0x5<<18);

        //GPG9-->input

        rGPGCON &= 0xfff3ffff;

        fun = 1;
        //USB Device 初始化 UsbdInit(fun); Delay(100);
        //GPG9-->output rGPGCON |= 0x00040000;
        //GPG9 ouput 1
        rGPGDAT |= 0x0200;


        //中斷服務程序
        pISR_USBD =(unsigned)IsrUsbd; ClearPending(BIT_USBD); EnableIrq(BIT_USBD);
        len = WaitDownload(addr); DisableIrq(BIT_USBD);
        rGPGCON &= 0xfff3ffff;//GPG9 input


        if(len>0) {

        Uart_Printf("nUSB download finished,press any key to exitn");

        }


        return len;

        }



        關鍵詞: 2440USB實

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 巴东县| 宾川县| 湟源县| 咸丰县| 屯昌县| 五台县| 天峨县| 阿拉善左旗| 伊金霍洛旗| 泗洪县| 天等县| 甘德县| 乐都县| 祥云县| 宁远县| 广水市| 许昌县| 钟祥市| 顺昌县| 凤阳县| 西城区| 化州市| 中阳县| 黔东| 井研县| 廉江市| 嘉义县| 兴仁县| 萝北县| 岳池县| 顺平县| 兰西县| 聊城市| 会理县| 鄂伦春自治旗| 彭州市| 高平市| 哈尔滨市| 高要市| 靖边县| 昌平区|