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.

[参考译文] TMS320F28069:如何复位 USB 寄存器

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1229943/tms320f28069-how-to-reset-usb-registers

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

您好!

我正在 使用 C2000 Ware 软件套件中的 TI USB 库。 我的 CCS 版本:9.3.0.00012。 我已经将 USB 堆栈的源文件导入到项目中、因此我可以修改它。

库的版本在源文件中编写为注释、如下所示:

//$TI 版本:F2806x 支持库 v2.06.00.00 $
//$Release Date:星期五 Feb 12 19:15:11 IST 2021 $
//$Copyright:
//版权所有(C) 2009-2021德州仪器(TI)公司- http://www.ti.com/

我相信该库是从 Stellaris 微控制器系列移植到 C28x 系列的。

我使用 USB 库的主机函数与大容量存储设备全速进行点对点通信。 有时设备无法响应、并且我在 usbhostenum.c 文件中的 PipeRead 或 PipeWrite 函数中收到 NAKTO (NAK 超时)错误。 管道读取/写入函数处于阻塞状态(即、我在那里等待、直到事务完成)。 我意识到这些函数中存在一个 while perever 循环、该循环导致我的程序卡住、因此我使用一个计时器以500ms 的超时时间退出。

我遇到的问题是 、在我退出此函数后、除了 DSP 复位(使用看门狗)之外、我始终无法恢复与器件的通信。 我已经尝试使用 C2000Ware 示例项目中的初始化函数重置 USB 堆栈。 这有时有效、但并非始终有效。 我想我曾看到过 TXPKTRDY 位置1、阻止主机发送任何其他通信的情况。

我的问题是、什么是复位所有 USB 寄存器以实现"全新"启动的最佳方法。 我不希望每次发生这种情况时都来复位 DSP? 我认为、重新初始化缺少了一些东西、重新初始化使通过看门狗的 DSP 复位正常工作、而不是 USB 堆栈的软件复位正常工作。

此外、使用非阻塞路由是否也会更好地工作? 如何实现非阻塞管道读取/写入?

