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.

[参考译文] CCS/TM4C123FH6PM:从未枚举 USB 主机 MSC 应用设备

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/878366/ccs-tm4c123fh6pm-usb-host-msc-application-device-never-gets-enumerated

器件型号:TM4C123FH6PM
主题中讨论的其他器件:EK-TM4C1294XLTPD4S012TM4C123EK-TM4C123GXLDK-TM4C123G

工具/软件:Code Composer Studio

大家好、

我在定制 PCB 上的 msc 应用程序上遇到问题。 我首先开发了一个应用程序、使用 fat 文件系统从闪存条读取数据、然后在 EK-tm4c1294xl 开发套件上运行。  

现在、我尝试将同一个应用移植到我正在使用的 tm4c123fh下午6时芯片。  

我的 PCB 上存在以下差异。  

处理器无需内部振荡器的晶振即可运行、PLL 为80MHz。  

有一个用于监控 VBUS 的配电开关。 该芯片具有一个低电平有效使能端、连接到芯片的 EPEN 信号。

该设计没有 TPD4S012、而是采用 USBLC6-2来实现 ESD 保护。  

该设计中提供 USB-A 和 Micro-USB 端口(它们连接到相同的 DP、DM、VBUS 和 GND 线)、但仅插入了1个器件、我只需要测试两者的功能、但最终设计中仅保留1个器件。

我所做的更改如下:

TM4C129配置:  

HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTD_BASE + GPIO_O_CR)= 0xff;
ROM_GPIOPinConfigure (GPIO_PD6_USB0EPEN);
ROM_GPIOPinTypeUSBAnalog (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
ROM_GPIOPinTypeUSBDigital (GPIO_PORTD_BASE、GPIO_PIN_6);
ROM_GPIOPinTypeUSBAnalog (GPIO_PORTL_BASE、GPIO_PIN_6 | GPIO_PIN_7);
ROM_GPIOPinTypeGPIOInput (GPIO_PORTQ_BASE、GPIO_PIN_4);

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

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

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

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

//
//将 CPU 时钟和 PLL 频率告知 USB 库。 这是一个
// TM4C129器件的新要求。
//
SysCtlVCOGet (SYSCTL_XTAL_25MHz、\ui32PLLRate);
USBHCDFeatureSet (0、USBLIB_Feature_CPUCLK、&g_ui32SysClock);
USBHCDFeatureSet (0、USBLIB_Feature_USBPLL、&ui32PLLRate);

//
//初始化 USB 控制器以进行主机操作。
//
USBHCDInit (0、g_pHCPool、HCD_MEMORY_SIZE);

//
//初始化文件系统。
//
f_mount (0、&g_sFatFs); 

TM4C123配置:

HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTD_BASE + GPIO_O_CR)= 0xff;
ROM_GPIOPinConfigure (GPIO_PD2_USB0EPEN);
ROM_GPIOPinTypeUSBAnalog (GPIO_PORTD_BASE、GPIO_PIN_4 | GPIO_PIN_5);
ROM_GPIOPinTypeUSBDigital (GPIO_PORTD_BASE、GPIO_PIN_2);
ROM_GPIOPinTypeUSBAnalog (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
//
//初始化 USB 堆栈模式并传入模式回调。
//
USBStackModeSet (0、eUSBModeHost、0);

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

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

//
//初始化电源配置。 这将设置电源使能信号
//为低电平有效且不使能电源故障。
//
USBHCDPowerConfigInit (0、USBHCD_VBUS_AUTO_LOW | USBHCD_VBUS_FILTER);

SysCtlUSBPLLEnable();

//
//初始化 USB 控制器以进行主机操作。
//
USBHCDInit (0、g_pHCPool、HCD_MEMORY_SIZE);

//
//初始化文件系统。
//
f_mount (0、&g_sFatFs); 

对移植代码进行了以下更改:

已在适用的情况下更改时钟配置。 (SysTick 等)

PLL 的 SysCtlUSBPLLEnable 调用不是功能集和 SysCtlVCOGet 调用。

由于系统时钟为80MHz 、因此省略了对 CPUCLK 的 USBHCDFeatureSet 调用、但我也尝试了代码、包括它并使用指针传递系统值、但它没有产生任何影响。

启动文件具有必要的中断处理程序函数。  

引脚已更改。  

ROM 定义已更改。

更改了 USBHCDPowerConfigInit 以将 EPEN 作为低电平有效。  

配置完成后、我验证 VBUS 为5V、EPEN 为低。 ID 也很低、器件连接到 Micro-USB 插槽。

MSC 示例使用的是 OTG 中断处理程序、这也是我为其配置的内容。  当器件被插入时、OTG 中断永远不会触发。

我进行必要的 SysTick 配置、中断处理程序也位于矢量表中并触发。

我还尝试 了 eUSBModeForceHost、但也不起作用。 它在 TM4C129开发板上工作。

我试图找出在移植代码时遗漏的内容、或者如果我犯了根本错误。

我查看了 DK TM4C123电路板上的 USB 主机 MSC 示例、该示例实际上在函数调用中使用 HCD 主机而不是 OTG、但如果触发中断以检测器件 OTG 主函数、则还会为检测到的器件调用 HCD 主函数。 除此之外、我没有注意到任何重大差异。  

编辑:我还尝试将 DP 和 DM 引脚跳转至 TM4C129器件、并使用正确的 EPEN 为 VBUS 从 TM4C123器件供电。 它的工作方式使我相信我的电路是好的、但配置上有一些问题导致了问题的发生。  

谢谢、

金枪鱼  

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

    你好,金枪鱼

    下面是开始调试的几个初始点:

    1) 1)是否已确保调用所有所需的中断使能、包括 IntMasterEnable?

    2) 2)您的器件是自供电还是总线供电? 如果总线供电、您需要设置 USBHCD_VBUS_AUTO_HIGH、即使是在设置时也是如此。

    如果您想在 EK-TM4C123GXL LaunchPad 上进行测试、我可以向您介绍所需的硬件调整、但我们没有相应的 USB_HOST_msc 移植示例。 您可能需要考虑将 DK 示例移植到 LaunchPad、以确保软件确实使用已知硬件正确设置。 这会将搜索范围限制为硬件。 我强烈推荐这种方法、如果您需要硬件修改列表、请告诉我。

    您可能还需要研究是否可能获得 USB 分析器、以便您可以查看正在交换的数据包(如果有)。 如果似乎没有硬件问题、我们可能需要达到这一级别的详细信息、以查看此处发生的情况。

    此外、在具有时钟速度等的常规系统设置中、您是否已经完成了一些基本操作、例如让 LED 闪烁、以验证时钟设置是否正常工作、以及器件是否以您期望的速度运行?

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

    您好 Ralph、

    正在进行 IntMasterEnable 调用。 我还确保 SysTick 中断正在触发、以确保问题不是系统禁用中断。  

    该器件由总线供电、但正如我提到过的、如果我从设计中提供电源并将数据线 DP 和 DM 跳转至 TM4C129、我可以获得功能读取、这也告诉我我的连接器和布线正在工作。

    我还使用逻辑分析仪进行了检查、当器件插入 DP 和 DM 时、线路上没有任何活动、因此芯片似乎没有检测到连接了器件。  

    我使用一半的时钟源切换计时器引脚、检查了时钟速度、并使用示波器进行了检查。

    我将尝试在下一步中从 OTG 更改为 HCD、方法是将函数调用从 OTGMain 更改为 HTCMain 并更改中断。  

    谢谢、

    金枪鱼  

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

    你好,金枪鱼

    [报价用户="Tuna BICM"]器件由总线供电、但正如我提到过的、如果我从我的设计中供电并将数据线 DP 和 DM 跳转至 TM4C129、我可以得到功能读取、这也告诉我我连接器和布线正在工作。[/QUERTION]

    您是否检查了器件当时是否接收到5V 电压? 由于 您使用 EPEN 进行设置、器件 VBUS 在您的设置下似乎也能达到5V、但我想如果您是作为主机从 MCU VBUS 引脚供电、那么您需要在这里进行不同的设置。 我对使用 EPEN 的设置不太熟悉、但这可能是我的误解。

    另请回复: 如果器件希望处于 OTG 状态、则 OTG 是一个很好的步骤、因为 OTG 器件指示存在的方式与标准 USB 器件不同、但 OTG 也意味着 TM4C 可能在某个时间点成为器件。

    进一步了解这里的选项、我会尝试改用 USB0HostIntHandler。 这将绕过我看到的一些 OTG 检查。 这可能是此处缺失的部分、说明它为什么看不到器件。

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

    您好 Ralph、

    我在 VBUS 上的意思是 EPEN 配置良好、这就是我的 PCB 板为闪存驱动器提供适当电源的原因。  

    仅仅更改对 HCDMain 的 OTGMain 调用和更改中断并不能解决问题。  

    我将返回 dk-tm4c123示例、开始剥离屏幕代码、并在从 USB 记忆棒读取后集成我的功能。  

    谢谢、

    金枪鱼  

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

    你好,金枪鱼

    您是否有 DK-TM4C123G 或需要在 EK-TM4C123GXL 上运行它?

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

    您好 Ralph、

    我没有 DK 电路板。

    我有2个 EK 板。  

    我开始将 DK 电路板移植到 TM4C123FH6PM、我还可以像使用 EK-TM4C129那样通过从 EK 电路板顶部的迹线跳转数据引脚来进行测试。

    如果这也不起作用、我将在此处发布我的移植代码、以尝试了解情况。  

    除了从 DK 1中删除屏幕和按钮元素以及将引脚更改为 EK 或 FH6PM 板上的引脚之外、我还需要做什么更改吗?

    谢谢、

    金枪鱼   

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

    您好 Ralph、

    我移植了代码、当我将数据引脚跳转到 PCB 上的测试点时、我能够使用 EK-TM4C123运行代码。 msc 的电源仍通过 PCB 供电。  

    但是、当我尝试从 TM4C123FH6PM 运行代码时、它根本不起作用。 我的 PCB 上有两个隔离的芯片。 其中一个具有晶振(25MHz)、另一个没有晶振。 两个都无法连接到 msc。 我这样做是为了测试没有晶体是否会影响任何东西、但这似乎不是问题。 接下来、我将尝试将 tm4c123fhpm 与 ghpm 交换、如 EK 板、以查看这是否有用。

    谢谢、

    金枪鱼  

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

    你好,金枪鱼

    老实说、我想了解一下我们提供的示例代码的 VBUS 设置、因为我在某些 LaunchPad 上修整了、而且我无法使其在 LaunchPad 上正确输出 VBUS。 我还在试图挖掘我的末端正在发生的事情

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

    您好 Ralph、

    我测试了从再次具有晶体的芯片跳过来、并且能够读取闪存驱动器。

    这让我相信:

    1) 1)如果没有晶振、USB 运行可能会受到影响。  

    2) 2)我刚刚有一个坏芯片、需要将其换出。

    我将在下周尝试更换它、如果我仍有问题、我将更改我的布局以连接晶体。  

    最棒的

    金枪鱼  

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

    为了测试我的理论、我从另一个芯片上移除了晶体、并尝试跳过 DP 和 DM 线路。

    它似乎不起作用。 这让我相信晶体对于 USB 操作是必要的。

    即使 PLL 被用于具有高于20MHz 的时钟、也不足以满足 USB 条件。

    最棒的

    金枪鱼  

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

    你好,金枪鱼

    我从尝试弄清 VBUS 问题(因为我尝试让 LaunchPad 在没有蓝线模块的情况下工作)开始、在您进行实验时查看晶体要求、我可以确认缺少晶体是问题所在。

    从器件数据表中:请注意、MOSC 为 USB PLL 提供时钟源并且必须被连接至一个晶振或者一个振荡器。

    因此、这就是内部 PLL 无法处理这一问题的原因-尽管当您在您的帖子中首次提到、我没有对它进行太多的思考、因为它运行得足够快。

     24.9.5节"主振荡器规格 "中的数据表中的表24-20列出了 MOSC 支持的外部晶振频率、并包含了哪些晶振也支持 USB。 请参考该信息以选择器件的晶体。

    很抱歉、我没有马上赶上。