【发布时间】:2017-09-20 07:41:28
【问题描述】:
我刚开始研究XMC4500 microcontroller。我目前正在实现 USB CDC 通信,但遇到了问题。 在调用函数“USBD_VCOM_SendData”后,程序会等待一帧发送数据。 更准确地说,程序在“Endpoint_Write_Stream_LE”中的“usbd_endpoint_stream_xmc4000.c”文件中等待。它在“Endpoint_WaitUntilReady()”函数中等待端点准备就绪。
#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 微控制器上工作时,执行时间明显缩短。
以前有人解决过这个问题吗? 有没有办法将数据写入缓冲区,然后让外围设备处理事务而不需要处理器时间? 或者至少在端点准备好事务时触发中断。
【问题讨论】:
标签: arm usb execution-time