#include <avr/io.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 CMD_READ_DATA_FROM_SLAVE1	0x55
#define CMD_READ_DATA_FROM_SLAVE2	0xAA

uint8_t dataWrite[20] = {0};
uint8_t dataRead[20] = {0};

//SS	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 USART_buffer_out(uint8_t *txBuffer, uint8_t buflength)
{
	char	x[3];
	
	for (uint8_t i=0; i<buflength; i++) {
		sprintf (x, "%02X ", txBuffer[i]);
		USART_Transmit_text (x);
	}
	USART_Transmit_text ("\r");
}
//---------------------------------------------------------------------
void SPI_MasterInit()
{
	// MOSI, SCK, SS output pin
	DDRB |= (1 << DDB3) | (1 << DDB5) | (1 << DDB2);
	PORTB |= (1 << PORTB2); // SS HIGH
	// MISO input pin
	DDRB &= ~(1 << DDB4);
	// SPI Enable, Master mode, prescaler = 64 (SPI_SCK = 250KHz)
	SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1);
}
//---------------------------------------------------------------------
uint8_t SPI_Transfer(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
}
//---------------------------------------------------------------------
void Spi_Data_Transfer (uint8_t command, uint8_t len){
	
	PORTB &= ~(1 << PORTB2);    // SS LOW
	for (uint8_t i=0; i<len+1; i++) {
		//Master out command, read dummy byte from slave
		if (i == 0) dataRead[0] = SPI_Transfer(command);
		//Master out dummy byte, read byte from slave
		else dataRead[i-1] = SPI_Transfer(0xff);
	}	
	PORTB |= (1 << PORTB2);     // SS HIGH
}
//---------------------------------------------------------------------
int main (void) {

	USART_Init (UBRR);			//inicializacia UART
	SPI_MasterInit ();			//inicializacia SPI
		
	USART_Transmit_text("\n\rSpi Data Treansfer: SPI_master_a.c\n\r");
	
	while(1) { 
		Spi_Data_Transfer(CMD_READ_DATA_FROM_SLAVE1, 10);
		USART_buffer_out(dataRead, 10);
		_delay_ms(2000);	
		
		Spi_Data_Transfer(CMD_READ_DATA_FROM_SLAVE2, 6);
		USART_buffer_out(dataRead, 6);
		_delay_ms(2000);	
	}
}
//---------------------------------------------------------------------

