/*#######################################################################################
SPI funktionen 

Copyright (C) 2005 Branko Golubovic
#######################################################################################*/


#ifndef _SPI_H
 #define _SPI_H

#define SPI_Direction	DDRB
#define SPI_Write	PORTB
#define SPI_Read	PINB

//#define HARDWARE_SPI			1		//1 = Hardware SPI | 0 = Software SPI
#define HARDWARE_SPI			0

#define MSB_FIRST	1
//#define MSB_FIRST	0

#define B_SPI_PRESCALER 0		// Fosc/4
//#define B_SPI_PRESCALER 1		// Fosc/16
//#define B_SPI_PRESCALER 2		// Fosc/64
//#define B_SPI_PRESCALER 3		// Fosc/128


//#define SPI_MODE0			// SPI MODE0 CPOL=0,CPHA=0 -> Sample(Rising), Setup(Falling)
//#define SPI_MOD1		// SPI MODE1 CPOL=0,CPHA=1 -> Setup(Rising),Sample(Falling)
#define SPI_MODE2			// SPI MODE2 CPOL=1,CPHA=0 -> Sample(Falling), Setup(Rising)
//#define SPI_MODE3		// SPI MODE3 CPOL=1,CPHA=1 -> Setup(Falling),Sample(Rising)  
 
#if defined (SPI_MODE0)
	#define CLOCKPOL	0
	#define CLOCKPHA	0
	#define B_SPI_MODE	0
#endif

#if defined (SPI_MODE1)
	#define CLOCKPOL	0
	#define CLOCKPHA	1
	#define B_SPI_MODE	4
#endif

#if defined (SPI_MODE2)
	#define CLOCKPOL	1
	#define CLOCKPHA	0
	#define B_SPI_MODE	8
#endif

#if defined (SPI_MODE3)
	#define CLOCKPOL	1
	#define CLOCKPHA	1
	#define B_SPI_MODE	12
#endif
 
#if defined (__AVR_ATmega128__)
	#define SPI_DI				3		// Data Output  
	#define SPI_DO				2		// Data Input 
	#define SPI_Clock			1		// Clock 
	#define SPI_SS				0		//Slave Select
#endif

#if defined (__AVR_ATmega32__)
	#define SPI_DI				6		//Data Output 
	#define SPI_DO				5		//Data Input
	#define SPI_Clock			7		//Clock
	#define SPI_SS				4		//Slave Select
#endif

#if defined (__AVR_ATmega16__)
	#define SPI_DI				6		//Data Output 
	#define SPI_DO				5		//Data Input
	#define SPI_Clock			7		//Clock
	#define SPI_SS				4		//Slave Select
#endif


#if defined (__AVR_ATmega8__)
	#define SPI_DI				4		//Data Output 
	#define SPI_DO				3		//Data Input
	#define SPI_Clock			5		//Clock
	#define SPI_SS				2		//Slave Select
#endif


// Pseudofunctionen
#define spi_enable()	SPCR|=(1<<SPE)
#define spi_disable()	SPCR&=~(1<<SPE)
#define	SPI_SS_low()	SPI_Write&=~(1<<SPI_SS)
#define	SPI_SS_high()	SPI_Write|=(1<<SPI_SS)

extern void spi_init(void);
extern void spi_write(unsigned char Byte);
extern unsigned char spi_read(void);
extern unsigned char spi_read_write(unsigned char Byte);

#endif // _SPI_H
