USB3300 con TM4C129 MCU

1

Estoy usando una placa USB3300 con mi MCU Texas Instruments (TM4C129), pero hay cosas que no entiendo, primero, cuando le doy al USB3300 3.3 V de una fuente de voltaje, el pin CLKOUT genera un CLK de 60MHZ. señal, pero la hoja de datos dice:

  

La entrada de reinicio se puede afirmar cuando la señal clkout del USB3300 no está activa (es decir, en el estado de suspensión causado por la afirmación del bit SuspendM), pero el reinicio solo debe anularse cuando la señal del clkout del USB3300 está activa y el reinicio ha sido mantenido afirmado por una duración mayor que un ciclo de reloj clkout.

¿Cómo puedo afirmar la entrada de restablecimiento cuando no hay clkout? Le pregunto esto porque, simplemente al proporcionarle al USB3300 el voltaje (3.3 V), se genera una señal CLK de 60 MHz desde el pin CLKOUT.

Estoy usando una placa USB USB USB HS de waveshare:

Referencias:

Esta es la configuración del código:

    volatile uint32_t setting;   // must be volatile for reset delay loop.

SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);

USBBufferInit(&g_sTxBuffer);
USBBufferInit(&g_sRxBuffer);
USBStackModeSet(0, eUSBModeForceDevice, 0);
ulpi = 1;

if(ulpi)
{
        // Enable all the peripherals that are used by the ULPI interface.
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);

        GPIOPinTypeGPIOOutput(GPIO_PORTK_BASE, GPIO_PIN_0);
        GPIOPadConfigSet(GPIO_PORTLK_BASE, GPIO_PIN_0,
                         GPIO_STRENGTH_12MA, GPIO_PIN_TYPE_STD);
        GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0, 0);  // assert a reset on the ULPI chip.


        /*  At this point, the ULPI is in reset.  A 10ms delay should be sufficient to allow this to complete. */
        /*  The GPIO configurations happening later might take long enough, but to be safe, I'm implementing a delay. */
        for(setting = 0; setting < 1200; setting++);  // hopefully this makes a long enough pause to reset the ULPI

        // ULPI Port B pins.
        GPIOPinConfigure(GPIO_PB2_USB0STP);
        GPIOPinConfigure(GPIO_PB3_USB0CLK);
        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 Port P pins.
        GPIOPinConfigure(GPIO_PP2_USB0NXT);
        GPIOPinConfigure(GPIO_PP3_USB0DIR);
        GPIOPinConfigure(GPIO_PP4_USB0D7);
        GPIOPinConfigure(GPIO_PP5_USB0D6);
        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 Port L pins.
        GPIOPinConfigure(GPIO_PL5_USB0D5);
        GPIOPinConfigure(GPIO_PL4_USB0D4);
        GPIOPinConfigure(GPIO_PL3_USB0D3);
        GPIOPinConfigure(GPIO_PL2_USB0D2);
        GPIOPinConfigure(GPIO_PL1_USB0D1);
        GPIOPinConfigure(GPIO_PL0_USB0D0);
        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);

        //
        // ULPI Port M pins used to control the external USB oscillator and the
        // external USB phy on the DK-TM4C129X-DPHY board.
        //
        // PM1 - Enables the USB oscillator on the DK-TM4C129X-DPHY board.
        // PM3 - Enables the USB phy on the DK-TM4C129X-DPHY board.
        //
        /**/
        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTM_BASE, GPIO_PIN_1 | GPIO_PIN_3);
        ROM_GPIOPinWrite(GPIO_PORTM_BASE, GPIO_PIN_1 | GPIO_PIN_3, GPIO_PIN_1 |
                                         GPIO_PIN_3);


        // PK0 - enable the USB phy.  Could be any pin really.
        // GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0, GPIO_PIN_0);

        //setting = USBLIB_FEATURE_ULPI_HS;

        // This function is a good read...   You should check it out for more options!
        //USBDCDFeatureSet(0, USBLIB_FEATURE_USBULPI, &setting);378823290

        ui32ULPI = USBLIB_FEATURE_ULPI_HS;
        ui32SysClock = 0;


        USBULPIEnable(USB0_BASE);                                         // Enable ULPI
        USBULPIConfig(USB0_BASE, USB_ULPI_EXTVBUS | USB_ULPI_EXTVBUS_IND);// Configure the ULPI
        USBHighSpeed(USB0_BASE, true);                                    // Enable High Speed

        USBDCDFeatureSet(0, USBLIB_FEATURE_USBULPI, &ui32ULPI);
        ULPIPowerTransceiver(USB0_BASE, true);  // necessary if OTG or host.
}
else
{
    SysCtlVCOGet(SYSCTL_XTAL_25MHZ, &ui32PLLRate);

    // maybe I should still set these pins when the ULPI is not in use??
    // GPIOPinTypeUSBAnalog(USB_PORT, USB_PINS);
}
USBDCDFeatureSet(0, USBLIB_FEATURE_CPUCLK, &ui32SysClock);
USBDCDFeatureSet(0, USBLIB_FEATURE_USBPLL, &ui32PLLRate);
USBDBulkInit(0, &g_sBulkDevice);

No tengo problemas con la configuración del pin, los problemas comienzan en los comandos: ULPIPowerTransceiver (USB0_BASE, true); y USBDBulkInit (0, & g_sBulkDevice);

Ambos leen y escriben en registros USB3300, pero el código se atasca debido a un bucle while que espera a que se complete el acceso (al USB3300).

    

1 respuesta

0

El pin de reinicio en el transceptor ULPI es opcional, normalmente no debería usarlo. De la hoja de datos:

  

Reinicio de transceptor alto activo opcional. Esto es lo mismo que escribir a   el reinicio ULPI, dirección 04h, bit   5. Esto no restablece el conjunto de registros ULPI. Este pin incluye una resistencia de arrastre integrada al suelo. Si no se usa, este pin puede ser   flotado o conectado a tierra (recomendado)

En cuanto a su inquietud, tenga en cuenta el lenguaje " puede ser confirmado", pero " solo debe ser eliminado". Esto significa que puede hacer valer el reinicio CUALQUIER MOMENTO, pero debe anularlo solo cuando el reloj esté en estado ALTO. Esto significa que el funcionamiento correcto de RESET está garantizado solo bajo ciertas condiciones, debe estar sincronizado con CLOCK_OUT.

En resumen, no use esta señal, manténgala BAJA.

    
respondido por el Ale..chenski

Lea otras preguntas en las etiquetas