Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
19 jimmy 1
/**
2
 * @file    spi.c
3
 * SPI drivers for ATmega8.
4
 *
5
 * @author  Jimmy Myhrman (jimmy@myhrman.org)
6
 * @date    2005-11-28
7
 */
8
 
9
/* -----------------------------------------------------------------------------
10
 * Includes
11
 * ---------------------------------------------------------------------------*/
12
#include "spi.h"
13
 
14
 
15
/* -----------------------------------------------------------------------------
16
 * Functions
17
 * ---------------------------------------------------------------------------*/
18
 
19
/**
20
 * Initializes the SPI interface to master mode.
21
 */
22
void SPI_master_init() {
23
    DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_CS);  /* MOSI, SCK and SS are outputs */
24
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);            /* enable SPI, Master, set clock rate fck/16 */
25
}
26
 
27
/**
28
 * Activates the chip select signal, which is active low.
29
 */
30
void SPI_chip_select() {
31
    PORTB &= ~(1<<DD_CS);       /* enable chip select (active low) */
32
}
33
 
34
/**
35
 * De-activates the chip select signal, which is active low.
36
 */
37
void SPI_chip_unselect() {
38
    PORTB |= (1<<DD_CS);        /* disable chip select (active low) */
39
}
40
 
41
/**
42
 * Sends a data byte via SPI as a master. The function waits till the byte has
43
 * been transmitted before it returns.
44
 *
45
 * @param byte The data byte to send.
46
 * @return The received byte.
47
 */
48
uint8_t SPI_master_send(uint8_t byte) {
49
    SPDR = byte;                /* start transmission */
50
    while(!(SPSR & (1<<SPIF))); /* wait for transmission complete */
51
    return SPDR;
52
}
53
 
54
/**
55
 * Initializes the SPI interface to slave mode.
56
 */
57
void SPI_slave_init() {
58
    DDR_SPI = (1<<DD_MISO);     /* set MISO output, all others input */
59
    SPCR = (1<<SPE);            /* enable SPI */
60
}
61
 
62
/**
63
 * Reads a data byte from the SPI as a slave. The function waits for a reception
64
 * to complete and returns the received byte.
65
 *
66
 * @return The received byte.
67
 */
68
uint8_t SPI_slave_receive(void) {
69
    while(!(SPSR & (1<<SPIF))); /* wait for reception complete */
70
    return SPDR;                /* return data register */
71
}