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:TMS320F28377S:TMS320F28379D:C2000Ware 事件问题中的 USB 示例

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/681270/tms320f28377s-tms320f28377s-tms320f28379d-usb-examples-from-c2000ware-events-problems

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

您好!

我在 F28377s 电路板上、我的问题是关于 USB (代码使用多个 USB CDC)

我的问题是关于这个帖子,但是它已经关闭了。

https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/632973

它 在 USB ControlHandler 通知上:

当我在计算机和电路板之间连接 USB 电缆时、我会收到通知 ControlHandler、事件= 0 =已连接。

在同一个处理程序中、存在"断开连接"的情况

然后、报告的问题是、当电缆拔出时、未收到此"断开"事件。

为我提供的解决方案是在 GPIO 上的 USB 电源引脚 Get 上实现例程。

当该引脚变为高电平时、调用 USBDevConnect、然后当该引脚变为低电平(电缆拔出)时、调用 USBDevDisconnect。

这就是我所做的、但是在调用 USBDevDisconnect 后、电缆拔出时不会调用 ControlHandler。。。

然后、再次插入电缆时、事件"Connect"不会被调用。

:-)

我的目的是通知应用电缆已插入或未切换高层所需的内部模式。

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

    您好!

    奇怪的是,对 USBDevDisconnect 的调用会将 USB_power 寄存器的 SOFTCONN 位置为0,这会在 USB_IS 位 DISCON 中生成它为1 (0xFE)

    但是在 USBIntStatus 上:

    USBIntStatus (uint32_t ui32Base、uint32_t * pui32IntStatusEP)
    
    {
    
    uint32_t ui32Status = 0;
    
    * pui32IntStatusEP = 0;
    
    uint32_t usbis = 0;
    
    uint32_t raxis = 0;
    
    uint32_t txis = 0;
    
    //
    
    检查参数。
    
    //
    
    assert (ui32Base == USB0_BASE);
    
    //
    
    进行 while 操作以确保在继续之前清除所有状态寄存器。
    
    //这样就消除了竞争条件、这会导致 USB 中断保持高电平
    
    //并且永远不会再次被触发。
    
    //
    
    执行
    
    {
    
    //获取通用中断状态。
    
    usbis =(uint32_t) HWREGB (ui32Base + USB_O_IS);
    
    //获取发送中断状态。
    
    TXIS =(uint32_t) HWREGH (ui32Base + USB_O_TXIS);
    
    //获取接收中断状态。
    
    坐标轴=(uint32_t) HWREGH (ui32Base + USB_O_RXIS);
    
    //获得一般中断状态,这些位进入高8位
    
    //返回值。
    
    ui32Status |= usbis;
    
    //获取发送中断状态。
    
    *pui32IntStatusEP |= txis;
    
    //获得接收中断状态,这些位进入的第二个字节
    
    //返回的值。
    
    *pui32IntStatusEP |=((uint32_t)坐标轴<< USB_INTEP_RX_SHIFT);
    
    }while (usbis!= 0x0000 || txis!= 0x0000 ||坐标轴!= 0x0000);
    

     (笑声)

    读取状态可获得 ui32Status=0!

    之后、状态为0的调用的处理程序无法对"断开"事件做出反应。

    ???

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

    我们正尝试研究这一点。
    很快就会回来。

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

    作为一个器件、USB 控制器不会由于断开而产生中断。

    您可以通过监控 VBUS 来相应地设置和清除 SOFTCONN 位。

    您看到的确切问题和事件顺序是什么?

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

    我在上面的链接上测试了向我建议的解决方案(很糟糕的是,这个帖子被关闭了:-())

    if (GpioDataRegs.GPBDAT.bit.GPIO46 = 1)

    USBDevConnect (USB0_BASE);

    其他

    USBDevDisconnect (USB0_BASE);

    但这不会生成包含"断开"信息的处理程序。

    我还记得我的目标:知道 USB 电缆何时拔出非常简单!

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

    这不会创建断开事件。 通过监控 VBUS、您可以确定它是否已断开连接。

    如需更多信息、请参阅 C2000Ware 中有关 USB 的 TRM 章节和 USB 库用户指南。

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

    您好!

    所以,这是我上面链接的帖子的目的,其中提供给我的解决方案是:-(

    那么:如何使用 ui32Event=1由 pfnControlCallback 调用?

    //
    //! 器件已与 USB 主机断开连接(由器件类别
    //! 仅限)。
    //!
    //! 注意:由于 LM3S3748修订版 A 中的硬件勘误表、此
    //! 自供电 USB 设备断开连接
    时、不会将事件发布到这些设备//! USB 主机的数据。
    //
    #define USB_EVENT_DISCONNECTED (USB_EVENT_BASE + 1)
    

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

    4.3.3.7 USB_EVENT_DISCONNECTED
    定义:
    #define USB_EVENT_DISCONNECTED
    描述:
    器件已从 USB 主机断开连接(仅供器件类使用)。
    注:
    在设备模式下,如果 MCU,则不会报告 USB_EVENT_DISCONNECTED
    PB1/USB0VBUS 引脚被连接至一个固定的+5伏而不是直接连接至 VBUS 引脚
    USB 连接器上。

    当器件与主机断开连接时、不会产生中断。 我相信您必须自己监控 VBUS 引脚。 然后、您可以设置已断开连接的事件状态并从应用程序调用回调函数。

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

    好的、

    我实现这一点:

    uint8_t NewPowerStatus;
    
    NewPowerStatus = DV_GPIO_GetMacro (DV_GPIO_USB_POWER_INFO_ID);
    
    IF (IsRisingEdge (NewPowerStatus、DV_USB_PowerOldStatus)
    ){
    USBDevConnect (USBA_base);
    }
    否则(IsFallingEdge (NewPowerStatus、DV_USB_PowerOldStatus)
    
    ){
    USBDevDisconnect (USBA_base);
    DV_USB_iControlHandler (NULL、USB_EVENT_DISCONNECTED、0、NULL);
    }
    
    DV_USB_PowerOldStatus = NewPowerStatus;
    

    但是、当电缆再次插入时、不会再次调用连接事件。

    如果我在上升沿检测时调用它、在第一个插件上、回调将被调用两次。 (通过 USB 堆栈和我的上面的补丁)。

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

    在您的应用中、在您看到 VBUS 引脚变为高电平之前、不要设置 SOFTCONN。 或者、您可以先进行设置、然后在应用确定 VBUS 为低电平时将其清除。

    您可以基于 VBUS 创建外部中断(XINT)、并在上升沿或下降沿触发中断。 然后在 ISR 内部检查 VBUS 的状态。 如果 VBUS 为高电平、则设置 SOFTCONN。 如果 VBUS 为低电平、则清除 SOFTCONN。

    希望这对您有所帮助。

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

    您好!


    检测 GPIO 上 VBUS 的上升沿和下降沿正是我在上面写的代码中所做的。 我无法使用外部中断 XINT、因为在我的应用程序上、所有中断都已被使用!


    因此、我使用每1ms 拉一次 GPIO 的后台任务。 然后、我确实说过:


    如果 VBUS 为高电平、则置位 SOFTCONN 位。 如果 VBUS 为低电平、则清除 SOFTCONN。 我不知道这会产生什么影响。 似乎这会将 USB 引脚 D+/D-设置为三态。 但无论如何、这不会导致在连接/断开事件时调用 pfnControlCallback (通过 USB 堆栈)。


    这就是为什么我在 VBUS 下降沿向它添加了一个手动调用、以向我的应用表明电缆已插拔。


    但如果我在上升沿检测中添加此调用、并在第一个电缆插件上添加事件"connect"、则此回调将被调用两次:一次是 USB 堆栈由于枚举而调用、另一次是我自己在 VBUS 上升沿检测中调用...

    我正在寻找一种方法、在连接/断开事件的情况下、每个电缆插件/插件上只能调用 pfnControlCallback 一次。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用 C 变量来确定之前是否调用了该函数、以及是否是第一次将 VBUS 置为高电平。 在这种情况下、请勿从您的应用程序调用函数。 让 USB 库单独调用它。 我认为这应该解决这个问题。

    此致、
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的
    测试后、此行为正常工作。
    只需根据 controlCARD 做一个注释。
    硬件通过一个100K 电阻器将 USB VBUS 连接到一个 GPIO。 内部二极管将输入电压限制为3.3V。
    但是、这样、当连接器中没有电缆时、GPIO 输入没有固定状态。 然后、GPIO 输入检测危险状态。

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

    很高兴您能正常工作! 感谢您提供的有用信息。

    SAL