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:
- Host USB de alta velocidad, dispositivo o OTG PHY con Hoja de datos de la interfaz de pin bajo ULPI
- Placa USB USB3300 HS
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).