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.

[参考译文] TM4C1294NCPDT:USB CDC 不工作

Guru**** 2044370 points
Other Parts Discussed in Thread: EK-TM4C1294XL, TM4C1294NCPDT
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/772427/tm4c1294ncpdt-usb-cdc-does-not-work

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

您好!

我在器件模式下的 USB 模块有 CDC 问题。

我在 launchpad 上运行了完全相同的代码、但在单独的微控制器上、代码无法正常工作。

我可以删除任何硬件问题、因为我能够进入引导加载程序模式(Tiva 固件升级)

请找到所附的用于初始化 USB 模块的代码。

ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
GPIOPINTypeUSBAnalog (GPIO_PORTL_BASE、 GPIO_PIN_6 | GPIO_PIN_7);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_USB0);

USBBufferInit (&g_sTxBuffer);
USBBufferInit (&g_sRxBuffer);
SysCtlVCOGet (SYSCTL_XTAL_25MHz、 ui32PLLRate);
USBDCDFeatureSet (0、USBLIB_Feature_CPUCLK、&ui32SysClock);
USBDCDFeatureSet (0、 USBLIB_FEATE_USBPLL、&ui32PLLRate);// ui32PLLRate = 240000000?
USBDCDCInit (0、&g_psCDCDevice); 


我为 TM4C1294XL 加载了"USB_DEV_cserial"示例、但器件未显示。

