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.

[参考译文] USB 堆栈 VBUS/ID INT58 NDA

Guru**** 2618015 points

Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/781429/usb-stack-vbus-id-int58-nda

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:TM4C123

  当设计工程师  需要支付年度费用来 重新分配 USB 时、处理 USB 数据表信息的首要秘密是什么? 坦率地说、在处理数据传输处理错误信息、中断故障和其他随机崩溃的所有问题后、USB 当局似乎徒劳地尝试继续这种做法。 不知道一些过去的 TI 工程师如何解读 USB 协议以进行器件处理、这让我 相信 他们已经/被弄糊涂了。 当 USB 外设 VBUS 引脚 与 高电流插入电缆短路且   输入端没有1uF 最小电容时、可以看到这一点。 也许有充分理由  将任何电容值添加到 VBUS 引脚上似乎会影响外设的压降检测寄存器区域、即使在器件模式下未使用时也是如此。

我 一直在处理的"待处理"问题的一部分 涉及(usb.c) 3种不同器件模式(器件、主机、OTG)的处理。 在(usbdenum.c)尝试混淆 处理、VBUS/ID 引脚的硬件控制 和 NDA 数据表缺失寄存器位说明任何真正尝试使用 USB (快速)翻新以供 Windows 客户端使用的尝试似乎都是徒劳的。 寄存          器 USBIE (中断使能)的另一个关键区域 USB0_INT58中断处理和软件未能清除(startup_ccs.c)中指定或在代码中任何位置注册的 NVIC 全局中断。   实际上无关紧要、因为 USB0_INT58在器件模式下不工作、并且 在其他模式下可能会出现问题、IDK!  但是 USB0_INT58未被正确清除、 如果 没有任何 INTClearUSB0 ()、展开挂起似乎是下一个最佳方法。

也就是说、根据 在设备定义的 USB/ID 引脚的三种模式处理中写入的脚注、我已经审查了设备模式 VBUS/ID 引脚的处理方式被几次调用混淆了。

 USB 堆栈传递变量的处理以及(usbdenum.c)如何确定更新(usb.c)后的模式以匹配逐字记录、如下所示。  似乎缺少一个强制器件模式的调用(usbdenum.c)、该调用被添加到 USBStackModeSet()的(usbdenum.c)处理中。  难怪在将 USB 电缆插入主机计算机数百次后、VBUS 引脚最终从高电流中短路时、我感到很困惑。 传递变量 eUSBForceDevice 对 USB_O_GPC 没有影响、因为它不存在。

