--- /dev/null
+// Martin Thomas 3/2008\r
+\r
+#include <stdint.h>\r
+#include <avr/io.h>\r
+#include <util/delay.h>\r
+\r
+#include "spi.h"\r
+\r
+void SPI_init( void )\r
+{\r
+ SPI_PORT |= (1<<SPI_MISO_BIT) | ( 1<<SPI_SS_BIT); // enable pull-up input and SS default high\r
+ SPI_PORT &= ~( (1<<SPI_SCK_BIT) | (1<<SPI_MOSI_BIT) ); // output-inits\r
+ SPI_DDR &= ~(1<<SPI_MISO_BIT);\r
+ SPI_DDR |= (1<<SPI_MOSI_BIT) | (1<<SPI_SCK_BIT) | (1<<SPI_SS_BIT); //Set MOSI, SCK AND SS as outputs\r
+ // SPSR = (1<<SPI2X);\r
+ SPCR = (1<<SPE) | (1<<MSTR) | ( 1<<SPR1) | ( 1<<SPR0 );\r
+}\r
+\r
+void SPI_release( void )\r
+{\r
+ SPCR = 0;\r
+ SPI_DDR &= ~( (1<<SPI_MOSI_BIT) | (1<<SPI_SCK_BIT) | (1<<SPI_SS_BIT ) );\r
+ SPI_PORT &= ~( (1<<SPI_MISO_BIT) | ( 1<<SPI_SS_BIT) );\r
+}\r
+\r
+uint8_t SPI_rw( uint8_t out )\r
+{\r
+ uint8_t in;\r
+\r
+ _delay_ms(1); // slow down to give slave time to process\r
+\r
+#if defined(SPDR0)\r
+ SPDR0 = out;\r
+ while( !(SPSR0 & (1<<SPIF0)) ) { ; }\r
+ in = SPDR0;\r
+#else\r
+ SPDR = out;\r
+ while( !(SPSR & (1<<SPIF)) ) { ; }\r
+ in = SPDR;\r
+#endif\r
+ return in;\r
+}\r
+\r