USBHS 中斷丟失

? ? 大家好,我在基于官網(wǎng)CH372Device調(diào)程序的時候發(fā)現(xiàn),開啟2個中斷,一個是TIM8 1ms的中斷,另一個是USBHS中斷,發(fā)現(xiàn)USBHS中斷標志USBHS_Endp_Busy 一直為 busy 狀態(tài),TIM8定時器的中斷會干擾USBHS中斷,如果只有USBHS中斷的話,程序壓測能正常運行,一開啟TIM8 1ms中斷后,程序運行1~2分鐘后,相應端點的USBHS_Endp_Busy 一直為busy,就像USBHS中斷丟失了一樣,各位大佬有遇到過類似問題嗎???。下面是部分代碼:

TIM8:

void TIM8_UP_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void TIM8_UP_IRQHandler(void)

{

? ? if(TIM_GetFlagStatus(TIM8, TIM_FLAG_Update) != RESET)

? ? {

? ? ? ? TIM_ClearFlag(TIM8, TIM_FLAG_Update);


//? ? ? ? ledTimerCnt++;

//? ? ? ? if(ledTimerCnt > 500)

//? ? ? ? {

//? ? ? ? ? ? ledTimerCnt = 0;

//? ? ? ? ? ? led_tongle();

//? ? ? ? }

//

? ? ? ? PeriodMessagesTimer();

? ? }

}


USBHS:

void USBHS_IRQHandler( void )

