Teacup_Firmware/spi-avr.c

37 lines
953 B
C

/** \file
\brief SPI routines, AVR specific part.
*/
#if defined TEACUP_C_INCLUDE && defined __AVR__
/** Initialise SPI subsystem.
Code copied from ATmega164/324/644/1284 data sheet, section 18.2, page 160,
or moved here from mendel.c.
*/
void spi_init() {
// Set SCK (clock) and MOSI line to output, ie. set USART in master mode.
SET_OUTPUT(SCK);
SET_OUTPUT(MOSI);
SET_INPUT(MISO);
// SS must be set as output to disconnect it from the SPI subsystem.
// Too bad if something else tries to use this pin as digital input.
// See ATmega164/324/644/1284 data sheet, section 18.3.2, page 162.
// Not written there: this must apparently be done before setting the SPRC
// register, else future R/W-operations may hang.
SET_OUTPUT(SS);
#ifdef SPI_2X
SPSR = 0x01;
#else
SPSR = 0x00;
#endif
// This sets the whole SPRC register.
spi_speed_100_400();
}
#endif /* defined TEACUP_C_INCLUDE && defined __AVR__ */