//
//强制 VBUS/ID 为高电平、器件模式(如果请求)。
//
if (g_iUSBMode = eUSBModeForceDevice)
{
//map_USBDevMode (USB0_BASE);
HWREG (USB0_BASE + USB_O_GPC)|= USB_GPCS_DEVMOD_DEV;
}
否则、如果(g_iUSBMode = eUSBModeOTG)
{
//
//要在有源器件模式下运行,OTG 信号必须处于激活状态。
//这允许控制器检测到断开连接。
//
MAP_USBOTGMode (USB0_BASE);
}
其他
{
//
//在所有其他情况下,将模式设置为设备。 此函数不应
//在 OTG 模式下被调用。 主动监控 VBUS、ID 必须拉高。
//
G_iUSBMode = eUSBModeDevice;
MAP_USBDevMode (USB0_BASE);
} 
//
void
USB0DeviceIntHandler (void)
{
静态 uint32_t ui32Status;

/*取消挂起 USB 全局 NVIC 中断*/
//IntPendClear (58);

//
//获取控制器中断状态。
//
ui32Status = MAP_USBIntStatusControl (USB0_BASE);

//
//调用内部处理程序。
//
USBDeviceIntHandlerInternal (0、ui32Status);
} 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    良好的项目符号校验测试、在(startup_ccs.c)中禁用 USB0_INT58注册。 如果 USB 端口被插入主机、MCU 循环 POR 周期、否则完成 POR、并且在未插入时等待端点连接状态。 无论是否已注册,都不会调用 USB0DeviceIntHandler()。 当示例软件存在中断处理问题时、NDA 会有很多内容。

    软件似乎不需要清除(INT58)、因为它已经被热接线直接连接到 USB 控制器外设、谁知道。 用于检查 USB0中断状态事件的批量器件库调用永远不会在 USBDeviceIntHandlerInternal()内部得到处理。 USB0器件客户端事件状态必须通过 USB 库层进行筛选、因此状态中断不能由(USB_dev_bulk.c)处理! 批量器件示例如何通过显示处理批量器件客户端中断状态事件的正确方法来帮助社区加快上市速度?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 BP101、

    虽然我无法说我已经完全掌握了手头的问题、但我可以评论"INT58"、又称 USB 中断。 器件内只有一个 USB 中断、它是 INT 58 (矢量编号)/INT 42 (实际中断编号)。 因此、不起作用的想法是错误的、如果它不起作用、USB 将不适用于我们的任何 TivaWare 示例、我们将拥有一个无用的外设。

    如前所述、我不清楚您看到的具体问题是什么、但 USB 中断毫无问题地工作、我们的示例显示这与您的说法相反。 关于可用性示例、 我们有很多客户从批量示例开始将产品投入市场、并在其基础上构建定制应用、而无需修改 USB 堆栈的任何部分即可证明其工作方式 器件快速推向市场所需的所有功能。

    也许您上周尝试的 USB 库变色导致了这一最新问题、您可能希望恢复、看看您是否仍然观察到同样的情况。 帮助您调试系统设置的想法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    也许在袖带外看起来都适合于散装设备的搬运、请仔细观察并进行几次您自己的测试。

    [引用 USER="Ralph Jacobi"]它是 INT 58 (矢量编号)/INT 42 (实际中断编号)。[/引用]

    实际上、42是调试寄存器中的位数、而不是 Tivaware (hw_ints.h) 寄存 矢量58。

    [引用 user="Ralph Jacobi"]有关示例的有用性, 我们有很多客户从批量示例开始将产品投入市场、并在其基础上构建定制应用、而无需修改 USB 堆栈的任何部分即可证明其工作方式 产品快速推向市场所需的所有功能。[/quot]

     挂起清除 (INT58)是我的补丁、没有执行任何操作来清除寄存(startup_ccs.c)中断和 从未发生的处理。 USB0 不是 已注册的信标中断 、必须在进入下面的矢量中断处理程序例程时清除。 如果 USB0大容量器件应该使用信标或 GPTM 计时器 来调用 INT58矢量、在哪里/如何配置?

    编辑:即使 INT 状态已清除多次、USB 重置也会循环多次插入电缆。 这种行为使 INT58看起来被应用程序忽略。  

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

    因此、根据 Foot 注释 (HW_USB.h) 、下面的调用(USB.c)也被错误配置为强制 VBUS/ID 引脚为高电平(0x3) 0x3是调用 StackModeSet (0、eUSBModeForceDevice、0)。

    针对器件模式设置(USB0_O_GPCS = 0x1)的适当引脚状态不会强制 VBUS/ID 为高电平。 否则、如果不正确、则需要更正十六进制解码的脚注(HW_USB.h)。

    //
    //
    //! 将 USB 控制器的模式更改为设备。
    //!
    //! \param ui32Base 指定 USB 模块基址。
    //!
    //! 此函数将 USB 控制器的模式更改为器件模式。
    //!
    //! 注意此函数只能在支持
    //! OTG 操作。
    //!
    //! \无返回。
    ////
    *****************
    void
    USBDevMode (uint32_t ui32Base)
    {
    //
    //检查参数。
    //
    断言(ui32Base == USB0_BASE);
    
    //
    //将 USB 控制器模式设置为设备。
    //
    HWREGB (ui32Base + USB_O_GPC)= USB_GPCS_DEVMOD;
    
    //USB_GPCS_DEVMODOTG | USB_GPCS_DEVMOD;
    } 

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

    有关如何在 USB0DeviceIntHandler 中检查中断的问题、您是否继续从项目中取消.lib 文件的链接并在 driverlib 和 usblib 文件夹中链接、以便项目能够实际编译并提供对诸如 usb.c 和 usbdenum.c 等文件的调试访问? 您是否已验证您能够断点到这些文件中的其他函数中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 BP101、

    也许这些信息将有助于:

    当在 OTG 模式下使用时、USB0VBUS 和 USB0ID 不需要任何配置、因为 它们是 USB 控制器的专用引脚、并且直接连接到 USB 连接器的 VBUS 和 ID 信号。 如果 USB 控制器用作专用主机或设备、 USB 通用控制和状态(USBGPCS)寄存  器的 DEVMOD 域可用于将 USB0VBUS 和/或 USB0ID 输入内部连接到固定电平、释放 PB0和 PB1管脚供 GPIO 使用。 为了使自供电设备正常运行、仍必须对 VBUS 值进行监控 、以确保主机移除 VBUS 时、自供电设备会禁用 D+/D-上拉 电阻器。

    另请注意、只有在 OTG 模式下才应调用 USBDevMode API。

    我同意对 hw_usb.h 脚注的评论有点不清楚、因为这些评论实际上没有太多的描述:

    #define USB_GPCS_DEVMODOTG 0x00000002 //启用设备模式
    #define USB_GPCS_DEVMOD 0x00000001 //设备模式 

    不过、我认为不需要您进行修改、因为这些设置适用于 OTG、如果您不使用 OTG 操作、那么正如 API 所说、您不应该使用它。

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

    [引用 USER="Ralph Jacobi"]有关如何在 USB0DeviceIntHandler 中检查中断的问题,您是否继续从项目中取消.lib 文件的链接,以及在 driverlib 和 usblib 文件夹中进行链接,以允许项目实际编译并提供对诸如 usb.c 和 usbdenum.c 等文件的调试访问?

    USB 库文件 导入到 CCS 工程文件夹中、并 将其用作编译依赖项、并设置了库/路径。  然而,中断向量被编码为访问 USB0DeviceIntHandler(),而这种情况从未发生。 如果 器  件断开事件(0x004 USBIS)或恢复状态检查发生 USB0_INT58、则会出现几条 UARTprintf 消息、但从不会出现。 大容量器件 的复合 驱动程序配置 在    首次由调用方 INT58处理之前、似乎不取代或控制硬件中断或清除状态。 奇怪   的是、如果我将 INT58视为来自5ms GPTM 间隔的信标 SW 触发器、则不会发生任何不同的情况。 似乎与 INT58保持一致的中断源不能用作典型的 NVIC 控制的中断源、或者从未如此。

    下面 是  EP1随机关闭的 USB 分析器点的结果。 回放 日志文件 4 (批量流1)表示我断开 电缆几次以重新启动 随机代码0x5事件的连接。

    /cfs-file/__key/communityserver-discussions-components-files/908/Generic-Bulk-Device_2400_190312_2400_004.zip

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

    这些日志文件应使用什么查看器? 我下载了 Device Monitoring Studio、但它不会打开日志文件、查看当前版本的 DMS 需要.dmslog7文件、但这些文件是.dmslog 文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    日志实际上没有显示任何内容、但主机没有响应最后一个200字节的请求、即0xC000.0005常见故障代码。 OUT (向上) 端管道 无法发送请求的数据包、因为它会突然 中止管道。  有时 、怀疑电气干扰 更严重、但在   AHB 活动较高的其他时间、OUT 端管道永远不会中止和频繁间歇中止。 如果我恰好重新连接 USB、则 OUT 端管道在中止之前会长时间(几分钟)保持连接。  如果 NVIC 与 PWM0挂起时不忙、则 OUT 端管道保持连接数小时、很少中止、但检测到中止时不会如此。

    真正的问题仍然是 INT58矢量如何 不调用 已注册的处理程序 并检查(usbdenum.c)中配置的 USBIS 状态标志? 大容量器件驱动程序(usbdenum.c)似乎源自 TM4C123 MCU、 稍后 进行了调整以与 TM4C1294配合使用。

    看起来(usbdenum.c)对这种奇怪的行为非常可疑、尤其是因为没有  调用已注册的 INT58矢量处理程序。  也许  INT58处理程序 已经被调用了两次、一次是以前调用过、一次是在 USB 库中的某个位置注册、 一次是在堆栈中更高的位置?  INT58矢量似乎 处理电缆连接、但不与  (startup_ccs.c)中的寄存矢量调用进行通信。  这意味 着 INT58硬接线到 USB0、或者向量处理程序调用被 USB 控制器自动解除挂起。    如果设计人员不知道信号量中断、就无法在 AHB 上运行它们!    如果 USB0需要信号量中断处理、则应在数据表中注明、无需 NDA。

    /cfs-file/__key/communityserver-discussions-components-files/908/usb_2D00_monitor5.2.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BTW:日志播放(底视图选择)需要选择 URB +其他基准标记选项。 左上方的下拉框选择连续或日志加载播放步骤需要很长时间。 但是、请订购 CTRL+TAB 以在视图窗格之间切换、没有工具栏图标。 第一次尝试5.2后无法运行 Studio、很难浏览屏幕。 很明显、我们换了5.2、并努力捕捉非常奇怪的导航技术。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 BP101、

    接下来、我将一个构建正确的项目放在一起、该项目将演示 USB 中断确实会进入 USB0DeviceIntHandler 并在那里建立 CAN 断点。 实际上、当您首次将其下载到 CCS 中时、它应该在 ISR 内设置一个断点。

    这适用于 EK-TM4C1294XL: e2e.ti.com/.../usb_5F00_dev_5F00_bulk_5F00_debugtest.zip

    继续操作、在 LaunchPad 上运行该程序、以查看中断是否会触发、 然后查看您自己的项目、看看您是否可以跟踪未包含正确文件的位置、以便调试 USB 库、从而查看项目中的中断触发情况。

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

    您好、Ralph、

    INT58问题的一部分是由 Eclipse 将 USB 库文件导入项目树引起的。 修改(usbdenum.c)控制端点正在编译为原始 SW 位置调试文件夹的 usblib.lib、而不是导入到工程树中的文件夹。 我希望 usbdenum.c 更改会与应用程序一起编译。  项目库文件/文件夹路径没有任何区别、 项目树中对 USB 库的应用项目引用被忽略。 将 USB 库重新导入为仅链接而不是从本地文件中工作后、usbdenum.c 会更改、然后使用应用程序进行编译。  

    调试消息最终正在打印、但插入电缆会产生多个 USB 复位、即使在 INT 状态被清除后也是如此。 它似乎是0xC0000005挂起是一些程序员过去处理过的已知问题。 目前、连接在32字节控制消息、64字节数据包时更加稳定、但有时仍会弹出"Suspend"(暂停)。 部分问题是 usbdenum.c 启用所有终端管道中断、但只有 EP0是批量流中的中断源。 这也降低了挂起频率、 并减小了 EP0的消息 包大小。 当 PW0似乎正在运行时、在电缆重新插入期间、可以明显看到更少的循环复位、这将使通过客户端方法重新建立管道连接变得更容易。