4008-04-07 Release
[avr_bc100.git] / BaseMegaFirmware / GCC / spi.c
1 // Martin Thomas 3/2008\r
2 \r
3 #include <stdint.h>\r
4 #include <avr/io.h>\r
5 #include <util/delay.h>\r
6 \r
7 #include "spi.h"\r
8 \r
9 void SPI_init( void )\r
10 {\r
11         SPI_PORT |= (1<<SPI_MISO_BIT) | ( 1<<SPI_SS_BIT); // enable pull-up input and SS default high\r
12         SPI_PORT &= ~( (1<<SPI_SCK_BIT) | (1<<SPI_MOSI_BIT) ); // output-inits\r
13         SPI_DDR  &= ~(1<<SPI_MISO_BIT);\r
14         SPI_DDR  |= (1<<SPI_MOSI_BIT) | (1<<SPI_SCK_BIT) | (1<<SPI_SS_BIT);             //Set MOSI, SCK AND SS as outputs\r
15         // SPSR = (1<<SPI2X);\r
16         SPCR = (1<<SPE) | (1<<MSTR) | ( 1<<SPR1) | ( 1<<SPR0 );\r
17 }\r
18 \r
19 void SPI_release( void )\r
20 {\r
21         SPCR = 0;\r
22         SPI_DDR  &= ~( (1<<SPI_MOSI_BIT) | (1<<SPI_SCK_BIT) | (1<<SPI_SS_BIT ) );\r
23         SPI_PORT &= ~( (1<<SPI_MISO_BIT) | ( 1<<SPI_SS_BIT) );\r
24 }\r
25 \r
26 uint8_t SPI_rw( uint8_t out )\r
27 {\r
28         uint8_t in;\r
29 \r
30         _delay_ms(1); // slow down to give slave time to process\r
31 \r
32 #if defined(SPDR0)\r
33         SPDR0 = out;\r
34         while( !(SPSR0 & (1<<SPIF0)) ) { ; }\r
35         in = SPDR0;\r
36 #else\r
37         SPDR = out;\r
38         while( !(SPSR & (1<<SPIF)) ) { ; }\r
39         in = SPDR;\r
40 #endif\r
41         return in;\r
42 }\r
43 \r