英飞凌
直播中

李丹

7年用户 1347经验值
私信 关注

用EP0测试USB3.0速度遇到的疑问求解

我想用 EP0 测试 USB3.0 的速度。  主机通过控制传输向 FX3 的 EP0 发送 512 字节数据(FX3 的 EP0 最大数据包大小为 512 字节),我发现固件程序必须在设置数据包的回调函数中调用 CyU3PUsbGetEP0Data(512, recvBuf,NULL) 函数,主机才能继续发送。 是否通过控制权转移来实现?
以下是代码片段,请注意对 0x81 的处理:
/* 处理 USB 设置请求的回调。 */
CyBool_t CyFxBulkLoopApplication::CyFxBulkLpApplnUSBSetuPCB (
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);
}
}
}

}


                                                                                                                                                                                                                                                                                                                                                                                                        
                                                        

回帖(1)

尚文清

2024-5-29 16:50:03
根据您提供的信息,您想使用EP0测试USB 3.0的速度。在这种情况下,您需要确保在固件程序中正确处理USB设置请求的回调函数。以下是一些建议和解释:

1. 首先,确保您已经正确初始化了FX3设备,并配置了EP0作为控制端点。

2. 在处理USB设置请求的回调函数中,您需要检查接收到的请求类型。根据您的代码片段,您已经检查了bType字段。这是正确的,因为bType字段表示请求类型。

3. 对于0x81请求,这是一个控制传输请求,其中数据从主机传输到设备。在这种情况下,您需要在设置数据包的回调函数中调用`CyU3PUsbGetEP0Data(512, recvBuf, NULL)`函数。这个函数的作用是从EP0接收数据,并将数据存储在`recvBuf`缓冲区中。

4. 在调用`CyU3PUsbGetEP0Data`函数后,您需要确保正确处理接收到的数据。这可能包括检查数据长度、处理数据等。

5. 最后,您需要确保在回调函数中返回正确的状态。如果处理成功,返回`true`;如果处理失败,返回`false`。

以下是修改后的代码片段:

```c
/* 处理 USB 设置请求的回调。 */
CyBool_t CyFxBulkLoopApplication::CyFxBulkLpApplnUSBSetupCB (uint32_t setupdat0, /* SETUP Data 0 */
                                                                uint32_t setupdat1 /* SETUP Data 1 */)
{
    ...
    if (bType == ...)
    {
        // 检查请求类型
        if (request == 0x81)
        {
            // 控制传输请求,从主机接收数据
            CyU3PReturnStatus_t status = CyU3PUsbGetEP0Data(512, recvBuf, NULL);
            if (status == CY_U3P_SUCCESS)
            {
                // 处理接收到的数据
                ...
                return true; // 处理成功
            }
            else
            {
                return false; // 处理失败
            }
        }
    }
    ...
}
```

通过以上步骤,您应该能够正确处理USB 3.0的控制传输请求,并测试EP0的速度。请注意,实际速度可能会受到硬件、固件和软件等多种因素的影响。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分