c95cbd3f |
1 | /* $Id: rfm12.c,v 1.1 2010/07/11 09:09:26 simimeie Exp $ |
2 | * Functions for communicating with the rfm12(b) module |
3 | */ |
4 | |
5 | #include <avr/io.h> |
6 | #include "rfm12.h" |
7 | |
8 | /* Unfortunately, the manufacturer documentation for chip and module is |
9 | * almost unreadable crap. |
10 | * This one is better: http://www.mikrocontroller.net/articles/RFM12 |
11 | */ |
12 | /* Note: the signal is inverted, thus pulling this high DEselects the chip */ |
13 | #define spi_ss_hi() { PORTC |= _BV(0); } |
14 | /* Consequently, this SELECTS the chip */ |
15 | #define spi_ss_lo() { PORTC &= (uint8_t)~_BV(0); } |
16 | |
17 | static void spi_sendbyte(uint8_t v) { |
18 | /* Start transmission */ |
19 | SPDR = v; |
20 | /* Wait for transmission complete */ |
21 | while ((SPSR & _BV(SPIF)) == 0) { |
22 | } |
23 | } |
24 | |
25 | static uint8_t spi_readbyte() { |
26 | SPDR = 0x00; /* Dummy write */ |
27 | while ((SPSR & _BV(SPIF)) == 0) { |
28 | } |
29 | /* Return Data Register */ |
30 | return SPDR; |
31 | } |
32 | |
33 | void rfm12_init(void) { |
34 | /* Set MOSI, SCK and SS output, MISO input */ |
35 | DDRB |= _BV(3) | _BV(5); |
36 | DDRC |= _BV(0); |
37 | DDRB &= (uint8_t)~_BV(4); |
38 | spi_ss_hi(); |
39 | /* Enable SPI, Master, set clock rate fck/4. |
40 | * This works as long as our own clockrate is below 10 MHz - because |
41 | * 2.5 MHz is the maximum the rfm12b can do. */ |
42 | SPCR |= _BV(SPE) | _BV(MSTR); |
43 | } |