我想用 EP0 测试 USB3.0 的速度。 主机通过控制传输向 FX3 的 EP0 发送 512 字节数据(FX3 的 EP0 最大数据包大小为 512 字节),我发现固件程序必须在设置数据包的回调函数中调用 CyU3PUsbGetEP0Data(512, recvBuf,NULL) 函数,主机才能继续发送。 是否通过控制权转移来实现?
以下是代码片段,请注意对 0x81 的处理:
/* 处理 USB 设置请求的回调。 */
CyBool_t CyFxBulkLoopApplica
tion::CyFxBulkLpApplnUSBSetu
PCB (
uint32_t setupdat0, /* SETUP Data 0 */
uint32_t setupdat1 /* SETUP Data 1 */
)
{
...
if (bType == CY_U3P_USB_Vendor_RQT)
{
如果 (bRequest == 0xE0)
{
isHandled = CyTrue;
CyU3PUsbAckSetup ();
CyU3PThreadSleep (100);
CyU3PDeviceReset(CyFalse);
}
else if(bRequest==0x80)
{
isHandled = CyTrue;
if(bReqType == 0x42)
{
CyU3PUsbGetEP0Data(5, (uint8_t*)glBulkLoop_p->recvBuf, NULL);
//将收到的字符大转小,小转大
for (uint8_t i=0;i<5;i++)
{
uint8_t ch = glBulkLoop_p->recvBuf[i];
if (ch>= 'a' ch<= 'z')
glBulkLoop_p->recvBuf[i] = ch ~32; // 转换为大写
else if (ch>= 'A' ch<= 'Z')
glBulkLoop_p->recvBuf[i] = ch | 32; // 转换为小写
}
}
else if(bReqType == 0xC2)
{
CyU3PUsbSendEP0Data(5, glBulkLoop_p->recvBuf);
}
}
else if (bRequest == 0x81)
{
isHandled = CyTrue;
如果 (bReqType == 0x42)
{
/*必须这样做,主机才能继续发送。*/
CyU3PUsbGetEP0Data(512, (uint8_t*)glBulkLoop_p->recvBuf, NULL);
}
}
}
}