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.

[参考译文] TMS320F28377S:DSP 28377S USB 虚拟串行端口问题

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/998443/tms320f28377s-dsp-28377s-usb-virtual-serial-port-problem

器件型号:TMS320F28377S
主题中讨论的其他器件:C2000WARE

我 将官方 USB_DEV_serial 示例移植到 DSP 项目中、并使用官方驱动程序。

在使用 DSP 28377S 的 USB 虚拟串行端口中、会遇到以下问题:

1. USB 虚拟串行端口的长时间运行以传输数据(器件是具有信号干扰的电力电子器件)、有时 DSP 的 USB 虚拟串行端口可能会冻结。

发生次数:每10小时显示一次

发生故障时:其它 DSP 模块正常运行;插入 USB 连接器无法解决问题,虚拟串行端口通信无法再次激活;更换其它计算机无法解决问题,无法恢复通信;USBUARTPrimeTransmit()函数未进入;F28x_USB0DeviceIntHandler()中断进入;

由于 F28x_USB0DeviceIntHandler()中断中调用的 USB0DeviceIntHandler()函数被打包为一个库,因此没有清除解决方案。 还请提供前任的建议!

2.操作过程中出现另一个问题:

USB 虚拟串行端口正在通信。 如果 DSP 重新启动、PC 端的通信软件需要手动关闭串行端口-重新打开串行端口、串行通信可以恢复、但不能自动恢复。 您是否想询问是否有一种解决方案可以在这种情况下实现通信的自动恢复?

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

    您好,

    1.虚拟 COM 端口是否有任何特定的情况冻结或在一段时间后是否随机出现?

    您能否检查位于%windir%\inf\setupapi.dev.log 的 PC 端的日志文件,以查看当 com 端口冻结时是否记录了任何异常?

    USB0DeviceIntHandler ()在 C:\ti\c2000\C2000Ware_3_04_00_00\libraries\communications\USB\f2837xs\source\device\usbdhandler.c 中提供

    2. Microsoft 提供了一个名为 devcon.exe的程序。 它是 Windows 设备控制台、这是设备管理器的命令行版本。 您可以定期调用此应用程序,以检查串行端口是否仍处于打开状态。 如果检测到断开连接、则可以删除特定设备、然后重新扫描以恢复通信。

    此致

    Siddharth

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

    大家好、感谢您的重播。

    1.  在 一段时间后,它是随机的,可能是6小时或20小时。下面是“setupapi.dev.log",我检查了3台使用 USB 虚拟串行端口的计算机。  未找到 VID 1CBE 的轨迹。 piece of setupapi.dev.log

    是的、我已经检查了您提供给我的 USBLib 的源代码。 但似乎很难找到问题。

    您是否对如何解决此问题有任何想法、例如检测 到此 问题、然后重新初始化 USB?

    感谢您的回答、  我明白了。

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

    您好,

    它是随机的。 很难找出故障的原因。 我希望在 COM 端口冻结时、日志文件可以捕获任何异常。 您是否有 USB 分析仪。 如果是、请使用 ti 分析 USB 总线、并在 端口冻结时检查是否有任何特定模式。  

    您是否在所有 PC 上都看到此行为?

    PC 上的电源管理也是导致 USB 问题的原因。 Windows 默认设置为关闭 USB 控制器以节省电源,有时它无法为其重新供电。  请确保将 PC 配置为不关闭 USB 根集线器。

    此致

    Siddharth

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

    您好!

    1.我已经在3台 PC 上测试了 USB 虚拟串行端口,  在2 台笔记本电脑上看到了这种行为, 但在台式机上看不到这种行为

    2.我个人认为这不是计算机问题。 因为在 USB 出现故障后、我尝试更换计算机、但仍然无法唤醒 USB 虚拟串行端口。 并尝试了多台计算机的不同 USB 端口。

    3.我尝试使用 USB 分析仪 来分析 USB 总线

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

    您好!

    不确定导致此问题的原因、让我尝试找出。 同时、您能否尝试使用 USB 分析器获取跟踪、以检查 COM 端口冻结之前发生的情况。

    此致

    Siddharth

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

    好的、我正在尝试获取一条迹线。

    但是、由于冻结 是随机发生的、因此捕获数据可能需要一些时间。

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

    好的,如前所述,如果是随机发生的,那么很难找出原因。  

    希望 USB 迹线有助于缩小原因的范围。

    此致

    Siddharth

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

    e2e.ti.com/.../QWE.txt

    最后、在 USB 被冻结时捕获了数据、如上!所示

    我保存了一个"USB Session monitor (.usblog)"文件、但 上传失败!

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

    谢谢。 查看迹线并返回给您。

    此致

    Siddharth

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

    我导入了 F2837xd 的 USB 库以为我们的器件提供虚拟 COM 端口。 我遇到了类似的问题、但我可以通过库中的一些小修补程序来解决问题。 我也使用了 C2000Ware 3.04。

    1. 我为接收器找到了一个缺失的再触发器、这是由文件 usbdcdcc.c 的函数 SetDeferredOpFlag 引起的 此函数调用无法正常工作的宏。 我简化了它、请参阅补丁。
      Index: usbdcdc.c
      ===================================================================
      --- usbdcdc.c	(revision 117)
      +++ usbdcdc.c	(working copy)
      @@ -589,7 +589,7 @@
           // Set the flag bit to 1 or 0 using a bitband access.
           //
       #ifdef __TMS320C28XX__
      -    HWREGBITHW(pui16DeferredOp, ui16Bit, bSet ? 1 : 0);
      +    HWREGBITHW(pui16DeferredOp, ui16Bit, bSet );
       #else
           HWREGBITH(pui16DeferredOp, ui16Bit) = bSet ? 1 : 0;
       #endif
      
    2. 现在、在某些情况下、当 FIFO 中没有剩余空间时、可能会调用 usbbuffer.c 文件中的函数 HandleRxAvailable。 最好停用此问题、请参阅补丁。
      Index: usbbuffer.c
      ===================================================================
      --- usbbuffer.c	(revision 117)
      +++ usbbuffer.c	(working copy)
      @@ -278,6 +278,8 @@
               //
               ui32Avail = USBRingBufContigFree(&psBuffer->sPrivateData.sRingBuf);
       
      +        if(ui32Avail)
      +        {
               //
               // Get as much of the packet as we can in the available space.
               //
      @@ -327,7 +329,7 @@
                       }
                   }
               }
      -
      +        }
               //
               // We need to return 0 in this case to indicate that the lower layer
               // need not perform any buffer maintenance as a result of the callback.
      
    3. 当您使用文件 usbringbuf.c 的函数 USBRingBufWrite 在缓冲区中写入多个字符时、可以在缓冲区存储器之外写入。 写索引设置不合适、我使用以下补丁进行了解析。 经过这些修改后、器件正常工作。
      Index: usbringbuf.c
      ===================================================================
      --- usbringbuf.c	(revision 117)
      +++ usbringbuf.c	(working copy)
      @@ -707,31 +707,9 @@
               //
               // Write the data byte.
               //
      -        psUSBRingBuf->pui8Buf[psUSBRingBuf->ui32WriteIndex] =
      -                                                         pui8Data[ui32Temp];
      -    }
      -    //
      -    // Increment the write index.
      -    //
      -    //
      -    // Update the variable value.
      -    //
      -    psUSBRingBuf->ui32WriteIndex += ui32Length;
      +    psUSBRingBuf->pui8Buf[psUSBRingBuf->ui32WriteIndex++] = pui8Data[ui32Temp];
       
      -    //
      -    // Correct for wrap.  We use a loop here since we don't want to use a
      -    // modulus operation with interrupts off but we don't want to fail in
      -    // case ui32Delta is greater than ui32Size (which is extremely unlikely
      -    // but...)
      -    //
      -	if(psUSBRingBuf->ui32WriteIndex >= psUSBRingBuf->ui32Size)
      -    {
      -        psUSBRingBuf->ui32WriteIndex -= (psUSBRingBuf->ui32Size +
      -                                         (ui32Length - 1));
      -    }
      -	
           while(psUSBRingBuf->ui32WriteIndex >= psUSBRingBuf->ui32Size)
      -    {
               psUSBRingBuf->ui32WriteIndex -= psUSBRingBuf->ui32Size;
           }
       
      


    此致

    M. Hundertmark

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

    Hundertmark、您好!

    感谢您提供这些补丁。 将要求开发团队查看并在 USB 库中添加这些补丁。

    您是否遇到  过任何类似的问题、即虚拟 COM 端口在一段时间后会随机冻结?

    此致

    Siddharth

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

    您好 Siddharth、

    在我的情况下、当数据流的 FIFO 完全填满时、只有接收器 EP 冻结。 发送 EP 正在工作。 未出现整个接口的另一随机冻结状态。

    此致

    M. Hundertmark

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

    Hundertmark、您好!

    好的、明白了。  

    此致

    Siddharth

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

    您好  Siddharth、

    我们现在是否解决了这个问题? usblib 是否已正式更新、或者我是否需要修改代码以自行生成?

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

    您好!

    USB 库尚未更新、稍后可能会在 C2000Ware 的下一版本中完成。 同时、您可以使用修补程序并更新项目中的代码。

    此致

    Siddharth

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

    您好  Siddharth 、您好 Hundertmark、

    1. 我们已将 USBlib 从旧版本更新为最新版本。   并在 我们的项目中更新上述代码。  不幸的是,这个问题没有得到解决

    我 需要再次解释的是:我们的产品是高功率和高频(100KHz)电源。 当电源没有输出时、USB 可以正常工作、传输数百万帧的数据、而不会出现单帧错误。 但是、当电源打开并输出(功率为10kw)时、USB 将报告几百帧的错误、并且无法从错误中恢复。

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

    您好、您描述的问题可能不是由 USB 库中的软件错误引起的。 您的问题似乎是由电源转换器的 EMC 干扰引起的。 对 USB 接口的电气参考点进行分析、对 D-和 D+进行电流补偿扼流圈、对接地回路进行分析等。在我看来、故障排除有望取得更大的成功。

    此致

    M. Hundertmark

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

    您好!

    在这种情况下、当 USB 被冻结时、我们是否有一种从冻结状态恢复的软件方法?

    如何处理我的代码以便在冻结后恢复通信?

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

    您好!

    在 USB 外设复位后、应该可以再次进行通信。 只有硬件上的复位没有成功。
            
    如果检测到 VBUS、则应初始化接口;如果电压 VBus 不再存在、则应关闭接口。 USB 控制器的 VBUS 输入未在该控制器上输出、此任务需要一个通用 IO。 该库为此提供了命令 USBDCDCInit 和 USBDCDCTerm。 对 VBUS 的上升沿和下降沿做出反应的中断例程可能包含以下代码:

             if(pUsbPort->VBusPwr)
             {
               //
               // Pass our device information to the USB library and place the device
               // on the bus.
               //
               USBStackModeSet(0, eUSBModeForceDevice, 0);
               USBDCDCInit(0, &pUsbPort->CDCDevice);
             }
             else
             {
               USBDCDCTerm(&pUsbPort->CDCDevice);
               SetControlLineState( pUsbPort, USB_CDC_DTE_NOT_PRESENT);
    
               pUsbPort->BusConnected = false;
             }

    函数 USBDCDCInit 不仅初始化 USB 控制器、还触发硬件上的复位。

    此致

    M.Hundertmark

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

    您好!

    1." 在 USB 外设复位后、应该可以再次进行通信。 只有硬件上的复位没有成功。"

       "应该可以再次进行通信"、 我们是否需要关闭 虚拟串行端口 并在 PC 上重新打开它? 或者 我不需要任何操作,通信将自动恢复?

    2. 如果我在 对 VBUS 的上升沿和下降沿作出反应的中断例程中添加上述代码 ,  假设我们在 执行该代码后检测到下降沿和上升沿,  我们是否需要关闭 虚拟串行端口 并在 PC 上重新打开它? 或者 我不需要任何操作,通信将自动恢复?

    我们希望 通信自动恢复,并且不想关闭 虚拟串行端口 并重新打开它 。

    非常感谢!

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

    您好!

    整个过程相当于短时间断开设备和主机连接(再次拔下并插上电源)。 主机上的应用程序可识别设备不存在的情况、并且在主机操作系统再次注册设备时必须重新打开虚拟接口。

    此致

    M. Hundertmark

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

    非常感谢!