SLAZ295AC October 2012 – August 2021 MSP430F5504
USB Module
Functional
USB PLL may fail to initialize when DCO is not used
If the DCO is not used or does not source any clock in the system, the PLL may not initialize properly, leading to a "bus error" NMI when the CPU attempts to access USB memory. Under certain conditions, the PLL requires the DCO to be active in order to initialize properly. If any of the system clocks (MCLK, SMCLK, ACLK) are derived from the DCO during PLL initialization, this condition is satisfied and the PLL initializes in a stable manner.
- Configure one of the system clocks to use the DCO for normal operation. (In most applications, it's convenient to source MCLK from the DCO.)
or
- If it's necessary to use a clock configuration that doesn't include the DCO, then briefly activate it, then de-activate it. This should be done after setting the UPLLEN bit but before polling the USBPLLIR flags. The code below shows a simplified PLL initialization procedure. (In the MSP430 USB API Stacks, this is performed in USB_enable().)
USBPLLCTL |= UPLLEN; // Enable PLL
// Add the following code to enable the DCO, then immediately revert back
// to the original clock settings for the application. This is long
// enough to allow PLL initialization to proceed. The actual UCSCTL4
// settings depend on the application's clock requirements.
UCSCTL4 = SELA__REFOCLK + SELS__XT2CLK + SELM__DCOCLK; // Enable the DCO
UCSCTL4 = SELA__REFOCLK + SELS__XT2CLK + SELM__XT2CLK; // Revert back
//Wait for the PLL to settle
do {
USBPLLIR = 0x0000; // Clear the flags
for (i =0; i < 400; i++); // Wait for flags to set if not stable yet
}while (USBPLLIR != 0);
// PLL is now stable