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.

[参考译文] TM4C1294NCPDT:WriteDataCDC 能够#39;t 保持高数据速率?

Guru**** 2616675 points

Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/965026/tm4c1294ncpdt-writedatacdc-can-t-keep-up-at-high-data-rate

器件型号:TM4C1294NCPDT

以下测试基于 TivaWare_C_Series-2.1.4.178:

多年来、我一直在使用 WriteDataBulk 发送数据、没有任何问题、大约每秒400KB。 要处理 WriteDataBulk,我使用 libusb 驱动程序。

最近、一位客户希望我切换到 WriteDataCDC、以便 Windows 和 Linux 可以使用普通 COM 端口驱动程序与我的器件连接。

遗憾 的是、当使用 WriteDataCDC 时、我会在高数据速率下检测到随机数据丢失、大约为200kb/s、一些数据或数据夹盘变为0、是否有任何数据有类似的问题?

BTW、在 Wireshark 中比较两种模式的数据时、WriteDataBulk 具有明显的优势、它没有数据周围的包装程序、并且在高速情况下、它始终以巨大的数据包8219 B 发送数据

在 WriteDataCDC 中、数据包要小得多、并且每个数据包都围绕真实数据进行包装、从而显著地加重了 USB 堆栈的压力

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

    这是 Beagle USB 480捕获的导线上的真实数据包、数据是斜坡、增量为1

    WriteDataBulk  、320kB/s、始终为64B 数据包、无数据丢失

    对于 WriteDataCDC、数据包大小较小、随机捕获数据丢失  

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

    尊敬的 David:

    我在这里有一些问题需要先回答、因为虽然我了解核心问题、但我没有足够的信息来指导您。

    首先、也是最重要的、这是使用 USB 2.0全速还是 USB 2.0高速? 我想从我看到的情况来看、这是全速、但需要验证(高速需要外部 PHY、因此如果您没有外部 PHY、则为全速)。

    接下来、 是 在 TM4C 上执行 WriteDataCDC 和 WriteDataBulk API、还是在 Windows/Linux 端执行?

    此时、TM4C 的数据接收和/或传输问题是否足够快? 除了数据丢失之外、这是一个单独的部分、但我要询问有关吞吐量的问题。

    最后、您能否详细说明在 TM4C 端使用的 API? 这是否包含开箱即用的应用、我可以轻松地查看这些应用? 或您开发的产品?

    此外、我假设 TM4C 在本例中作为器件运行。 如果我的假设不正确、请告诉我。

    感谢您提供的屏幕截图、我在发布之前看到了它们、这实际上非常有帮助、因为我对8192长度的数据包感到困惑、但64字节的数据包是合理的。  

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

    感谢您的回复!

    以下是一些信息:

    全速、PC 是主机。

    WriteDataCDC 和 WriteDataBulk 在 TM4C 上执行

    从 TM4C 到 PC、数据流基本上是一方面

    我将看到我是否可以对您的示例进行更改以重复该问题。

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

    尊敬的 David:

    [报价用户="David Chance "] WriteDataCDC 和 WriteDataBulk 在 TM4C 上执行

    您能否为这两个函数发布代码、以便我可以查看它们以查看正在使用什么 usblib API?

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

    我在这里住了一段时间,没有发现什么大的区别:)

    uint32_t
    WriteDataBulk (uint8_t * pui8Data、uint32_t ui32NumBytes)

    uint32_t ui32Loop、ui32Space、ui32Count;
    uint32_t ui32ReadIndex;
    uint32_t ui32WriteIndex;
    tUSBRingBufObject sTxRing;

    USBBufferInfoGet (&g_sTxBuffer、&sTxRing);
    ui32Space = USBBufferSpaceAvailable (&g_sTxBuffer);
    ui32Loop =(ui32Space < ui32NumBytes)? ui32Space:ui32NumBytes;
    ui32Count = ui32Loop;
    ui32ReadIndex =(uint32_t)(pui8Data - g_pui8USBRxBuffer);
    ui32WriteIndex = sTxRing.ui32WriteIndex;

    while (ui32Loop)


    G_pui8USBTxBuffer[ui32WriteIndex]= g_pui8USBRxBuffer[ui32ReadIndex];
    ui32WriteIndex++;
    ui32WriteIndex =(ui32WriteIndex == bulk_buffer_size)?
    0:ui32WriteIndex;

    ui32ReadIndex++;
    ui32ReadIndex =(ui32ReadIndex == bulk_buffer_size)?
    0:ui32ReadIndex;

    ui32loop--;


    USBBufferDataWritten (&g_sTxBuffer、ui32Count);
    return (ui32Count);


    uint32_t
    WriteDataCDC (uint8_t * pui8Data、uint32_t ui32NumBytes)

    uint32_t ui32Loop、ui32Space、ui32Count;
    uint32_t ui32ReadIndex;
    uint32_t ui32WriteIndex;
    tUSBRingBufObject sTxRing;

    USBBufferInfoGet (&g_psTxCDCBuffer、&sTxRing);
    ui32Space = USBBufferSpaceAvailable (&g_psTxCDCBuffer);
    ui32Loop =(ui32Space < ui32NumBytes)? ui32Space:ui32NumBytes;
    ui32Count = ui32Loop;
    ui32ReadIndex =(uint32_t)(pui8Data - g_pui8USBRxCDCBuffer);
    ui32WriteIndex = sTxRing.ui32WriteIndex;

    while (ui32Loop)


    G_pui8USBTxCDCBuffer[ui32WriteIndex]= g_pui8USBRxCDCBuffer[ui32ReadIndex];
    ui32WriteIndex++;
    ui32WriteIndex =(ui32WriteIndex = UART_buffer_size)?
    0:ui32WriteIndex;

    ui32ReadIndex++;
    ui32ReadIndex =(ui32ReadIndex = UART_buffer_size)?
    0:ui32ReadIndex;

    ui32loop--;


    USBBufferDataWritten (&g_psTxCDCBuffer、ui32Count);
    return (ui32Count);

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

    您是否有偏好的 CDC 示例? 我可以查看是否可以进行最小的更改来重复或找出问题

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

    尊敬的 David:

    由于您使用的是 TivaWare 2.1.4、因此仍然可以让我为您附加一个项目、该项目现已在2.2.0中发布、但我也提供了2.1.4版。

    e2e.ti.com/.../7180.usb_5F00_dev_5F00_cdcserial.zip

    如果我回忆一下、对于最终发布的示例、使用这些状态的代码被删除、因为它们没有添加值、不确定是否需要为此删除它们、但图中我要提到:

    #define COMMAND_PACKET_RECEIVTED 0x00000001
    #define COMMAND_STATUS_UPDATE 0x00000002
    #define COMMAND_RECEIVATE 0x00000004 

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

    下载项目并进行编译、不会出现错误

    我更改了 target.config.ccxml 以指向 TI XDS 100v3 USB 调试探针并检查了 Tiva TM4C1294NCPDT。 保存配置并测试连接以确认其正常

    之后,当我尝试运行调试时,它会弹出此错误(因为我不经常导入新项目,似乎每当我导入时,我都会遇到这样的问题,我永远不记得我是如何修复它的......)

    我错过了什么? 提前感谢您的帮助!

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

    [引用 USER="David Chopy">]之后,当我尝试运行调试时,它会弹出此错误(因为我不经常导入新项目,所以似乎每当我导入新项目时,我都会遇到这样的问题,我永远不记得我是如何修复它的......) )如果.launch 文件中的信息损坏或由之前版本的 CCS 创建、则可能会发生错误。

    尝试 删除.launch 文件

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

    谢谢、这解决了启动问题。 我将把一些代码移动到这个项目以查看我是否可以重复这个问题

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

    我根据您的示例重新编写了代码、现在可以正常工作、数据包不再是小数据包。 它必须是我代码中拧紧的某个位置。

    谢谢!

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

    尊敬的 David:

    很高兴听到这已经足够了! 为了便于将来参考、我们在2.2.0.295 (发行说明中的完整列表)中添加了大量示例项目、因此、虽然您目前坚持使用2.1.4、但在查找参考固件时、请记住这一点可能还不错。 几乎所有内容都与2.1.4兼容(只添加了一些新 API)。 希望这有助于您了解!

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

    非常感谢!