00001
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #ifndef _SPI_DRV_H_
00045 #define _SPI_DRV_H_
00046
00047
00048
00049 #include "config.h"
00050
00051
00052
00053
00054
00055 #define MSK_SPI_MODE ((1<<CPOL)|(1<<CPHA))
00056 #define MSK_SPI_CPHA_LEADING (0<<CPHA)
00057 #define MSK_SPI_CPHA_TRAILING (1<<CPHA)
00058 #define MSK_SPI_CPOL_LOW (0<<CPOL)
00059 #define MSK_SPI_CPOL_HIGH (1<<CPOL)
00060 #define SPI_MODE_0 (MSK_SPI_CPOL_LOW|MSK_SPI_CPHA_LEADING)
00061 #define SPI_MODE_1 (MSK_SPI_CPOL_LOW|MSK_SPI_CPHA_TRAILING)
00062 #define SPI_MODE_2 (MSK_SPI_CPOL_HIGH|MSK_SPI_CPHA_LEADING)
00063 #define SPI_MODE_3 (MSK_SPI_CPOL_HIGH|MSK_SPI_CPHA_TRAILING)
00064
00065
00066 #define MSK_SPI_MULT2 0x80
00067 #define MSK_SPR ((1<<SPR1)|(1<<SPR0))
00068 #define MSK_SPI_DIV4 ((0<<SPR1)|(0<<SPR0))
00069 #define MSK_SPI_DIV16 ((0<<SPR1)|(1<<SPR0))
00070 #define MSK_SPI_DIV64 ((1<<SPR1)|(0<<SPR0))
00071 #define MSK_SPI_DIV128 ((1<<SPR1)|(1<<SPR0))
00072 #define SPI_RATE_0 (MSK_SPI_MULT2|MSK_SPI_DIV4) // Fper / 2
00073 #define SPI_RATE_1 (MSK_SPI_DIV4) // Fper / 4
00074 #define SPI_RATE_2 (MSK_SPI_MULT2|MSK_SPI_DIV16) // Fper / 8
00075 #define SPI_RATE_3 (MSK_SPI_DIV16) // Fper / 16
00076 #define SPI_RATE_4 (MSK_SPI_MULT2|MSK_SPI_DIV64) // Fper / 32
00077 #define SPI_RATE_5 (MSK_SPI_DIV64) // Fper / 64
00078 #define SPI_RATE_6 (MSK_SPI_DIV128) // Fper / 128
00079
00080
00081
00082
00083
00084 #define Spi_enable() (SPCR |= (1<<SPE))
00085 #define Spi_disable() (SPCR &= ~(1<<SPE))
00086
00087
00088 #define Spi_enable_it() (SPCR |= (1<<SPIE))
00089 #define Spi_disable_it() (SPCR &= ~(1<<SPIE))
00090
00091
00092 #define Spi_select_slave() (SPCR &= ~(1<<MSTR))
00093 #define Spi_select_master() (SPCR |= (1<<MSTR))
00094 #define Spi_set_lsbfirst() (SPCR |= (1<<DORD))
00095 #define Spi_set_msbfirst() (SPCR &= ~(1<<DORD))
00096 #define Spi_set_mode(mode) {SPCR &= ~MSK_SPI_MODE; SPCR |= mode;}
00097 #define Spi_set_rate(rate) {SPCR &= ~MSK_SPR; SPCR |= rate&MSK_SPR; (rate & MSK_SPI_MULT2)? Spi_set_doublespeed() : Spi_clear_doublespeed();}
00098 #define Spi_set_doublespeed() (SPSR |= (1<<SPI2X))
00099 #define Spi_clear_doublespeed() (SPSR &= ~(1<<SPI2X))
00100 #define Spi_init_bus() ((DDRB |= (1<<DDB2)|(1<<DDB1)))
00101 #define Spi_disable_ss()
00102 #define Spi_enble_ss()
00103
00104
00105 #define Spi_wait_spif() while ((SPSR & (1<<SPIF)) == 0) // for any SPI_RATE_x
00106 #define Spi_wait_eor() while ((SPSR & (1<<SPIF)) == 0) // wait end of reception
00107 #define Spi_wait_eot() while ((SPSR & (1<<SPIF)) == 0) // wait end of transmission
00108 #define Spi_eor() ((SPSR & (1<<SPIF)) == (1<<SPIF)) // check end of reception
00109 #define Spi_eot() ((SPSR & (1<<SPIF)) == (1<<SPIF)) // check end of transmission
00110 #define Spi_is_colision() (SPSR&(1<<WCOL))
00111 #define Spi_get_byte() (SPDR)
00112 #define Spi_tx_ready() (SPSR & (1<<SPIF))
00113 #define Spi_rx_ready() Spi_tx_ready()
00114 #define Spi_ack_read() (SPSR)
00115 #define Spi_ack_write() (SPDR)
00116 #define Spi_ack_cmd() (SPSR)
00117
00118
00119 #define Spi_read_data() (SPDR)
00120 #define Spi_write_data(byte) {(SPDR=byte);Spi_wait_spif();}
00121
00122 #endif // _SPI_DRV_H_
00123