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/TM4C129ENCPDT:具有内部时钟的主机 ULPI。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/595629/ccs-tm4c129encpdt-host-ulpi-with-internal-clock

器件型号:TM4C129ENCPDT

工具/软件:Code Composer Studio

您好!

 我正在尝试使 我们构建的电路板在 ULPI 主机模式下工作、ULPI 芯片是 USB3320、我已将其配置为内部时钟源。

目标是集线器.....

我可以在读取和写入寄存器时不会出现错误, 但 总线没有发生任何错误。

USB0 DEV_CTL 寄存器表示它处于器件模式、无法使其进入主机模式。

我让该板以 USB 全速运行、具有内部 USB 连接和集线器、没有任何问题。

该板被设计成 允许 使用内部或外部 USB、但  只允许使用其中一个 USB。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的乔治:
    您是否有机会尝试一下 在 ULPI 模式下\examples\boards\dk-tm4c129x\USB_host_msc?

    另请参阅有关 ULPI 接口注意事项的系统设计指南应用手册的第4.4节。 www.ti.com/.../spma056.pdf

    您可能还会发现以下帖子对您有所帮助。

    e2e.ti.com/.../561997
    e2e.ti.com/.../1108765
    e2e.ti.com/.../415145
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所有示例都是设备模式和外部时钟。
    我找不到 ULPI 主机模式的示例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也许我需要澄清一下、

    我能够找到的所有示例和帖子都是 USB 2.0器件、通常带有外部时钟。

    我在文档中发现一个差异,480 MHz PLL 输出时钟的时钟分频器应该是8,
    但是、我从 USB 时钟引脚中获取30MHz 时钟、但没有任何作用、如果我将分频器设置为4、我将获得60MHz 输出、并且我可以与 ULPI 进行通信。

    我的 PLL 设置直接在文档中提供、我知道内部时钟确实是120MHz、因为我将其用于计时器和 SysTick、而是120MHz。

    我无法使 USB 控制器进入强制 USB 主机模式。
    我可以读取和写入 ULPI 寄存器、而不会出现明显的问题。 但内部 DEV_CTL 寄存器始终指示它是一个器件。
    USB 寄存器文档中没有关于应该位于什么位置的详细信息。
    所有文档都是寄存器名称,我只能通过调试器和寄存器视图来告诉小麦位。

    此外,我还将此固件作为具有内部全速控制器的 USB 主机运行良好。
    我想使用相同的代码切换到外部 ULPI 高速。 以进行操作。

    作为 fyi、usb3320上的 ID 引脚硬接地、因此应强制其进入主机模式。

    我知道在 ULPI 上、发回的 RX_CMD 在位6上具有该引脚、但我看不到在寄存器中获得该引脚状态的任何方法。
    而且,驱动程序将 USB_GPCS_DEVMOD 设置为2,但我不知道这是对还是错,因为任何文档中都没有关于此主题的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、George、

    您能否共享在应用中为实现 USB 主机模式功能而完成的 USB 控制器配置? 还请指定正在使用的 TivaWare 版本?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include
    #include
    #include "tbooltype.h"
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"

    #include "driverlib/sysctl.h"
    #include "driverlib/rom.h"
    #include "driverlib/rom_map.h"
    #include "driverlib/usb.h"


    #include "third_party/fatfs/src/ff.h"

    #include "usblib/usblib.h"
    #include "usblib/usbhid.h"
    #include "usblib/host/usbhost.h"
    #include "usblib/host/usbhhid.h"
    #include "usblib/host/usbhhub.h"


    #include "usblib/host/usbhidkeyboard.h"

    //#include "utils/ustdlib.h"

    #include "usb_host_hub.h"


    //主机控制器内存池的大小(以字节为单位)。
    //
    //
    #define HCD_MEMORY_SIZE 128

    //
    //
    //提供给主机控制器驱动程序的内存池。
    //
    //
    uint8_t g_pui8HCDPool[hcd_memory_size * MAX_USB_DEVICes];

    //
    //
    //声明 USB 事件驱动程序接口。
    //
    //
    Declate_event_driver (g_sUSBEventDriver、0、0、USBHCEEvents);

    //
    //
    //保存应用程序中使用的所有主机驱动程序的全局变量。
    //在这种情况下,仅加载键盘类。
    //
    //
    静态 tUSBHostClassDriver const * const g_ppHostClassDrivers []=

    &g_sUSBHostMSCClassDriver、
    &g_sUSBHIDClassDriver、
    &g_sUSBHubClassDriver、
    &g_sUSBEventDriver
    };

    //
    //
    //此全局变量保存 g_pHostClassDrivers 中的类驱动程序数
    //列表。
    //
    //
    静态常量 uint32_t g_ui32NumHostClassDrivers =
    sizeof (g_ppHostClassDrivers)/ sizeof (tUSBHostClassDriver *);

    //
    //
    //每秒的 SysTick 节拍数。
    //
    //
    #define tICKS_PER_second 100
    #define MS_PER_SysTick (1000/tICKS_PER_second)





    //
    //
    //集线器端口的状态栏框。
    //
    //
    #define NUM_HUD_STATUS 4.
    结构

    //
    //如果有一个设备连接到此端口,则保持此状态。
    //
    bool bconneced;

    //
    //设备的实例数据(如果 bConnected 为 true)。
    //
    uint32_t ui32Instance;

    //设备类

    uint32_t 类;
    uint32_t 子类;


    G_psHubStatus[NUM_HUD_STATUS];


    /*********
    //
    //这是来自主机栈的通用回调。
    //
    // pvData 实际上是 tEventInfo 结构的指针。
    //
    //将调用此函数以在 USB 事件发生时通知应用程序
    //发生在与键盘设备相关的范围之外。 进行了比较
    //点此选项用于检测插入和删除的不受支持的设备。
    //它还用于在发生电源故障时通知应用程序。
    //在中包含 g_USBGenericEventDriver 时需要此函数
    //传入的主机控制器驱动程序数组
    // USBHCDRegisterDrivers()函数。
    //
    (小部分 /

    extern char HIDDEV_connected;

    无效
    USBHCEDents (void *pvData)

    tEventInfo *pEventInfo;
    uint8_t ui8端口;

    //
    //将此指针投射到其实际类型。
    //
    pEventInfo =(tEventInfo *) pvData;

    //
    //获取设备连接到的集线器端口号。
    //
    ui8Port = USBHCDDevHubPort (pEventInfo->ui32Instance);

    switch (pEventInfo->ui32Event)

    案例 USB_EVENT_UNKNOWN_Connected:
    案例 USB_EVENT_Connected:

    //
    //如果这是集线器,则忽略此连接。
    //
    if (USBHCDDevClass (pEventInfo->ui32Instance、0)=USB_class_hub)

    中断;


    //
    //如果这不是直接连接,则集线器打开
    //端口0,因此索引应从1-4移动到0-3。
    //
    if (ui8端口>0)

    ui8端口--;


    //
    //保存设备实例数据。
    //
    G_psHubStatus[ui8Port].ui32Instance = pEventInfo->ui32Instance;
    G_psHubStatus[ui8Port].bConnected = true;
    G_psHubStatus[ui8Port].Class = USBHCDDevClass (pEventInfo->ui32Instance、0);
    G_psHubStatus[ui8Port].subclass = USBHCDDevSubClass (pEventInfo->ui32Instance、0);
    // usbtmr=0;
    if (g_psHubStatus[ui8Port].Class=3)
    HIDDEV_connected = 1;

    //
    //更新新设备的端口状态。
    //

    中断;

    //
    //设备已拔下。
    //
    案例 USB_EVENT_DISCONNECTED:

    //
    //如果这不是直接连接,则集线器打开
    //端口0,因此索引应从1-4移动到0-3。
    //
    if (ui8端口>0)

    ui8端口--;


    //
    //设备不再连接。
    //
    G_psHubStatus[ui8Port].bConnected = false;
    if (g_psHubStatus[ui8Port].Class=3)
    HIDDEV_connected = 0;


    //
    //更新新设备的端口状态。
    //

    中断;

    默认值:

    中断;








    //
    //
    //这是来自 USB 集线器鼠标处理程序的回调。
    //
    // pvCBData 被该函数忽略。
    // ui32Event 是鼠标设备的有效事件之一。
    // ui32MsgParam 由发生的事件定义。
    // pvMsgData 是一个指向由发生的事件定义的数据的指针。
    //
    //将调用此函数,以在鼠标有时通知应用程序
    //已插入或移除,并且随时按下鼠标移动或按钮
    //被检测到。
    //
    //此函数将返回0。
    //
    //******** 特哈宾斯特·休斯特·休斯特·休斯特·休斯·休斯



    无效
    HubCallback (tHubInstance * psHubInstance,uint32_t ui32事件,
    uint32_t ui32MsgParam、void *pvMsgData)

    // usbtmr=0;




    extern uint32_t g_ui32SysClock;


    无效
    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);



    易失性静态 uint8_t buf[128];

    void CaptureULPI (){
    buf[0]= USBULPIRegRead (USB0_BASE、0);
    buf[1]= USBULPIRegRead (USB0_BASE、1);
    buf[2]= USBULPIRegRead (USB0_BASE、2);
    buf[3]= USBULPIRegRead (USB0_BASE、3);
    buf[4]= USBULPIRegRead (USB0_BASE、4);
    buf[7]= USBULPIRegRead (USB0_BASE、7);
    BUF[0xA]= USBULPIREAD (USB0_BASE、0xA);
    buf[0xD]= USBULPIRegRead (USB0_BASE、0xd);
    buf[0x10]= USBULPIRegRead (USB0_BASE、0x10);
    buf[0x13]= USBULPIRegRead (USB0_BASE、0x13);
    buf[0x14]= USBULPIRegRead (USB0_BASE、0x14);
    如果(buf[0]!=0x24)
    返回;






    extern volatile int gptimer3;
    extern uint32_t g_ui32SysClock;



    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();



    TIvAware 2.1.4.178



    非常确信 USB 控制器根本不执行 ULPI 主机模式。

    无论我如何设置接口,只要我“设置开始会话”位,如果 ULPI 更改为 FS 接收设置,而我无法设置的任何内容,则 ULPI 都可以转到主机设置。
    每当我启动会话时{也在寄存器视图中}、它都会恢复到设备。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    P.S.
    主系统中的时钟设置如下。

    //
    //将时钟设置为以120MHz 的频率从 PLL 运行。
    //并将 g_ui32SysClock 设置为其值,以便我们可以使用它来初始化许多其他时钟速率敏感的设备和函数。
    //
    G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我对这一问题的答复似乎已经明白了

    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 用法示例,{而且很少有}是具有外部时钟源的器件。