#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <string.h>
#include <stdio.h>

#define BAUD 9600
#define UBRR F_CPU/16/BAUD-1
#define DELAY1	5
#define DELAY2	400

//SS0	PORTB2
//MOSI	PORTB3
//MISO	PORTB4
//SCK	PORTB5
	
//--------------------------------------------------------------------
//Inicializacia serial port
void USART_Init (unsigned int ubrr)	
{
	// set baud rate
	UBRR0H = (unsigned char)(ubrr>>8);
	UBRR0L = (unsigned char)ubrr;
	// Enable receiver and transmitter;
	UCSR0B |= (1 << RXEN0) | (1 << TXEN0);
	//Set Frame format: 8data 1stop
	//UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00); 
}
//---------------------------------------------------------------------
void USART_Transmit (char dataout) 
{
	while( !(UCSR0A & (1 << UDRE0)) );
	UDR0 = dataout;
}
//------------------------------------------------------------------------------
void USART_Transmit_text(char *text) {
	unsigned char j;
	for (j=0; j<strlen(text); j++) USART_Transmit (text[j]);
}
//---------------------------------------------------------------------
void SPI_MasterInit()
{
	// MOSI, SCK, SS ako výstup
	DDRB |= (1 << DDB3) | (1 << DDB5) | (1 << DDB2);
	// MISO ako vstup
	DDRB &= ~(1 << DDB4);
	// SPI Enable, Master mode, prescaler = 64 (SPI_SCK = 250KHz)
	SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1);
}
//---------------------------------------------------------------------
uint8_t SPI_MasterTransmit(uint8_t data)
{
	SPDR = data;					// Zapíš dáta do SPI registra
	while (!(SPSR & (1 << SPIF)));	// Čakaj na dokončenie prenosu
	return SPDR;					// Vráti prijatý bajt
}
//------------------------------------------------------------------------------
int main (void) {

	USART_Init (UBRR);			//inicializacia UART
	SPI_MasterInit ();			//inicializacia SPI
		
	USART_Transmit_text("\n\rSPI_master.c\n\r");
	
	while(1) { 
		PORTB &= ~(1 << PORTB2);		// SS LOW
		_delay_us(DELAY1);
		SPI_MasterTransmit('S');
		_delay_us(DELAY2);
		SPI_MasterTransmit('l');
		_delay_us(DELAY2);
		SPI_MasterTransmit('a');
		_delay_us(DELAY2);
		SPI_MasterTransmit('v');
		_delay_us(DELAY2);
		SPI_MasterTransmit('e');
		_delay_us(DELAY2);
		SPI_MasterTransmit(' ');
		_delay_us(DELAY1);
		PORTB |= (1 << PORTB2);			// SS HIGH	
		_delay_ms(1000);	
	}
}
//------------------------------------------------------------------------------

