diff --git a/atusb/fw2/atusb.c b/atusb/fw2/atusb.c index 9a5114e..019b8b0 100644 --- a/atusb/fw2/atusb.c +++ b/atusb/fw2/atusb.c @@ -7,7 +7,6 @@ #include "freakusb.h" -#include "at86rf230.h" #include "board.h" #include "spi.h" #include "atusb/ep0.h" @@ -30,21 +29,6 @@ int main(void) reset_rf(); - /* switch CLKM to 8 MHz */ - - /* - * @@@ Note: Atmel advise against changing the external clock in - * mid-flight. We should therefore switch to the RC clock first, then - * crank up the external clock, and finally switch back to the external - * clock. The clock switching procedure is described in the ATmega32U2 - * data sheet in secton 8.2.2. - */ - - spi_begin(); - spi_send(AT86RF230_REG_WRITE | REG_TRX_CTRL_0); - spi_send(CLKM_CTRL_8MHz); - spi_end(); - /* now we should be at 8 MHz */ SET(LED); diff --git a/atusb/fw2/board.c b/atusb/fw2/board.c index fc69df9..f2496a7 100644 --- a/atusb/fw2/board.c +++ b/atusb/fw2/board.c @@ -5,7 +5,28 @@ #define F_CPU 8000000UL #include +#include "at86rf230.h" #include "board.h" +#include "spi.h" + + +static void set_clkm(void) +{ + /* switch CLKM to 8 MHz */ + + /* + * @@@ Note: Atmel advise against changing the external clock in + * mid-flight. We should therefore switch to the RC clock first, then + * crank up the external clock, and finally switch back to the external + * clock. The clock switching procedure is described in the ATmega32U2 + * data sheet in secton 8.2.2. + */ + + spi_begin(); + spi_send(AT86RF230_REG_WRITE | REG_TRX_CTRL_0); + spi_send(CLKM_CTRL_8MHz); + spi_end(); +} void reset_rf(void) @@ -19,6 +40,10 @@ void reset_rf(void) /* 12.4.14: SPI access latency after reset: 625 ns (min) */ _delay_us(1); + + /* we must restore TRX_CTRL_0 after each reset (9.6.4) */ + + set_clkm(); }