主题中讨论的其他器件:EK-TM4C1294XL、 TPD4S012、 TM4C123、 EK-TM4C123GXL、 DK-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器件供电。 它的工作方式使我相信我的电路是好的、但配置上有一些问题导致了问题的发生。
谢谢、
金枪鱼