Below is the file 'spi.c' from this revision. You can also download the file.
/* spi.c */ #include <avr/io.h> #include "common.h" #define DDR_SPI DDRB #define PORT_SPI PORTB #define PIN_MOSI 3 #define PIN_SCK 5 #define PIN_SS 2 void spi_init(void) { /* Set MOSI, SCK and SS output */ PORT_SPI |= (1<<PIN_SS); DDR_SPI |= (1<<PIN_MOSI) | (1<<PIN_SCK) | (1<<PIN_SS); /* Enable SPI, Master, set clock rate fck/16 */ // SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); // SPCR = (1<<SPE) | (1<<MSTR) | /*(1<<SPR1) |*/ (1<<SPR0) | (1<<CPHA) | (1<<CPOL); SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0) | (1<<CPHA) | (1<<CPOL); } void spi_start(void) { PORT_SPI &= ~(1<<PIN_SS); } void spi_stop(void) { PORT_SPI |= (1<<PIN_SS); } char spi_txrxbyte(char data) { /* Start transmission */ SPDR = data; /* Wait for transmission complete */ while (!(SPSR & (1<<SPIF))) ; /* Return byte received */ return SPDR; } char spi_rxbyte(void) { return spi_txrxbyte(0); }