频率是否有问题?

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

    您好 Briceag、

    如果您使用的是 Windows 10、则 cserial 示例存在枚举问题。 我正在连接一个 CDC 器件版本、该版本应该枚举正确。 请尝试执行此操作、并将我的示例中的初始化代码与您的代码进行比较。

    e2e.ti.com/.../7026.usb_5F00_dev_5F00_cdcserial.zip

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

    感谢您的参与。

    很遗憾、我无法在 OSX 上编译您的示例、但我比较了初始化步骤、它们是相同的。
    我无法看到"SetPinout"函数的内容。

    引导加载程序与我发布的方法有何不同?
    这是引脚配置问题吗? 我的意思是、USB_ID 悬空且 USB_VBUS 已连接、但器件配置为自供电。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Briceag、

    引导加载程序直接来自 ROM 引导加载程序、不会设置为 CDC 器件。

    根据您的连接、我认为您需要以下 API:

    //
    //为设备模式初始化 USB 堆栈。
    //
    USBStackModeSet (0、eUSBModeDevice、0); 

    请尝试将其作为初始化的一部分、看看这是否有用。  在 USBDCDCInit 之前调用它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    调用该函数无效。
    是否还有其他东西可以强制 USB 进入设备模式?

    除了 USB_DP 和 USB_DM 之外,我还需要配置其他引脚吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Briceag、

    抱歉!! 我在我发布的 API 上犯了一个错误、它应该是 eUSBModeForceDevice、而不是 eUSBModeDevice!

    当然、我编辑了 CDC 示例以删除引脚分配集、并将其添加到中:

    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
    
    ROM_GPIOPinTypeUSBAnalog (GPIO_PORTL_base、GPIO_PIN_6 | GPIO_PIN_7);
    
    ROM_GPIOPINConfigure (GPIO_PA0_URX);
    ROM_GPIOPinConfigure (GPIO_PA1_U0TX);
    ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); 

     在 USBDCDCInit 之前:

    USBStackModeSet (0、eUSBModeForceDevice、0); 

    通过这些更改、可以成功枚举 PinoutSet 并将其注释掉。

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

    您好、Briceag、

    也许(&ui32PLLRate)应该设置为与_VCO_480匹配、而不是像您一样240mHz //?

    例如、480000000/8=60MHz 或 PLL 分频8

    删除 USBDCDCInit (0、&g_psCDCDevice);Ralf 建议对器件模式进行正确调用。

    强制寄存器中 VBUS 引脚的另一种方法可能有助于解决可能的 ID 引脚问题。

    /* USB_GPCS_DEVMOD_DEV:
    *强制 USB0VBUS 和 USB0ID 为高电平*/
    HWREG (USB0_BASE + USB_O_GPC)|= USB_GPCS_DEVMOD_DEV;//USB_GPCS_DEVMOD_DEVVBUS 

    您的成功之道就在您的旁边!

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

    您好、Ralph、

    的确,有些事情发生了变化。
    在 Windows 上、设备管理器中的消息是"设备描述符请求失败"
    在 Linux 上、消息为"设备不接受地址16、错误-71"、"无法枚举 USB 设备"

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

    也许(&ui32PLLRate)应该设置为与_VCO_480匹配、而不是像您一样240mHz //?
    这对我来说也很奇怪。 这就是我发表该评论的原因、我已经看到了调试器中的值。 如何正确设置?

    删除 USBDCDCInit (0、&g_psCDCDevice);Ralf 建议对器件模式进行正确调用。
    -这话什么意思?

    将 VBUS 和 ID 强制为高电平无效。

    考虑到枚举问题、最可能的问题是频率不足。
    请提供有关设置适当的_VCO_480的更多详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Briceag、

    现在肯定会更加接近。 您使用的是自定义描述符还是 USB_structs.c 中的描述符?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Briceag & BP101、

    PLL 速率和 USBDCDCInit 命令正确。 在工作中的 LaunchPad 示例中、进行了以下调用:

    G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000); 

    //
    //将设备信息传递到 USB 库并放置设备
    //在总线上。
    //
    USBDCDCInit (0、&g_sCDCDevice); 

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

    是的、我使用的是自定义结构(与 launchpad 上使用的结构相同)。
    为什么我得到 ui32PLLRate 等于240000000? 应该是480000000?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Briceag、

    尽管我们在设置 PLL 时使用480MHz 的 VCO、但实际上我们将其设置为240MHz。 这是因为驱动器始终将 PSYSDIV 设置为"1"、这意味着 VCO 始终除以2。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、然后我将尝试使用您提供的描述符结构、看看会发生什么情况。

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

    我尝试了您提供的结构、它以相同的枚举错误结束。 事实上,我和你的人的区别是关于灯串的描述。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Briceag、

    总结一下:

    1) 1)我提供的示例适用于 Linux 和 Windows 机器上的 EK-TM4C1294XL LaunchPad
    2) 2)您正在使用的定制硬件基于 TM4C1294NCPDT、但没有 USB_ID 连接
    3) 3) Linux 和 Windows 机器目前都在使用基于 CDC_DEVICE 示例的定制软件、但这两种软件都无法成功枚举

    我是否对所有这些问题都正确?

    如果是、您是否可以尝试将修改后的 CDC_serial 示例上传到您的定制板? 如果可能、我可以提供、您可以尝试使用它来查看我们是否错过了您的定制软件的其他步骤。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ralph、

    是的、这些要点是正确的、并且很好理解。
    我将在我的定制板上加载您的示例、并尽快告知您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Briceag、

    由于与 USB ID 引脚的连接、您将需要使用我刚刚测试过的版本、该版本强制采用器件模式、并且仅初始化 DP/DM USB 引脚。 我随函附上:

    e2e.ti.com/.../usb_5F00_dev_5F00_cdcserial_5F00_custom.zip

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

    您好 Ralph、

    我找到了一些可以帮助您弄清我为什么会遇到这种行为的东西。

    一旦器件被插入、一个中断被生成并且事件被"暂停"。 请查找随附的图片。

    我无法运行您的软件(环境需要一些外部资源、如 utils..)。

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

    不幸的是、这并不能给我带来太多的影响。 更有价值的是查看通信的 USB 分析器数据、尤其是查看描述符的任何内容是否设置正确。

    您能否发布您正在使用的描述符、以便我对其进行比较?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    我用你的结构替换了我的所有结构。 不幸的是、行为也是如此。

    据我所知、如果未检测到连续的帧起始数、器件将暂停。 为什么会发生这种情况?  

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

    我以前没有真正看到过这种情况、因此如果没有获得 US Analyzer 数据、我就无法在这方面弄清楚任何东西。 初始化应该可以正常工作、并且在我的末尾、描述符一直在工作、因此我怀疑代码上的某个内容没有正确传递、或者在硬件级别上发生了某个内容。 分析仪应该能够指示这两种情况。

    另一个想法是 Win 10不会将适用于 TM4C 的 USB 驱动程序应用于自定义电路板的 USB 连接。 如果使用相同的 PID 和 VID、我不认为应该是这种情况、但要进行交叉检查、请查看您是否可以手动将 Windows 指向使用 TivaWare USB 驱动程序。 请确保它们也是最新版本: software-dl.ti.com/.../SW-TM4C-2.1.4.178.PATCH-1.0.zip
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不知道为什么在 始终设置 PSYSDIV=1时、他们会看到 PSYSDIV=1 在 CCS 调试 480MHz PLL 中测试或查看多个 MUC。 请注意、蓝色编辑我的帖子、高于 值16 =(&ui32PLLRate=480MHz)、但根据您设置的 PLL 速率、其他几个值可能起作用。

    发布的一些 USB 批量器件模式调用 Ralf 看起来与 我输入的调用不同。  假设您没有尝试将键盘或鼠标连接到目标 MCU?  您似乎 正在尝试将目标 MCU 连接到主机(Linux/Win)、而不是 CDC/HID 器件。

    USBStackModeSet (0、eUSBModeDevice、0);
    
    USBDBulkInit (0、&g_sBulkDevice); 

    所有其他情况下、添加 以下行以在 POR 之后报告显示 VCO/PLL 速率的消息。

    静态 uint32_t ui32VCOSpeed;
    
    SysCtlVCOGet (SYSCTL_XTAL_25MHz、&ui32VCOSpeed);
    UARTprintf (">VCO-Speed->:%i\r\n"、ui32VCOSpeed); 

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

    您好 Ralph、

    总线似乎有问题、会发生位填充错误。 我所拥有的只是使用逻辑分析仪捕获的一条迹线。 请访问 attached.e2e.ti.com/.../USB_5F00_enumeration_5F00_issue.csv.zip

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

    VCO 为375000000。 我已经使用 SysCtlVCOGet 记录了该内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 BP101、

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

    我找到了问题。 实际上、强制 USB 堆栈进入器件模式是非常完美的。

    最初,我将系统时钟配置为:

    (a) MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);

    然后,我将配置修改为:

    (b) MAP_SysCtlClockFreqSet ((SYSCTL_OSC_INT |
    SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);

    然后、您建议强制 USB 堆栈处于器件模式、但在此期间、我有错误的时钟配置。
    因此、采用配置(A)并强制 USB 堆栈处于器件模式会产生很好的结果。

    非常感谢您的帮助,我将始终期待您的帮助!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这就是我试图 指出的、CDC 不是 批量器件初始化的正确调用、 因此 是 发布 正确调用的时间。

    显示375Mhz 的 VCO  速度非常奇数。 值16是 PLL 分频值(480/16=30MHz) USB 时钟速率。   对于高达60MHz 的高速 USB、该值可以是(8)。  根据 PLL 速率和 Tivaware driverlib 的版本、您所加载的内容可能会有所不同。 根据  调试寄存器视图中的 PSYSDIV 为1或2、您可能处于计时或甚至超频 SYSCLK 和外设时钟。