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.

[参考译文] CCS/TMS320F2.8377万S:USB设备中的数据损坏

Guru**** 2487425 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/660470/ccs-tms320f28377s-corrupted-data-in-the-usb-device

部件号:TMS320F2.8377万S
主题中讨论的其他部件:C2000WARE

工具/软件:Code Composer Studio

您好,

我们的主板(F2.8377万S)用作使用USB库的USB CDC设备。 传输数据包大小为64字节。

Ellisys USB发生器连接到USB链路,用于间歇性连接测试。 当为每750ms设置10ms重置(se0)时,我发现我们的应用程序偶尔会收到损坏的USB数据。 在接收数据的64字节中,前7字节是正确的,但所有其他字节都设置为0。

检查代码后,我发现当接收数据从USB控制器中的FIFO中读取时,出现错误。 复制了64个字节,但只有前7个字节是正确的,其他所有字节都是0。 (由USB.c中的函数USBEndpointDataSet()执行)。 USB控制器端似乎出现问题。 我在主板之前使用另一个USB监控设备,确认USB发生器不会导致该问题。

我知道,如果检测到重置,FIFO将被刷新。  重置是否会导致损坏的数据?   为什么我们只接收前7个字节?   

谢谢!

亨利

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

    我在关注问题所在时遇到了问题。 您能否更好地阐明这一点,并更具体地说明主机是谁,设备是谁,主机在做什么以及设备在做什么?

    我正在努力弄清楚到底发生了什么。

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

    以下是更新:

    我们将F2.8377万S用作USB CDC设备,并使用USB库(C2000Ware_1_00_02_00)。 设备与现成的PC (主机)通信。 传输数据包大小为64字节。

    我们正在执行以下测试以验证间歇性连接方案:
    1. Ellisys USB发生器和USB分析器通过USB链路连接在USB主机和设备之间。
    二. 生成器设置为在总线上检测到输出事务(从主机到设备)时发送10ms重置(se0)。 添加了睡眠功能以控制外出事务和重置之间的时间间隔。 请参见下图:

    [检测到USB输出事务]-->[睡眠X us]-->[在总线上设置重置(10ms)]

    我们发现,如果睡眠时间(如上所述)设置为64us或更大,设备将正确接收所有64字节。 否则,设备仍接收64字节,但只有第一个“Y”(<64)数字字节正确,其他字节设置为零。 正确数据的字节数随着睡眠时间的增加而增加。

    重置似乎会导致USB控制器中的数据损坏,而USB驱动程序会卸载这些损坏的数据并将其传递给我们的应用程序软件。

    我们使用函数USBBufferRead(&G_sRxBuffer, g_TmpReadBuf, ui32BufCharsToGet)读取应用程序中的数据,它返回正确的字节数(64),但数据已损坏。

    我们认为应该有一种机制来防止驱动程序访问损坏的控制器数据。 请提供信息以解决此问题。
    谢谢!
    亨利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Henry,

    我想现在就知道发生了什么。 F2837x正在接收一个64字节的数据输出包,并且在读取FIFO中的字节时,发生了USB重置,这将重置FIFO并导致剩余接收字节丢失。

    这绝对是一个角落。

    当F2837x USB被重置时,将生成中断。 如果是这样,您应该能够通知USB软件捕获从FIFO读取的数据。 在从FIFO读取另一个字节之前,请确保没有发生重置并且有可用的数据。 在调用USBRingBufReadOne()之前,可以在USBRingBufRead()函数中添加这一额外的检查。

    希望这有所帮助。

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

    您好,Sal,

    感谢您提供有关USB重置问题的信息。

    您能否提供一个估计值,说明何时可以提供修复,以及我们应该使用什么标识符来跟踪此问题的进展情况。

    同时,我们在尝试一些临时解决方案时遇到了一些问题:

    1.您能否提供有关如何检查函数USBRingBufRead()中的重置中断的更多详细信息? 此外,如果读取USB中断状态寄存器(USBIS)进行复位检查,它是否会清除或影响寄存器中的任何位?

    2.如果在USB_DEP_RX_PKT_RDY之后立即进行重置,则两个信号可以在同一周期内处理 (参见Function USBDeviceIntHandlerInternal())。 在这种情况下,应用程序可能会接收损坏的数据。 为什么驱动程序在重置后继续处理Rx/Tx?

    谢谢!
    亨利

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

    我们不认为这是一个错误或需要修复的问题。

    当枚举过程再次开始时,USB控制器应触发中断。 这将开始枚举过程。

    读取USBIS寄存器时,将清除中断状态位。 您已正确理解。

    为了实施变通办法,我将创建一个全局变量,用于标识是否已发生重置。 您可以创建此选项,并在枚举过程再次开始时设置此选项。 我相信,当枚举过程开始时,并且USB控制器在重置后重新连接时,您将得到CONN状态位设置。 设置CONN中断状态时,可以设置全局变量。 在USBRingBufRead()函数内,检查是否设置了状态标志。 如果已设置,则从函数返回且不执行USBRingBufReadOne()函数。

    如果您查看USBRingBufReadOne()函数,由于竞争状态,仍然可以从已重置的FIFO读取一个字节,从而读取一个垃圾值。 我不认为这种比赛条件有任何出路。 但可以将读取的垃圾值限制为一个字节。

    希望这能有所帮助,
    SAL