2017-09-20 15 views
0

XMC4500 microcontroller에서 작업하기 시작했습니다. 현재 USB CDC 통신을 구현 중이며 문제가 발생했습니다. "USBD_VCOM_SendData"함수를 호출 한 후 프로그램은 데이터를 보낼 프레임을 기다립니다. 프로그램은 "Endpoint_Write_Stream_LE"의 "usbd_endpoint_stream_xmc4000.c"파일에서 더 정확히 대기합니다. Endpoint_WaitUntilReady() 함수에서 끝점이 준비 될 때까지 대기합니다.ARM USB 기능이 너무 오래 걸려서

#define USB_STREAM_TIMEOUT_MS 100 


uint8_t Endpoint_WaitUntilReady(void) 
{ 
#if (USB_STREAM_TIMEOUT_MS < 0xFF) 
    uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; 
#else 
    uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; 
#endif 

uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); 

    for (;;) 
    { 
     if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) 
     { 
      if (Endpoint_IsINReady()) 
      { 
       return ENDPOINT_READYWAIT_NoError; 
      } 
     } 
     else 
     { 
      if (Endpoint_IsOUTReceived()) 
      { 
       return ENDPOINT_READYWAIT_NoError; 
      } 
     } 

     uint8_t USB_DeviceState_LCL = USB_DeviceState; 

     if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) 
     { 
      return ENDPOINT_READYWAIT_DeviceDisconnected; 
     } 
     else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) 
     { 
      return ENDPOINT_READYWAIT_BusSuspended; 
     } 
     else if (Endpoint_IsStalled()) 
     { 
      return ENDPOINT_READYWAIT_EndpointStalled; 
     } 

     uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); 

     if (CurrentFrameNumber != PreviousFrameNumber) 
     { 
      PreviousFrameNumber = CurrentFrameNumber; 

      if (!(TimeoutMSRem--)) 
      { 
       return ENDPOINT_READYWAIT_Timeout; 
      } 
     } 
    }  
} 

이 대기 시간은 약 100-150us이며 길어야합니다. STM32 마이크로 컨트롤러에서 작업 할 때 실행 시간이 현저히 짧았습니다.

누구든지 전에이 문제를 겪었습니까? 버퍼에 데이터를 쓰고 주변 장치가 프로세서 시간없이 트랜잭션을 처리하도록 할 수있는 방법이 있습니까? 또는 적어도 엔드 포인트가 트랜잭션 준비가되면 인터럽트를 트리거하십시오.

답변

0

Endpoint_IsINReady()이 true를 반환하면 루프가 즉시 종료됩니다. 아마도 코드에서 해당 매크로를 실행하고 실제로 평가되는 경우에만 USB 호스트로 메시지를 보내야합니다.

또한 라이브러리가 블로킹 동작을 사용하지 않도록하려면 엔드 포인트 버퍼가 얼마나 많은 양의 데이터를 보유 할 수 있는지 생각해야하며 한 번에 하나 이상의 데이터를 보내지 않도록해야합니다 시각. (필요한 경우 버퍼를 만들어 단편 USB 라이브러리로 보낼 수 있습니다.)