新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32--USB詳細使用說明

        STM32--USB詳細使用說明

        作者: 時間:2016-11-27 來源:網絡 收藏

        uint8_t Out0_Process(void)
        {
        uint32_t ControlState = pInformation->ControlState;

        if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA))
        {

        //主機在完成傳輸前終止傳輸
        ControlState = STALLED;
        }
        else if ((ControlState == OUT_DATA) || (ControlState == LAST_OUT_DATA))
        {
        DataStageOut();
        ControlState = pInformation->ControlState;
        }

        else if (ControlState == WAIT_STATUS_OUT)//進入到這個里面
        {
        (*pProperty->Process_Status_OUT)();//這個函數其實什么也沒做
        #ifndef STM32F10X_CL
        ControlState = STALLED;//狀態變成了終止發送和接受

        #endif
        }


        else
        {
        ControlState = STALLED;
        }

        pInformation->ControlState = ControlState;

        return Post0_Process();
        }

        ***************(5)**************

        獲取設備描述符以后,主機再一次的復位設備,設備又進入初始狀態。開始枚舉的第二步設置地址。

        void NoData_Setup0(void)
        {
        RESULT Result = USB_UNSUPPORT;
        uint32_t RequestNo = pInformation->USBbRequest;
        uint32_t ControlState;

        if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) //設備請求
        {


        else if (RequestNo == SET_ADDRESS) /設置地址
        {
        if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0)
        || (pInformation->USBwIndex != 0)
        || (pInformation->Current_Configuration != 0))

        {
        ControlState = STALLED;
        goto exit_NoData_Setup0;
        }
        else
        {
        Result = USB_SUCCESS;

        #ifdef STM32F10X_CL
        SetDeviceAddress(pInformation->USBwValue0);
        #endif
        }
        }

        ControlState = WAIT_STATUS_IN;

        USB_StatusIn();//準備好發送0字節的狀態數據包SetEPTxCount(ENDP0, 0);

        //vSetEPTxStatus(EP_TX_VALID);建立階段后直接的進入狀態階段

        exit_NoData_Setup0:
        pInformation->ControlState = ControlState;
        return;
        }

        uint8_t In0_Process(void)
        {
        uint32_t ControlState = pInformation->ControlState;

        if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) //控制狀態
        {
        DataStageIn();//第一次取設備描述符只取一次 當前的狀態變為WAIT_STATUS_IN 表明設備等待狀態過程 主機輸出0字節

        ControlState = pInformation->ControlState;
        }

        else if (ControlState == WAIT_STATUS_IN) //設置地址狀態階段進入這個程序
        {
        if ((pInformation->USBbRequest == SET_ADDRESS) &&
        (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)))
        {
        SetDeviceAddress(pInformation->USBwValue0);//設置使用新的地址
        pUser_Standard_Requests->User_SetDeviceAddress();
        }
        (*pProperty->Process_Status_IN)();
        ControlState = STALLED; //終止發送和接受

        }

        else
        {
        ControlState = STALLED;
        }

        pInformation->ControlState = ControlState;

        return Post0_Process();
        }

        uint8_t Post0_Process(void)
        {
        #ifdef STM32F10X_CL
        USB_OTG_EP *ep;
        #endif
        SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);//設置端點0 要接受的字節數

        if (pInformation->ControlState == STALLED)//這種狀態下只接受SETUP命令包
        {
        vSetEPRxStatus(EP_RX_STALL);//終止端點0接受
        vSetEPTxStatus(EP_TX_STALL);//終止端點0發送

        }

        return (pInformation->ControlState == PAUSE);
        }

        ***************(6)*************

        從新地址獲取設備描述符



        上一頁 1 2 3 下一頁

        關鍵詞: STM32USB使用說

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 广东省| 建湖县| 江油市| 温宿县| 拉萨市| 清水县| 吴桥县| 内江市| 维西| 石棉县| 武威市| 阿瓦提县| 梓潼县| 津市市| 江油市| 来凤县| 自治县| 枣强县| 嘉黎县| 襄城县| 长治县| 石林| 乐业县| 奉贤区| 会理县| 长春市| 泽库县| 武宁县| 墨脱县| 依安县| 永德县| 双辽市| 青海省| 盐城市| 阳朔县| 乾安县| 吴江市| 老河口市| 隆安县| 兴义市| 岐山县|