Datasheet
28
7799D–AVR–11/10
ATmega8U2/16U2/32U2
Figure 8-3. Example of clock switching with wake-up from Device
8.2.2 Clock switch Algorythm
8.2.2.1 Swith from external clock to RC clock
if (Usb_suspend_detected()) // if (UDINT.SUSPI == 1)
{
Usb_ack_suspend(); // UDINT.SUSPI = 0;
Usb_freeze_clock(); // USBCON.FRZCLK = 1;
Disable_pll(); // PLLCSR.PLLE = 0;
Enable_RC_clock(); // CLKSEL0.RCE = 1;
while (!RC_clock_ready()); // while (CLKSTA.RCON != 1);
Select_RC_clock(); // CLKSEL0.CLKS = 0;
Disable_external_clock(); // CLKSEL0.EXTE = 0;
}
8.2.2.2 Switch from RC clock to external clock
if (Usb_wake_up_detected()) // if (UDINT.WAKEUPI == 1)
{
Usb_ack_wake_up(); // UDINT.WAKEUPI = 0;
Enable_external_clock(); // CKSEL0.EXTE = 1;
while (!External_clock_ready()); // while (CLKSTA.EXTON != 1);
Select_external_clock(); // CLKSEL0.CLKS = 1;
Enable_pll(); // PLLCSR.PLLE = 1;
Disable_RC_clock(); // CLKSEL0.RCE = 0;
while (!Pll_ready()); // while (PLLCSR.PLOCK != 1);
Usb_unfreeze_clock(); // USBCON.FRZCLK = 0;
}
USB
CPU Clock
External
Oscillator
RC oscillator
Ext RC Ext
non-Idle Idle
(Suspend)
non-Idle
3ms
upstream-resume
2
2
Upstream Resume from device
Watchdog wake-up
from power-down