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