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.
工具/软件:Code Composer Studio
您好!
我正在尝试使 我们构建的电路板在 ULPI 主机模式下工作、ULPI 芯片是 USB3320、我已将其配置为内部时钟源。
目标是集线器.....
我可以在读取和写入寄存器时不会出现错误, 但 总线没有发生任何错误。
USB0 DEV_CTL 寄存器表示它处于器件模式、无法使其进入主机模式。
我让该板以 USB 全速运行、具有内部 USB 连接和集线器、没有任何问题。
该板被设计成 允许 使用内部或外部 USB、但 只允许使用其中一个 USB。
我对这一问题的答复似乎已经明白了
Tivaware 2.1.4.178
无效
USBULPIPinoutSet (空)
{
//
//启用 ULPI 接口使用的所有外设。
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
//
// ULPI 端口 B 引脚。
//
ROM_GPIOPinConfigure (GPIO_PB2_USB0STP);
ROM_GPIOPinConfigure (GPIO_PB3_USB0CLK);
ROM_GPIOPinTypeUSBDigital (GPIO_PORTB_BASE、GPIO_PIN_2 | GPIO_PIN_3);
GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_2 | GPIO_PIN_3、
GPIO_Strength _12mA、GPIO_PIN_TYPE_STD);
//
// ULPI 端口 P 引脚。
//
ROM_GPIOPinConfigure (GPIO_PP2_USB0NXT);
ROM_GPIOPinConfigure (GPIO_PP3_USB0DIR);
ROM_GPIOPinConfigure (GPIO_PP4_USB0D7);
ROM_GPIOPinConfigure (GPIO_PP5_USB0D6);
ROM_GPIOPinTypeUSBDigital (GPIO_PORTP_BASE、GPIO_PIN_2 | GPIO_PIN_3 |
GPIO_PIN_4 | GPIO_PIN_5);
GPIOPadConfigSet (GPIO_PORTP_BASE、
GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5、
GPIO_Strength _12mA、GPIO_PIN_TYPE_STD);
//
// ULPI 端口 L 引脚。
//
ROM_GPIOPinConfigure (GPIO_PL5_USB0D5);
ROM_GPIOPinConfigure (GPIO_PL4_USB0D4);
ROM_GPIOPinConfigure (GPIO_PL3_USB0D3);
ROM_GPIOPinConfigure (GPIO_PL2_USB0D2);
ROM_GPIOPinConfigure (GPIO_PL1_USB0D1);
ROM_GPIOPinConfigure (GPIO_PL0_USB0D0);
ROM_GPIOPinTypeUSBDigital (GPIO_PORTL_BASE、GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_2 | GPIO_PIN_3 |
GPIO_PIN_4 | GPIO_PIN_5);
GPIOPadConfigSet (GPIO_PORTL_BASE、
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
GPIO_PIN_4 | GPIO_PIN_5、
GPIO_Strength _12mA、GPIO_PIN_TYPE_STD);
//
//用于控制外部 USB 复位的端口 B 引脚。
//
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_4);
ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、GPIO_PIN_4);
}
void Init_USBhost(){
uint32_t i32Idx;
uint32_t ui32设置;
内部 ui32PLLRate;
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_USB0);
USBULPIPinoutSet();
//
//启用对 USB 控制器的计时。
//
//
//将 CPU 时钟和 PLL 频率告知 USB 库。
//
//
// ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
// ROM_GPIOPinTypeUSBAnalog (GPIO_PORTL_BASE、GPIO_PIN_6 | GPIO_PIN_7);
// uint32_t ui32PLLRate、i32Idx;
// SysCtlVCOGet (SYSCTL_XTAL_25MHz、\ui32PLLRate);
//
//初始化集线器端口状态。
//
for (i32Idx = 0;i32Idx < NUM_HUD_STATUS;i32Idx++)
{
G_psHubStatus[i32Idx].bConnected = false;
}
//
//启用中断
//
ROM_IntMasterEnable();
//
//将 CPU 时钟和 PLL 频率告知 USB 库。
//
// USBDCDFeatureSet (0、USBLIB_Feature_CPUCLK、&g_ui32SysClock);
// USBDCDFeatureSet (0、USBLIB_Feature_USBPLL、&ui32PLLRate);
//
//初始化 USB 堆栈模式并传入模式回调。
//
USBStackModeSet (0、eUSBModeForceHost、0);
//
//注册主机类驱动程序。
//
USBHCDRegisterDrivers (0、g_ppHostClassDrivers、g_ui32NumHostClassDrivers);
//
//初始化电源配置。 这将设置电源使能信号
//为高电平有效且不使能电源故障。
//
// USBHCDPowerConfigInit (0、USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER);
//
//将 CPU 时钟和 PLL 频率告知 USB 库。
//
ui32Setting = USBLIB_FEATE_ULPI_HS;
USBOTGFeatureSet (0、USBLIB_Feature_USBULPI、ui32Setting);
ui32Setting = USBLIB_FEATE_POWER_SELF;
USBOTGFeatureSet (0、USBLIB_FEATURE_POWER、ui32Seting);
USBOTGFeatureSet (0、USBLIB_Feature_CPUCLK、&g_ui32SysClock);
ui32PLLRate = 60000000 *4;
USBOTGFeatureSet (0、USBLIB_Feature_USBPLL、&ui32PLLRate);
//
//初始化主机模式的 USB 控制器。
//
/* ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、0);
gptimer3=3;
while (gptimer3);
ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、GPIO_PIN_4);
gptimer3=3;
while (gptimer3);
*
// USBULPIRegWrite (USB0_BASE、4、0x40);
// buf[4]= USBULPIRegRead (USB0_BASE、4);
// USBHighSpeed (USB0_BASE、TRUE);
// ULPIPower收 发器(USB0_BASE、f);
KeyboardOpen();
//打开 Thumb 驱动器
MSCOpen (g_ui32SysClock);
//
//打开集线器实例并为其提供所需的内存
//每个连接的设备的配置描述符。
//
USBHHubOpen (HubCallback);
USBHCDInit (0、g_pui8HCPool、sizeof (g_pui8HCPool));
CaptureULPI ();{将 ULPI 寄存器读取到数组中,我可以检查以查看设置/更改的内容}
}
现在非常确信 ULPI 主机模式是不可能的,只要我设置“开始会话”,寄存器就会更改为设备模式设置.....
请注意注释掉的代码,我尝试了很多东西......
你好、George
[引用用户="George Jaray32"]/
//初始化电源配置。 这将设置电源使能信号
//为高电平有效且不使能电源故障。
//
// USBHCDPowerConfigInit (0、USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER);
//
//将 CPU 时钟和 PLL 频率告知 USB 库。
//
ui32Setting = USBLIB_FEATE_ULPI_HS;
USBOTGFeatureSet (0、USBLIB_Feature_USBULPI、ui32Setting);
ui32Setting = USBLIB_FEATE_POWER_SELF;
USBOTGFeatureSet (0、USBLIB_FEATURE_POWER、ui32Seting);
USBOTGFeatureSet (0、USBLIB_Feature_CPUCLK、&g_ui32SysClock);
ui32PLLRate = 60000000 *4;
USBOTGFeatureSet (0、USBLIB_FEATURE_USBPLL、&ui32PLLRate);
WHA 当主机函数应为 USBHCDFeatureSet 时、您将调用 USBOTGFeatureSet。 对于每个 USBDCD 命令、也有一个 USBHCD 命令。
主要是因为我以这种方式开始的示例,是 aa OTG 主机控制器,我只需要强制主机。
但实际上,“功能集”只是设置“初始化”所使用的内部参数值,它实际上并不会更改执行的内容。
只有"USBHCDInit"使用按功能集预设的参数设置主机特定设置。
_________________________________________________________
ui32Setting = USBLIB_FEATE_ULPI_HS;
USBOTGFeatureSet (0、USBLIB_Feature_USBULPI、ui32Setting);
只需将 int 设置为16 (即 ULPI 模式 ),init 就会将器件设置为 ULPI,然后将 ULPI 寄存器设置为 HS。 在所有3种情况下、这实际上映射到相同的。
该参数仅控制用于 设置 ULPI 寄存器 HS、FS 或 LS 的分支。
________________________________________________________________
ui32Seting = USBLIB_FEATE_POWER_SELF;
USBOTGFeatureSet (0、USBLIB_FEATURE_POWER、ui32Seting);
这在主机模式下是毫无意义的、并会被过早命中和未尝试所遗漏。 在我的代码跟踪中,init 不使用它设置的参数。
_________________________________________________________
USBOTGFeatureSet (0、USBLIB_Feature_CPUCLK、&g_ui32SysClock);
只需告诉 USB 库 CPU 时钟速率。 始终意味着相同。
_________________________________________________________
ui32PLLRate = 60000000 *4;
USBOTGFeatureSet (0、USBLIB_Feature_USBPLL、&ui32PLLRate);
只需告诉 USB 库设置所需的频率。
由于 ULPI 模式被设定、这使得时钟引脚上的时钟为60MHz、并且内部时钟源、如果它为"0"、则 USB 时钟为外部时钟{来自 ULPI}。
TI 代码只有一个规则检查、该数字必须可被60MHz 分割。
所有其它 USB 使用方法都将此设置为0,外部 ULPI 时钟源必须为60MHz。
_________________________________________________________
以上都是我通过单步调试器验证的,{I 将所需的源代码复制到我的项目中,以浏览 源代码。}
是的,它可能应该 被设置为 USBHCDFeatureSet,但是网络结果不会改变,因为图元集的非特定于主机,它们设置初始化校准使用的值,对所有模式都是相同的。
当我调用 USBHCDInit (0、g_pui8HCPool、sizeof (g_pui8HCPool)时、发生故障{不良行为};
无论代码如何初始化 ULPI 寄存器, 此调用都会将 ULPI 寄存器设置为相同但 不同的值, {特别是 FS 模式和器件模式}
供参考:之前的所有设置都已正确设置到 ULPI 寄存器和内部 USB 寄存器中。
但是。 当 设置 DEV_CTRL 寄存器中"开始会话"位的单次调用被置位时、
ULPI 寄存器更改为器件模式设置 并且 "开始会话" 位被清零。 DEV_CTRL 寄存器还指示器件模式而非主机。
TIvaware 代码中的此调用位于 init 的末尾、因为这是通常启动主机模式的调用。
在正常内部 USB 模式下浏览采样率代码时,该调用实际上会将 USB 控制器更改为主机模式,并且 DEV_CTRL 寄存器和会话开始位在主机模式下保持正确设置。
我可以更改所有这些呼叫,但它们并不意味着特定于主机、设备或 OTG 设置的任何内容。
P.S.
一段时间以来、我一直在硬件寄存器级别对此进行跟踪。
在 tm4c129x 中,没有真正特定的强制主机,即硬件寄存器,该寄存器可以设置为忽略 ID 和 VBUS 状态,并始终假定主机的设置。 ID 接地、VBUS 有效良好。
但这意味着内部设置、从外部 ULPI 提供此信息。 特别是 ID PIN、但似乎两者都被忽略。
ID 引脚的状态决定了 OTG 主机或器件。 它在 ULPI 中硬接地、
但它的状态仅在 RX cmd 中从 ULPI 报告、而 ULPI 不在寄存器中、内部 USB 也不会有意义地将其分离出来。
我找到的唯一 ULPI 用法示例,{而且很少有}是具有外部时钟源的器件。