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 마이크로 컨트롤러에서 작업 할 때 실행 시간이 현저히 짧았습니다.
누구든지 전에이 문제를 겪었습니까? 버퍼에 데이터를 쓰고 주변 장치가 프로세서 시간없이 트랜잭션을 처리하도록 할 수있는 방법이 있습니까? 또는 적어도 엔드 포인트가 트랜잭션 준비가되면 인터럽트를 트리거하십시오.