{

? ? uint8_t? intflag, intst, errflag;

? ? uint16_t len, i;


? ? intflag = USBHSD->INT_FG;

? ? intst = USBHSD->INT_ST;


? ? if( intflag & USBHS_UIF_TRANSFER )

? ? {

? ? ? ? switch ( intst & USBHS_UIS_TOKEN_MASK )

? ? ? ? {

? ? ? ? ? ? /* data-in stage processing */

? ? ? ? ? ? case USBHS_UIS_TOKEN_IN:

? ? ? ? ? ? ? ? switch ( intst & ( USBHS_UIS_TOKEN_MASK | USBHS_UIS_ENDP_MASK ) )

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? /* end-point 0 data in interrupt */

? ? ? ? ? ? ? ? ? ? case USBHS_UIS_TOKEN_IN | DEF_UEP0:

? ? ? ? ? ? ? ? ? ? ? ? if( USBHS_SetupReqLen == 0 )

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_RX_CTRL = USBHS_UEP_R_TOG_DATA1 | USBHS_UEP_R_RES_ACK;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? if ( ( USBHS_SetupReqType & USB_REQ_TYP_MASK ) == USB_REQ_TYP_VENDOR )

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Non-standard request endpoint 0 Data upload */

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = USBHS_SetupReqLen >= DEF_USBD_UEP0_SIZE ? DEF_USBD_UEP0_SIZE : USBHS_SetupReqLen;

? ? ? ? ? ? ? ? ? ? ? ? ? ? memcpy(USBHS_EP0_Buf, pUSBHS_Descr, len);

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_SetupReqLen -= len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr += len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_TX_LEN = len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_TX_CTRL ^= USBHS_UEP_T_TOG_DATA1;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? else if( (USBHS_SetupReqType & USB_REQ_TYP_MASK ) == USB_REQ_TYP_STANDARD)

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Standard request endpoint 0 Data upload */

? ? ? ? ? ? ? ? ? ? ? ? ? ? switch( USBHS_SetupReqCode )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case USB_GET_DESCRIPTOR:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = USBHS_SetupReqLen >= DEF_USBD_UEP0_SIZE ? DEF_USBD_UEP0_SIZE : USBHS_SetupReqLen;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? memcpy(USBHS_EP0_Buf, pUSBHS_Descr, len);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_SetupReqLen -= len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr += len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_TX_LEN = len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_TX_CTRL ^= USBHS_UEP_T_TOG_DATA1;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case USB_SET_ADDRESS:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->DEV_AD = USBHS_DevAddr;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_TX_LEN = 0;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? /* end-point 1 data in interrupt */

? ? ? ? ? ? ? ? ? ? case USBHS_UIS_TOKEN_IN | DEF_UEP1:

? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP1_TX_CTRL = (USBHSD->UEP1_TX_CTRL & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP1_TX_CTRL ^= USBHS_UEP_T_TOG_DATA1;

? ? ? ? ? ? ? ? ? ? ? ? USBHS_Endp_Busy[ DEF_UEP1 ] &= ~DEF_UEP_BUSY;


? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? /* end-point 2 data in interrupt */

? ? ? ? ? ? ? ? ? ? case USBHS_UIS_TOKEN_IN | DEF_UEP2:

? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP2_TX_CTRL = (USBHSD->UEP2_TX_CTRL & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP2_TX_CTRL ^= USBHS_UEP_T_TOG_DATA1;

? ? ? ? ? ? ? ? ? ? ? ? USBHS_Endp_Busy[ DEF_UEP2 ] &= ~DEF_UEP_BUSY;


? ? ? ? ? ? ? ? ? ? ? ? usb_tx_busy_flag = 0;

? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? /* end-point 3 data in interrupt */

? ? ? ? ? ? ? ? ? ? case USBHS_UIS_TOKEN_IN | DEF_UEP3:

? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP3_TX_CTRL = (USBHSD->UEP3_TX_CTRL & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP3_TX_CTRL ^= USBHS_UEP_T_TOG_DATA1;

? ? ? ? ? ? ? ? ? ? ? ? USBHS_Endp_Busy[ DEF_UEP3 ] &= ~DEF_UEP_BUSY;

? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? default :

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? break;


? ? ? ? ? ? /* data-out stage processing */

? ? ? ? ? ? case USBHS_UIS_TOKEN_OUT:

? ? ? ? ? ? ? ? switch( intst & ( USBHS_UIS_TOKEN_MASK | USBHS_UIS_ENDP_MASK ) )

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? /* end-point 0 data out interrupt */

? ? ? ? ? ? ? ? ? ? case USBHS_UIS_TOKEN_OUT | DEF_UEP0:

? ? ? ? ? ? ? ? ? ? ? ? ?len = USBHSH->RX_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ?if ( intst & USBHS_UIS_TOG_OK )

? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* if any processing about rx, set it here */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if ( ( USBHS_SetupReqType & USB_REQ_TYP_MASK ) != USB_REQ_TYP_STANDARD )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Non-standard request end-point 0 Data download */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?else

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Standard request end-point 0 Data download */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USBHS_SetupReqLen -= len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if( USBHS_SetupReqLen == 0 )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USBHSD->UEP0_TX_LEN? = 0;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USBHSD->UEP0_TX_CTRL = USBHS_UEP_T_TOG_DATA1 | USBHS_UEP_T_RES_ACK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? /* end-point 1 data out interrupt */

? ? ? ? ? ? ? ? ? ? case USBHS_UIS_TOKEN_OUT | DEF_UEP1:

? ? ? ? ? ? ? ? ? ? ? ? if ( intst & USBHS_UIS_TOG_OK )

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Write In Buffer */

? ? ? ? ? ? ? ? ? ? ? ? ? ? uint16_t len;


//? ? ? ? ? ? ? ? ? ? ? ? ? ? len = USBHSD->RX_LEN;

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USB_ProcessRxCmdData(USBHS_EP1_Rx_Buf, len);

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP1_RX_CTRL ^= USBHS_UEP_R_TOG_DATA1;


? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP1_RX_CTRL ^= USBHS_UEP_R_TOG_DATA1;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP1_RX_CTRL = ((USBHSD->UEP1_RX_CTRL) & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = USBHSD->RX_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_Endp_RxDataLen[DEF_UEP1] = len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_Endp_RxDataFlag[DEF_UEP1] = 1;


? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? /* end-point 2 data out interrupt */

? ? ? ? ? ? ? ? ? ? case USBHS_UIS_TOKEN_OUT | DEF_UEP2:

? ? ? ? ? ? ? ? ? ? ? ? if ( intst & USBHS_UIS_TOG_OK )

? ? ? ? ? ? ? ? ? ? ? ? {

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP2_RX_CTRL = ((USBHSD->UEP2_RX_CTRL) & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_NAK;

//? ? ? ? ? ? ? ? ? ? ? ? ? ? len = (uint16_t)(USBHSD->RX_LEN);

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USB_ProcessRxData(USBHS_EP2_Rx_Buf, len);

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP2_RX_CTRL ^= USBHS_UEP_R_TOG_DATA1;

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP2_RX_CTRL = (USBHSD->UEP2_RX_CTRL & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_ACK;

//

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP2_RX_CTRL = ((USBHSD->UEP2_RX_CTRL) & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP2_RX_CTRL ^= USBHS_UEP_R_TOG_DATA1;

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = USBHSD->RX_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_Endp_RxDataLen[DEF_UEP2] = len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_Endp_RxDataFlag[DEF_UEP2] = 1;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? /* end-point 3 data out interrupt */

? ? ? ? ? ? ? ? ? ? case USBHS_UIS_TOKEN_OUT | DEF_UEP3:

? ? ? ? ? ? ? ? ? ? ? ? if ( intst & USBHS_UIS_TOG_OK )

? ? ? ? ? ? ? ? ? ? ? ? {

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP3_RX_CTRL = ((USBHSD->UEP3_RX_CTRL) & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_NAK;

//? ? ? ? ? ? ? ? ? ? ? ? ? ? len = (uint16_t)(USBHSD->RX_LEN);

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP3_RX_CTRL ^= USBHS_UEP_R_TOG_DATA1;

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USB_ProcessRxData(USBHS_EP3_Rx_Buf, len);

//? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP3_RX_CTRL = (USBHSD->UEP3_RX_CTRL & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_ACK;


? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP3_RX_CTRL = ((USBHSD->UEP3_RX_CTRL) & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP3_RX_CTRL ^= USBHS_UEP_R_TOG_DATA1;

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = USBHSD->RX_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_Endp_RxDataLen[DEF_UEP3] = len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_Endp_RxDataFlag[DEF_UEP3] = 1;



? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? default:

? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? break;


? ? ? ? ? ? /* Sof pack processing */

? ? ? ? ? ? case USBHS_UIS_TOKEN_SOF:

? ? ? ? ? ? ? ? break;


? ? ? ? ? ? default :

? ? ? ? ? ? ? ? break;

? ? ? ? }

? ? ? ? USBHSD->INT_FG = USBHS_UIF_TRANSFER;

? ? }

? ? else if( intflag & USBHS_UIF_SETUP_ACT )

? ? {

? ? ? ? USBHSD->UEP0_TX_CTRL = USBHS_UEP_T_TOG_DATA1 | USBHS_UEP_T_RES_NAK;

? ? ? ? USBHSD->UEP0_RX_CTRL = USBHS_UEP_R_TOG_DATA1 | USBHS_UEP_R_RES_NAK;


? ? ? ? /* Store All Setup Values */

? ? ? ? USBHS_SetupReqType? = pUSBHS_SetupReqPak->bRequestType;

? ? ? ? USBHS_SetupReqCode? = pUSBHS_SetupReqPak->bRequest;

? ? ? ? USBHS_SetupReqLen? ?= pUSBHS_SetupReqPak->wLength;

? ? ? ? USBHS_SetupReqValue = pUSBHS_SetupReqPak->wValue;

? ? ? ? USBHS_SetupReqIndex = pUSBHS_SetupReqPak->wIndex;


? ? ? ? len = 0;

? ? ? ? errflag = 0;

? ? ? ? if ( ( USBHS_SetupReqType & USB_REQ_TYP_MASK ) == USB_REQ_TYP_VENDOR )

? ? ? ? {

? ? ? ? ? ? if(USBHS_SetupReqIndex == 4)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? pUSBHS_Descr = Extend_Compat_ID;

? ? ? ? ? ? ? ? len = Extend_Compat_ID[0];


? ? ? ? ? ? ? ? /* Copy Descriptors to Endp0 DMA buffer */

? ? ? ? ? ? ? ? if( USBHS_SetupReqLen>len )

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? USBHS_SetupReqLen = len;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? len = (USBHS_SetupReqLen >= DEF_USBD_UEP0_SIZE) ? DEF_USBD_UEP0_SIZE : USBHS_SetupReqLen;

? ? ? ? ? ? ? ? memcpy( USBHS_EP0_Buf, pUSBHS_Descr, len );

? ? ? ? ? ? ? ? pUSBHS_Descr += len;

? ? ? ? ? ? }

? ? ? ? ? ? else if(USBHS_SetupReqIndex == 5)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? pUSBHS_Descr = Extend_Properties;

? ? ? ? ? ? ? ? len = Extend_Properties[0];


? ? ? ? ? ? ? ? /* Copy Descriptors to Endp0 DMA buffer */

? ? ? ? ? ? ? ? if( USBHS_SetupReqLen>len )

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? USBHS_SetupReqLen = len;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? len = (USBHS_SetupReqLen >= DEF_USBD_UEP0_SIZE) ? DEF_USBD_UEP0_SIZE : USBHS_SetupReqLen;

? ? ? ? ? ? ? ? memcpy( USBHS_EP0_Buf, pUSBHS_Descr, len );

? ? ? ? ? ? ? ? pUSBHS_Descr += len;

? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? else if( ( USBHS_SetupReqType & USB_REQ_TYP_MASK ) == USB_REQ_TYP_STANDARD )

? ? ? ? {

? ? ? ? ? ? /* usb standard request processing */

? ? ? ? ? ? switch( USBHS_SetupReqCode )

? ? ? ? ? ? {

? ? ? ? ? ? ? ? /* get device/configuration/string/report/... descriptors */

? ? ? ? ? ? ? ? case USB_GET_DESCRIPTOR:

? ? ? ? ? ? ? ? ? ? switch( (uint8_t)(USBHS_SetupReqValue>>8) )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? /* get usb device descriptor */

? ? ? ? ? ? ? ? ? ? ? ? case USB_DESCR_TYP_DEVICE:

? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = MyDevDescr;

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_DEVICE_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? /* get usb configuration descriptor */

? ? ? ? ? ? ? ? ? ? ? ? case USB_DESCR_TYP_CONFIG:

? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Query current usb speed */

? ? ? ? ? ? ? ? ? ? ? ? ? ? if( ( USBHSD->SPEED_TYPE & USBHS_SPEED_TYPE_MASK ) == USBHS_SPEED_HIGH )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* High speed mode */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_DevSpeed = USBHS_SPEED_HIGH;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_DevMaxPackLen = DEF_USBD_HS_PACK_SIZE;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Full speed mode */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_DevSpeed = USBHS_SPEED_FULL;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_DevMaxPackLen = DEF_USBD_FS_PACK_SIZE;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Load usb configuration descriptor by speed */

? ? ? ? ? ? ? ? ? ? ? ? ? ? if( USBHS_DevSpeed == USBHS_SPEED_HIGH )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* High speed mode */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = MyCfgDescr_HS;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_CONFIG_HS_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Full speed mode */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = MyCfgDescr_FS;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_CONFIG_FS_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? /* get usb string descriptor */

? ? ? ? ? ? ? ? ? ? ? ? case USB_DESCR_TYP_STRING:

? ? ? ? ? ? ? ? ? ? ? ? ? ? switch( (uint8_t)(USBHS_SetupReqValue&0xFF) )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Descriptor 0, Language descriptor */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case DEF_STRING_DESC_LANG:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = MyLangDescr;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_LANG_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Descriptor 1, Manufacturers String descriptor */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case DEF_STRING_DESC_MANU:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = MyManuInfo;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_MANU_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Descriptor 2, Product String descriptor */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case DEF_STRING_DESC_PROD:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = MyProdInfo;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_PROD_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Descriptor 3, Serial-number String descriptor */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case DEF_STRING_DESC_SERN:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = MySerNumInfo;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_SN_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0xEE:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = OS_DESC;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = OS_DESC[0];

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? /* get usb device qualify descriptor */

? ? ? ? ? ? ? ? ? ? ? ? case USB_DESCR_TYP_QUALIF:

? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = MyQuaDesc;

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_QUALFY_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? /* get usb BOS descriptor */

? ? ? ? ? ? ? ? ? ? ? ? case USB_DESCR_TYP_BOS:

? ? ? ? ? ? ? ? ? ? ? ? ? ? /* USB 2.00 DO NOT support BOS descriptor */

? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? /* get usb other-speed descriptor */

? ? ? ? ? ? ? ? ? ? ? ? case USB_DESCR_TYP_SPEED:

? ? ? ? ? ? ? ? ? ? ? ? ? ? if( USBHS_DevSpeed == USBHS_SPEED_HIGH )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* High speed mode */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? memcpy( &TAB_USB_HS_OSC_DESC[ 2 ], &MyCfgDescr_FS[ 2 ], DEF_USBD_CONFIG_FS_DESC_LEN - 2 );

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = ( uint8_t * )&TAB_USB_HS_OSC_DESC[ 0 ];

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_CONFIG_FS_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? else if( USBHS_DevSpeed == USBHS_SPEED_FULL )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Full speed mode */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? memcpy( &TAB_USB_FS_OSC_DESC[ 2 ], &MyCfgDescr_HS[ 2 ], DEF_USBD_CONFIG_HS_DESC_LEN - 2 );

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = ( uint8_t * )&TAB_USB_FS_OSC_DESC[ 0 ];

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_CONFIG_HS_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? default :

? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? ? ? /* Copy Descriptors to Endp0 DMA buffer */

? ? ? ? ? ? ? ? ? ? if( USBHS_SetupReqLen>len )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? USBHS_SetupReqLen = len;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? len = (USBHS_SetupReqLen >= DEF_USBD_UEP0_SIZE) ? DEF_USBD_UEP0_SIZE : USBHS_SetupReqLen;

? ? ? ? ? ? ? ? ? ? memcpy( USBHS_EP0_Buf, pUSBHS_Descr, len );

? ? ? ? ? ? ? ? ? ? pUSBHS_Descr += len;

? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? /* Set usb address */

? ? ? ? ? ? ? ? case USB_SET_ADDRESS:

? ? ? ? ? ? ? ? ? ? USBHS_DevAddr = (uint16_t)(USBHS_SetupReqValue&0xFF);

? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? /* Get usb configuration now set */

? ? ? ? ? ? ? ? case USB_GET_CONFIGURATION:

? ? ? ? ? ? ? ? ? ? USBHS_EP0_Buf[0] = USBHS_DevConfig;

? ? ? ? ? ? ? ? ? ? if ( USBHS_SetupReqLen > 1 )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? USBHS_SetupReqLen = 1;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? /* Set usb configuration to use */

? ? ? ? ? ? ? ? case USB_SET_CONFIGURATION:

? ? ? ? ? ? ? ? ? ? USBHS_DevConfig = (uint8_t)(USBHS_SetupReqValue&0xFF);

? ? ? ? ? ? ? ? ? ? USBHS_DevEnumStatus = 0x01;

? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? /* Clear or disable one usb feature */

? ? ? ? ? ? ? ? case USB_CLEAR_FEATURE:

? ? ? ? ? ? ? ? ? ? if( ( USBHS_SetupReqType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_DEVICE )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? /* clear one device feature */

? ? ? ? ? ? ? ? ? ? ? ? if((uint8_t)(USBHS_SetupReqValue&0xFF) == 0x01)

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? /* clear usb sleep status, device not prepare to sleep */

? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_DevSleepStatus &= ~0x01;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else if ( ( USBHS_SetupReqType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_ENDP )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point Feature */

? ? ? ? ? ? ? ? ? ? ? ? if( (uint8_t)(USBHS_SetupReqValue&0xFF) == USB_REQ_FEAT_ENDP_HALT )

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Clear End-point Feature */

? ? ? ? ? ? ? ? ? ? ? ? ? ? switch( (uint8_t)(USBHS_SetupReqIndex&0xFF) )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP1 | DEF_UEP_OUT):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 1 OUT ACK */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP1_RX_CTRL = USBHS_UEP_R_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP1 | DEF_UEP_IN):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 2 IN NAK */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP1_TX_CTRL = USBHS_UEP_T_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP3 | DEF_UEP_OUT):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 3 OUT ACK */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP3_RX_CTRL = USBHS_UEP_R_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP4 | DEF_UEP_IN):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 4 IN NAK */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP4_TX_CTRL = USBHS_UEP_T_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP5 | DEF_UEP_OUT):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 5 OUT ACK */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP5_RX_CTRL = USBHS_UEP_R_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP6 | DEF_UEP_IN):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 6 IN NAK */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP6_TX_CTRL = USBHS_UEP_T_RES_NAK;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? /* set or enable one usb feature */

? ? ? ? ? ? ? ? case USB_SET_FEATURE:

? ? ? ? ? ? ? ? ? ? if( ( USBHS_SetupReqType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_DEVICE )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? /* Set Device Feature */

? ? ? ? ? ? ? ? ? ? ? ? if( (uint8_t)(USBHS_SetupReqValue&0xFF) == USB_REQ_FEAT_REMOTE_WAKEUP )

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? if( MyCfgDescr_FS[ 7 ] & 0x20 )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set Wake-up flag, device prepare to sleep */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_DevSleepStatus |= 0x01;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else if( ( USBHS_SetupReqType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_ENDP )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point Feature */

? ? ? ? ? ? ? ? ? ? ? ? if( (uint8_t)(USBHS_SetupReqValue&0xFF) == USB_REQ_FEAT_ENDP_HALT )

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set end-points status stall */

? ? ? ? ? ? ? ? ? ? ? ? ? ? switch((uint8_t)(USBHS_SetupReqIndex&0xFF) )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP1 | DEF_UEP_OUT):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 1 OUT STALL */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP1_RX_CTRL = ( USBHSD->UEP1_RX_CTRL & ~USBHS_UEP_R_RES_MASK ) | USBHS_UEP_R_RES_STALL;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP1 | DEF_UEP_IN):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 1 IN STALL */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP1_TX_CTRL = ( USBHSD->UEP1_TX_CTRL & ~USBHS_UEP_T_RES_MASK ) | USBHS_UEP_T_RES_STALL;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP3 | DEF_UEP_OUT):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 3 OUT STALL */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP3_RX_CTRL = ( USBHSD->UEP3_RX_CTRL & ~USBHS_UEP_R_RES_MASK ) | USBHS_UEP_R_RES_STALL;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP4 | DEF_UEP_IN):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 4 IN STALL */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP4_TX_CTRL = ( USBHSD->UEP4_TX_CTRL & ~USBHS_UEP_T_RES_MASK ) | USBHS_UEP_T_RES_STALL;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP5 | DEF_UEP_OUT):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 5 OUT STALL */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP5_RX_CTRL = ( USBHSD->UEP5_RX_CTRL & ~USBHS_UEP_R_RES_MASK ) | USBHS_UEP_R_RES_STALL;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case (DEF_UEP6 | DEF_UEP_IN):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Set End-point 6 IN STALL */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP6_TX_CTRL = ( USBHSD->UEP6_TX_CTRL & ~USBHS_UEP_T_RES_MASK? ) | USBHS_UEP_T_RES_STALL;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? /* This request allows the host to select another setting for the specified interface? */

? ? ? ? ? ? ? ? case USB_GET_INTERFACE:

? ? ? ? ? ? ? ? ? ? USBHS_EP0_Buf[0] = 0x00;

? ? ? ? ? ? ? ? ? ? if ( USBHS_SetupReqLen > 1 )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? USBHS_SetupReqLen = 1;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? case USB_SET_INTERFACE:

? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? /* host get status of specified device/interface/end-points */

? ? ? ? ? ? ? ? case USB_GET_STATUS:

? ? ? ? ? ? ? ? ? ? USBHS_EP0_Buf[0] = 0x00;

? ? ? ? ? ? ? ? ? ? USBHS_EP0_Buf[1] = 0x00;

? ? ? ? ? ? ? ? ? ? if( ( USBHS_SetupReqType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_ENDP )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? switch( (uint8_t)( USBHS_SetupReqIndex & 0xFF ) )

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?case ( DEF_UEP_OUT | DEF_UEP1 ):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if( ( (USBHSD->UEP1_RX_CTRL) & USBHS_UEP_R_RES_MASK ) == USBHS_UEP_R_RES_STALL )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USBHS_EP0_Buf[ 0 ] = 0x01;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ?case ( DEF_UEP_IN | DEF_UEP1 ):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if( ( (USBHSD->UEP1_TX_CTRL) & USBHS_UEP_T_RES_MASK ) == USBHS_UEP_T_RES_STALL )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USBHS_EP0_Buf[ 0 ] = 0x01;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ?case ( DEF_UEP_OUT | DEF_UEP3 ):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if( ( (USBHSD->UEP3_RX_CTRL) & USBHS_UEP_R_RES_MASK ) == USBHS_UEP_R_RES_STALL )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USBHS_EP0_Buf[ 0 ] = 0x01;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ?case ( DEF_UEP_IN | DEF_UEP4 ):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if( ( (USBHSD->UEP4_TX_CTRL) & USBHS_UEP_T_RES_MASK ) == USBHS_UEP_T_RES_STALL )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USBHS_EP0_Buf[ 0 ] = 0x01;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ?case ( DEF_UEP_OUT | DEF_UEP5 ):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if( ( (USBHSD->UEP5_RX_CTRL) & USBHS_UEP_R_RES_MASK ) == USBHS_UEP_R_RES_STALL )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USBHS_EP0_Buf[ 0 ] = 0x01;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ?case ( DEF_UEP_IN | DEF_UEP6 ):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if( ( (USBHSD->UEP6_TX_CTRL) & USBHS_UEP_T_RES_MASK ) == USBHS_UEP_T_RES_STALL )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USBHS_EP0_Buf[ 0 ] = 0x01;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ?default:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else if( ( USBHS_SetupReqType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_DEVICE )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? if( USBHS_DevSleepStatus & 0x01 )

? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_EP0_Buf[ 0 ] = 0x02;

? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? ? ? if ( USBHS_SetupReqLen > 2 )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? USBHS_SetupReqLen = 2;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? default:

? ? ? ? ? ? ? ? ? ? errflag = 0xFF;

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? /* usb non-standard request processing */

? ? ? ? ? ? errflag = 0xFF;

? ? ? ? }

? ? ? ? /* errflag = 0xFF means a request not support or some errors occurred, else correct */

? ? ? ? if( errflag == 0xFF )

? ? ? ? {

? ? ? ? ? ? /* if one request not support, return stall */

? ? ? ? ? ? USBHSD->UEP0_TX_CTRL = USBHS_UEP_T_TOG_DATA1 | USBHS_UEP_T_RES_STALL;

? ? ? ? ? ? USBHSD->UEP0_RX_CTRL = USBHS_UEP_R_TOG_DATA1 | USBHS_UEP_R_RES_STALL;

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? /* end-point 0 data Tx/Rx */

? ? ? ? ? ? if( USBHS_SetupReqType & DEF_UEP_IN )

? ? ? ? ? ? {

? ? ? ? ? ? ? ? /* tx */

? ? ? ? ? ? ? ? len = (USBHS_SetupReqLen>DEF_USBD_UEP0_SIZE) ? DEF_USBD_UEP0_SIZE : USBHS_SetupReqLen;

? ? ? ? ? ? ? ? USBHS_SetupReqLen -= len;

? ? ? ? ? ? ? ? USBHSD->UEP0_TX_LEN = len;

? ? ? ? ? ? ? ? USBHSD->UEP0_TX_CTRL = USBHS_UEP_T_TOG_DATA1 | USBHS_UEP_T_RES_ACK;

? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? /* rx */

? ? ? ? ? ? ? ? if( USBHS_SetupReqLen == 0 )

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_TX_LEN = 0;

? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_TX_CTRL = USBHS_UEP_T_TOG_DATA1 | USBHS_UEP_T_RES_ACK;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_RX_CTRL = USBHS_UEP_R_TOG_DATA1 | USBHS_UEP_R_RES_ACK;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? USBHSD->INT_FG = USBHS_UIF_SETUP_ACT;

? ? }

? ? else if( intflag & USBHS_UIF_BUS_RST )

? ? {

? ? ? ? /* usb reset interrupt processing */

? ? ? ? USBHS_DevConfig = 0;

? ? ? ? USBHS_DevAddr = 0;

? ? ? ? USBHS_DevSleepStatus = 0;

? ? ? ? USBHS_DevEnumStatus = 0;


? ? ? ? USBHSD->DEV_AD = 0;

? ? ? ? USBHS_Device_Endp_Init( );

? ? ? ? USBHSD->INT_FG = USBHS_UIF_BUS_RST;

? ? }

? ? else if( intflag & USBHS_UIF_SUSPEND )

? ? {

? ? ? ? USBHSD->INT_FG = USBHS_UIF_SUSPEND;

? ? ? ? /* usb suspend interrupt processing */

? ? ? ? if ( USBHSD->MIS_ST & USBHS_UMS_SUSPEND? )

? ? ? ? {

? ? ? ? ? ? USBHS_DevSleepStatus |= 0x02;

? ? ? ? ? ? if( USBHS_DevSleepStatus == 0x03 )

? ? ? ? ? ? {

? ? ? ? ? ? ? ? /* Handling usb sleep here */

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? USBHS_DevSleepStatus &= ~0x02;

? ? ? ? }

? ? }

? ? else

? ? {

? ? ? ? /* other interrupts */

? ? ? ? USBHSD->INT_FG = intflag;

? ? }

}


部分main代碼:

? ? if(USBHS_Endp_RxDataFlag[DEF_UEP1] > 0)

? ? {


? ? ? ? USB_ProcessRxCmdData(USBHS_EP1_Rx_Buf, USBHS_Endp_RxDataLen[DEF_UEP1]);

? ? ? ? USBHS_Endp_RxDataFlag[DEF_UEP1] = 0;

? ? ? ? USBHSD->UEP1_RX_CTRL = (USBHSD->UEP1_RX_CTRL & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_ACK;


? ? }

? ? ? ? if(USBHS_Endp_RxDataFlag[DEF_UEP2] > 0)

? ? ? ? {

? ? ? ? ? ? USB_ProcessRxData(USBHS_EP2_Rx_Buf, USBHS_Endp_RxDataLen[DEF_UEP2]);

? ? ? ? ? ? USBHS_Endp_RxDataFlag[DEF_UEP2] = 0;

? ? ? ? ? ? USBHSD->UEP2_RX_CTRL = (USBHSD->UEP2_RX_CTRL & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_ACK;


? ? ? ? }





你好,例程中USBHS_Endp_Busy這個標志位,裝載完端點后數(shù)據(jù)置1,在IN完成中斷里清零。

出現(xiàn)一直為1,一般有兩種情況。

1:在裝載完端點的數(shù)據(jù)后主機沒有下發(fā)IN包,下發(fā)了RESET或者Clear Feature等指令,把端點重新初始化,但代碼中沒有對應清零busy標志位,導致一直沒有數(shù)據(jù)上傳,不會進入IN完成中斷,busy一直為1。

2:代碼中有多處操作busy標志位的地方,邏輯錯亂。建議發(fā)送的時候直接調(diào)用函數(shù)USBHS_Endp_DataUp,操作盡量簡潔。尤其要避免busy標志位的與或操作被中斷打斷的情況。


在中斷里面直接收、發(fā)送大型數(shù)據(jù)包?這樣的也不怕中斷出不來?


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频