谢谢

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

    您好!  

     USBPOWER 寄存器中有几个位(RESET 和 SOFTCONN 位)。 您可以尝试设置这些位来重置 USB。

    此致

    西达尔特

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

    谢谢 Siddharth

    这还没有解决问题。

    以下是我初始化 USB 堆栈的方式:

    SysCtrlRegs.PCLKCR3.bit.USB0ENCLK = 1;//启用 USB 外设时钟

    //寄存中断处理程序并使能中断
    USBGPIOEnable();
    USBIntRegister (USB0_BASE、F28x_USB0HostIntHandler);
    IntMasterEnable();

    //初始化 USB 堆栈模式并传入模式回调。
    USBStackModeSet (0、eUSBModeForceHost、ModeCallback);

    //注册主机类驱动程序。
    USBHCDRegisterDrivers (0、g_ppHostClassDrivers、NUM_CLASS_DRIVERS);

    //打开海量存储类驱动程序的实例。
    G_psMSCInstance = USBHPSCDriveOpen (0、(tUSBHMSCCallback) MSCCallback);

    //初始化电源配置。 这会设置电源使能信号
    //设置为高电平有效,且不启用电源故障。
    USBHCDPowerConfigInit (0、USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER);

    //初始化 USB 控制器以使 OTG 运行,轮询时间为2ms
    //速率。
    USBHCDInit (0、g_pHCDPool、HCD_memory_size);

    EALLOW;
    HWREG (USBMODESEL)= USBMODESEL_HOST;
    HWREG (USB0_BASE + USB_O_GPCS)= USBGPCS_HOST;
    EDIS;


    G_Estate = State_no_device;

    以下是在器件停止后我如何尝试重新连接到该器件:

    USBHCDDeviceDisconnected (0、0);

    //初始化 USB 堆栈模式并传入模式回调。
    USBStackModeSet (0、eUSBModeForceHost、ModeCallback);

    //注册主机类驱动程序。
    USBHCDRegisterDrivers (0、g_ppHostClassDrivers、NUM_CLASS_DRIVERS);

    //打开海量存储类驱动程序的实例。
    //g_psMSCInstance = USBHPSCDriveOpen (0、(tUSBHPSCCallback) MSCCallback);

    //初始化电源配置。 这会设置电源使能信号
    //设置为高电平有效,且不启用电源故障。
    USBHCDPowerConfigInit (0、USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER);

    //初始化 USB 控制器以使 OTG 运行,轮询时间为2ms
    //速率。
    USBHCDInit (0、g_pHCDPool、HCD_memory_size);

    EALLOW;
    HWREG (USBMODESEL)= USBMODESEL_HOST;
    HWREG (USB0_BASE + USB_O_GPCS)= USBGPCS_HOST;
    EDIS;


    G_Estate = State_no_device;

    你能告诉我是否遗漏了任何步骤吗?

    重置 USB 硬件和 USB 驱动程序堆栈需要执行哪些步骤。

    谢谢

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

    您好!

    我们将查看规范并在几天后作出响应。

    此致。

    西达尔特  

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

    好的、谢谢、

    还有几个问题。

    USBCSRL0中的错误标志有什么影响? 在文档中、它说它必须由软件清除。 我有时会看到设置了该位。 如果它未被清除、这是否会影响重新连接到主机?

    此外、我还看到有时在尝试重新连接到器件时在 USBIS 寄存器中设置了 SOF 位。 我只是简单地读取该寄存器来清除有效的中断标志。 除了读取该寄存器之外、还有什么其他的事情要做吗?

    我需要注意哪些寄存器可以容纳 USB 通信并阻止连接?

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

    您好!  

    将在明天回复您的查询。  

    此致

    西达尔特

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

    尊敬的 Siddharth:

    您的最终目标有什么新闻?

    我已经尝试调试此寄存器一段时间了、还有关于 USBDEVCTL 寄存器的一些问题。 它有一些只读标志会发生变化、我想知道原因。

    当一切正常工作时(通常在电源复位后)、在枚举连接的器件之后、该寄存器的值为0x5D。 这意味着:

    位1 -会话已开始

    位2 -主机模式

    位4-3 - VBUS 有效

    位6 -检测到全速器件

    通常、当我们遇到通信错误或停顿并尝试重新连接器件时、我们会使用我在前一篇文章中分享的逻辑。 我注意到的是、当我使用 USBHCDTerm 终止会话时、控制器会永久进入器件模式、因此我不使用该功能。 但即使没有它、控制器仍会切换到器件模式。 此函数清除寄存器 USBDEVCTL 中的 SESSION 标志、永远无法以主机身份重新连接到器件。 调用之后、USBDEVCTL 寄存器报告0x98或0x99、这意味着它在电缆的 OTG B 侧以器件模式运行(请确认是否正确)。 我可以使用  USBHCDTerm 、但注释掉该调用 USBOTGSesionRequest (USB0_BASE、false);以使控制器保持会话标志开启。 无论如何、这对于重新连接到器件没有太大帮助。  

    USB 控制器可以单独清除会话标志吗? 我相信我也看到过这种情况吗?

    什么可能会使 USB 控制器切换到设备模式、即使我没有将它设置为设备模式? API 中的注释提示、使用 USBHCDTerm 之后必须调用 USBHCDInit 以重新启动新的会话。 执行此操作后、主机模式(位2)标志将永远不会设置、并且控制器会在器件模式下运行。 只有电源复位才能使其退出器件模式并使我能够重新连接到器件。

    确保控制器始终作为主机运行的正确方法是什么? 我们是否可能在 OTG 模式下运行、而不像这样对其进行设置。 USB 控制器默认为设备模式吗? 如果可以、我们如何可靠地更改为主机模式?

    那么 USBGPCS 寄存器如何呢? 我将此设置为0x00、但 USBDEVCTL 仍将进入器件模式。

    请注意、硬件未使用 ID 引脚、这是因为我们期望不使用 OTG USB。 我们是否仍然必须使用该引脚。 现在我不清楚这个引脚的工作方式、以及 F28069是否支持这个引脚。

    期待您的专家帮助。
    谢谢

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

    您好!  

    将检查它为什么默认为设备模式并对您进行更新。  

    您是否可以通过在  USBHCDTerm 之后调用以下函数来尝试将栈强制设置为主机模式

    USBStackModeSet (0、eUSBModeForceHost、ModeCallback);

    此致

    西达尔特

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

    是、

    我将调用该函数。

    它也在我在上面分享的代码片段中。

    请告诉 我您在我之前的文章中找到的有关器件模式、会话以及 ID 引脚/OTG 模式的信息。

    谢谢

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

    您好!

    我将进一步调试、并告知您。 此时、我不确定是什么原因导致了这个问题。

    此致

    西达尔特

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

    尊敬的 Siddharth、您是否能够进一步调试上述内容?

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

    您好!  

    F2883x 上有一个在器件和主机模式之间切换的双检测示例。 我正在浏览代码以确定它是如何处理的。 会让您在我的观察结果上发帖。

    此致

    西达尔特

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

    尊敬的 Siddharth、感谢您进一步努力。 您多久能提供一次更新?

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

    您好!  

    我看了 F2838x 上双路检测示例的源代码。  

    要复位 USB 寄存器、它会调用以下函数  

    SYSCTL_disablePeripheral (SYSCTL_Periph_CLK_USBA);

    看起来 USB 时钟被禁用以清除所有 USB 寄存器。

    F2806x 的等效代码应为  

    SysCtrlRegs.PCLKCR3.bit.USB0ENCLK = 0;

    然后,为了重新初始化到主机模式,使用以下代码片段

    USBStackModeSet (0、eUSBModeForceHost、ModeCallback);
    HostStackInit ();
    USBHCDInit (0、g_pui8HCDPool、myUSB0_LIB_HCD_MEMORY_SIZE);
    G_eCurrentUSBMode = eUSBModeForceHost;

    此致

    西达尔特

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

    谢谢 Siddharth。

    我将尝试这些函数调用序列、并报告是否解决了问题。 我已经在使用其中的一些例程、但顺序不同。

    您是否找到有关 USBID 引脚的任何信息? 对于 F28069、没有太多文档。

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

    您好!  

    请尝试告知我们它是否解决了问题。  

    F28069不支持 USB ID 引脚。

    此致

    西达尔特