4008-04-07 Release
[avr_bc100.git] / BaseMegaFirmware / GCC / spi.c
diff --git a/BaseMegaFirmware/GCC/spi.c b/BaseMegaFirmware/GCC/spi.c
new file mode 100644 (file)
index 0000000..a69e4e7
--- /dev/null
@@ -0,0 +1,43 @@
+// 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