我想我已经碰到了 psoc5LP 设备上 USB IP 的极限了。 我有一个复合设备,它有一个接口,具有批量输入和 TESTBOARD_150PC_OUT 处理OpenJTAG命令流的端点。 另一个接口实现了用于调试日志记录的串行 CDC 设备和状态控制台。 OpenJTAG 帧的最大大小为 512 字节,端点的最大大小为 64 字节,因为它是全速 USB 设备。 每个帧都没有传输帧大小,所以我使用非 64 字节的数据包大小作为帧分隔符。由于 OpenJTAG 的最大帧数为 512 字节,而每个 USB 批量数据包为 64 字节,我看到每帧会突发 8 个数据包。 当从主机接收帧时,8 中的每个数据包每 110 到 130 秒到达一次。
目前,我将 USBFS DMA 与手动缓冲区管理结合使用,并在 TESTBOARD_150PC_OUT 端点上接收帧时看到大约 540KB/秒的传输速率。 这相当于 5.4mbit/s,USB 2.0 全速 6EDL_SPI_LINK 的比特率为 12mbit/s。 我已经将调用 USBFS_readOutep 的代码放入 USBFS_EP_X_ISR_exitCallback 以启动 USB DMA 读取操作,并将重启端点 USBFS_enableOutep 的调用放到 USBFS_ARB_ISR_Callback 中。
对于 IN 端点,我不用担心 ISR,只需循环调用 usbfs_getepState 和 USBFS_Loadinep,然后在向主机发送 256 字节响应时看到大约 700 千字节/秒或大约 7mbit/秒。
由于在 SOC 本身上进行处理并等待主机解析每个帧的结果并提交新帧,因此系统的总体带宽要低得多。 我的测试设置将设备安装在自己的专用 USB 主机控制器上,没有任何其他设备或集线器。
在论坛和 TRM 中搜索,我可以使用 DMA 进行自动缓冲区管理,从而启用直通模式。 有人估计过使用BULK端点可以给我的最大数据速率吗? 我不能使用等时端点,因为已经定义了 OpenJTAG 接口。
有人有通过 psoc5LP 设备内置 USB IP 以更快的速度运行的设计示例吗? 如果我使用自动缓冲区管理,有人估计过性能提升吗? 我认为任何增益都将是由于USB仲裁程序在DMA传输到主系统内存之前绕过了将USB数据包复制到内部USBFS SRAM缓冲区的结果。