/*--------------------------------------------*/
/*----------------header files----------------*/
/*--------------------------------------------*/
#include <REG51xD2.H>
#include "SPI.H"

/*----------------------inicializace SPI----------------------*/
void init_SPI(){				   	// inicializace SPI
	SPCON |=  0x10;                	// master mode                  
	SPCON |=  0x01;                	// Fclk Periph/4            
 	SPCON |=  0x08;                	// CPOL = 1
	SPCON |=  0x04;                	// CPHA = 1
 	SPSTA |=  0x7F;							 
}
/*----------------------zápis dat do SPI----------------------*/
/*----------------------s parametrem hodnota(byte)------------*/
void SPI_Write(unsigned char value){		// zápis na SPI s parametrem hodnota 		
 	SPDAT = value;							// data do SPDAT
 	while(!(SPSTA&0x80)); 					// cekání na príznak odeslání dat  
 	SPSTA |=  0x7F;							// vynulování príznaku 
}
/*----------------------ctení dat z SPI-----------------------*/
/*----------------------s parametrem hodnota(byte)------------*/
unsigned int SPI_Read(unsigned char value){	// ctení z SPI s parametrem hodnota
 	SPDAT = value;		  					// data do SPDAT
 	while(!(SPSTA&0x80));					// cekání na príznak odeslání dat
 	SPSTA |=  0x7F;							// vynulování príznaku
 	return(SPDAT);							// vrácení dat z SPDAT
}
/*----------------------ctení dat z A/D-----------------------*/
/*----------------------s parametrem císlo kanálu-------------*/
unsigned int ADC(unsigned char channel){ 	// ctení hodnoty z A/D prevodniku s parametrem císlo kanálu
 unsigned int result = 0;			  		// pomocná promenná pro prepocet

   	ADC_CS = 0;  						   	// aktivace A/D prevodníku
   	SPCON |=  0x40;							// spustení SPI
   	SPI_Write(0x01);						// zápis dat do SPI
   	result = SPI_Read(channel) & 0x0F;		// zápis do A/D císlo kanálu + konfiguracní bity a následné ctení dat z SPI
   	result = result << 8;					// prectený horní byte
   	result |= SPI_Read(0xFF);				// prectený spodní byte a prevod na int
   	ADC_CS=1; 								// deaktivace A/D prevodniku
   	SPCON &=  ~0x40; 						// zastaveni SPI
   	return(result & 0x0FFF);				// vrácení int dat
}
/*---------------------zápis dat do D/A-----------------------*/
/*---------------------s parametrem císlo kanálu--------------*/
/*---------------------s parametrem hodnota(byte)-------------*/
void DAC(unsigned char channel, unsigned int value){	// zápis dat do D/A prevodníku s parametrem císlo kanálu a hodnota
 unsigned int temp = 0;								   	// pomocná promenná pro prepocet

 	DAC_CS = 0;										    // aktivace D/A prevodníku
 	SPCON |=  0x40;										// spustení SPI
 	temp = (value >> 8) | channel;					    // zápis do D/A císlo kanálu + konfiguracní bity horní byte
 	SPI_Write(temp);									// zápis do SPI
 	temp = value;										// zápis do D/A spodní byte
 	SPI_Write(temp);									// zápis do SPI
 	DAC_CS = 1;											// deaktivace D/A prevodníku
	SPCON &=  ~0x40;									// zastavení SPI
}
/*-----------------------potenciometru------------------------*/
/*-----------------------s parametrem hodnota(byte)-----------*/
void Potenciometr(unsigned char value){		// zápis do elektronického potenciometru s parametrem hodnota
 	POT_CS = 0;							    // aktivace potenciometru
	SPCON |=  0x40;							// spustení SPI
 	SPI_Write(value);						// zápis do SPI
 	POT_CS = 1;								// deaktivace potenciometru
	SPCON &=  ~0x40;						// zastavení SPI
}

