This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6ZRB:仅当使用复合器件时、MSC 速度极慢

Guru**** 1079480 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1120436/tm4c123gh6zrb-extremely-slow-msc-speeds-only-when-using-a-composite-device

器件型号:TM4C123GH6ZRB

您好!

我正在使用  TM4C123GH6ZRB、并尝试实现一个复合器件、该复合器件包含一个批量接口0和一个 MSC 接口1。 当两个接口不在复合器件中时、它们都可以独立工作、但一旦我尝试将它们组合在一起、我就会看到 MSC 传输速度的极度下降。 例如、当我仅运行 MSC 设备时、我可以获得~64kbps。 但是、一旦切换到复合器件、同一个接口将难以获得~8KB 的数据。

我使用的是 TI Tiva MSC 库和 MSC 示例(usblib\device\usbdmsc.c 和 USB_DE_msc)、还使用 TI 的 SPI_FLASH 驱动程序(utils\spi_flash.h)与 SPI 闪存部件相结合。 在我尝试使用 MX25L51245G 时、SPI_FLASH 驱动程序与示例驱动程序 MX66I51235f 的略微修改版本连接。

正在将 复合设备初始化为:

    //Force USB Device mode with no VBUS/ID monitoring.
    USBStackModeSet(0, eUSBModeForceDevice, 0);

    //Initialize our custom BULK interface
    g_sCompDevice.psDevices[0].pvInstance = USBDBulkCompositeInit(0, &g_sBulkDevice, &g_psCompEntries[0]);
    //Initialize a generic MSC interface
    g_sCompDevice.psDevices[1].pvInstance = USBDMSCCompositeInit(0, &g_sMSCDevice, &g_psCompEntries[1]);

    //Initialize USB device as a COMP device with BULK and MSC interfaces defined above
    USBDCompositeInit(0, &g_sCompDevice, COMPOSITE_DBULK_SIZE + COMPOSITE_DMSC_SIZE, (uint8_t *)pucDesciptorData);

这两个接口本身工作正常(只需调用 USBDBulkInit 或 USBDMSCInit)是否有原因、但一旦我尝试将它们置于复合配置中、我就会释放 MSC 接口上的大量吞吐量? 我是否缺少某种配置、或者应该使用某种方法来更好地处理 MSC 传输?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我不是 USB 专家。 我假设您应该在仅 MSC 设备或复合设备中获得类似的性能。 您能回答 以下问题、以便我可以向我们的 USB 专家提出意见。

     -复合器件中的 USB 大容量接口与独立大容量器件的性能是否相同?

     -您是否有 USB 分析器,以便可以比较纯 MSC 设备与复合 MSC 设备之间的事务? 您能告诉我们瓶颈在哪里?

     -当您说 MSC 本身为您提供了更高的吞吐量时,您是否连接到同一个 SPI 闪存? 您提到您正在使用  MX25L51245G。 这两个#define 是否根据您的新 SPI 闪存进行了更改?

    #define MX66L51235F_MEMORY_SIZE 0x04000000
    #define MX66L51235F_BLOCK_SIZE 0x1000

     -您能否比较您的设备、接口和复合设备中仅 MSC 接口与 MSC 接口的端点描述符? 您能否说出可能提供一些提示的任何不同之处?

     -在复合设备中,批量接口和 MSC 接口是否共享同一个端点? 您是否曾尝试为每个端点使用不同的端点?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    -复合设备上的批量接口没有相同的问题,似乎可以正常工作。

    -我将 Wireshark 用作 USB 分析器,唯一的区别似乎是写入命令之间的响应时间较长。 单 MSC 接口器件上为~50ms、复合接口上为~300ms。 除了每个数据包的实际 ACK 之外、似乎没有其他任何东西。

    -在测试复合器件和非复合器件时、我使用相同的 SPI 闪存器件。 存储器大小和块大小已相应地更新。

    描述中唯一的区别是引入了两个接口,但两个接口仍然与非复合器件显示的每个接口相匹配。

    -它们不共享任何端点。 两个接口都有自己的端点集(批量为0x01和0x81)。 对于 MSC 为0x02和0x83)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devon、

    使用 USB 复合接口时、实际上没有进行任何吞吐量/性能分析、因此我没有任何参考点可以说这是异常还是典型的。

    我可以说 的是、库中的复合接口实现不是最平滑的、我可以肯定地看到、这个问题集中在低效处理扩展吞吐量上。 250ms 的差异大致等于您看到的吞吐量下降。

    您是否曾尝试更改设备首先枚举的顺序? 考虑的过程可能是在对第一 个实例和第二个实例进行排序时浪费了周期、并且第一个实例获得了更好的吞吐量。 鉴于您有了写入命令所需时间的基准、您应该能够查看这是否提供了切实的改进、从而为我们提供了有关正在发生的事情的线索。

    测试可能的瓶颈的一种方法是在代码的不同部分之间添加调试信号、例如、当 USB MSC 接口用于写入命令时。 目的是尝试找出时间延长的差异。 这甚至可以通过将 USB 库文件导入到 CCS 工程中来完成、如以下所述: https://www.ti.com/lit/ug/spmu373/spmu373.pdf#page=19

    如果我们能够跟踪根本原因所在、我可能能够提供一些有关如何改进处理的指导、 但遗憾的是、我无法自己手动调试以跟踪此情况、因为我没有像您那样更难设置 USB MSC 接口。

    此致、

    Ralph Jacobi