/*
** ===================================================================
** Název souboru   : twi_c.c
** Mikrokontroler  : ATmega
** Popis           : Knihovna pro řízení komunikace po sběrnici I2C (TWI).
** Autor           : Tomáš Frýza ( fryza@feec.vutbr.cz ), m.dujicek
** ===================================================================
*/


/*
** Hlavičkové soubory
*/
#include <avr/io.h>         // definiční soubor mikrokontroléru
#include "twi_h.h"			// funkce pro komunikaci po sběrnici I2C (TWI)



/*
** ===================================================================
**     Název funkce  : twi_start
**     Popis         :
**         Vyslání startovací podmínky na sběrnici I2C (TWI).
**     Parametry     : žádné
**     Výst. hodnota : žádná
** ===================================================================
*/
void twi_start( void ) {
	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN) ;
							// vyslání startovací podmínky
							// TWINT...TWI Interrupt Flag
							// TWSTA...TWI Start Condition Bit
							// TWEN....TWI Enable Bit
	while( !( TWCR & (1<<TWINT))) ;
							// čekání na dokončení operace, tj. TWINT=1
}


/*
** ===================================================================
**     Název funkce  : twi_address_w
**     Popis         :
**         Vyslání slave adresy + write bitu na sběrnici I2C (TWI).
**     Parametry     : slave...7bitová adresa podřízeného obvodu
**     Výst. hodnota : žádná
** ===================================================================
*/


void twi_address_w( char slave ) {
	TWDR = (slave<<1);		// načtení adresy a write bitu do datového registru
	TWCR = (1<<TWINT) | (1<<TWEN) ;
							// vyslání slave adresy + write bitu
							// TWINT...TWI Interrupt Flag
							// TWEN....TWI Enable Bit
	while( !( TWCR & (1<<TWINT))) ;
							// čekání na dokončení operace, tj. TWINT=1
}

/*
** ===================================================================
**     Název funkce  : twi_address_r
**     Popis         :
**         Vyslání slave adresy + read bitu na sběrnici I2C (TWI).
**     Parametry     : slave...7bitová adresa podřízeného obvodu
**     Výst. hodnota : žádná
** ===================================================================
*/


void twi_address_read( char slave ) {
	TWDR = (slave<<1)+1;		// načtení adresy a read bitu do datového registru
	TWCR = (1<<TWINT) | (1<<TWEN) ;
							// vyslání slave adresy + write bitu
							// TWINT...TWI Interrupt Flag
							// TWEN....TWI Enable Bit
	while( !( TWCR & (1<<TWINT))) ;
							// čekání na dokončení operace, tj. TWINT=1
}

/*
** ===================================================================
**     Název funkce  : twi_write
**     Popis         :
**         Zápis datového paketu na sběrnici I2C (TWI).
**     Parametry     : data...8bitová data
**     Výst. hodnota : žádná
** ===================================================================
*/
void twi_write( char data ) {
	TWDR = data ;			// načtení datového paketu do datového registru
	TWCR = (1<<TWINT) | (1<<TWEN) ;
							// vyslání datového paketu
							// TWINT...TWI Interrupt Flag
							// TWEN....TWI Enable Bit
	while( !( TWCR & (1<<TWINT))) ;
							// čekání na dokončení operace, tj. TWINT=1

}

/*
** ===================================================================
**     Název funkce  : twi_read
**     Popis         :
**         cteni datového paketu na sběrnici I2C (TWI).
**     Parametry     : zadny
**     Výst. hodnota : byte vycteny z i2c
** ===================================================================
*/
unsigned char twi_read( void) {
	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
							// prijem datoveho paketu
							// TWINT...TWI Interrupt Flag
							// TWEN....TWI Enable Bit
	while( !( TWCR & (1<<TWINT))) ;
							// čekání na dokončení operace, tj. TWINT=1
	
	return(TWDR) ;			// načtení datového paketu do datového registru
}


/*
** ===================================================================
**     Název funkce  : twi_read
**     Popis         :
**         cteni datového paketu na sběrnici I2C (TWI).
**     Parametry     : zadny
**     Výst. hodnota : byte vycteny z i2c
** ===================================================================
*/
unsigned char twi_readNACK( void) {
	TWCR = (1<<TWINT) | (1<<TWEN);
							// prijem datoveho paketu
							// TWINT...TWI Interrupt Flag
							// TWEN....TWI Enable Bit
	while( !( TWCR & (1<<TWINT))) ;
							// čekání na dokončení operace, tj. TWINT=1
	
	return(TWDR) ;			// načtení datového paketu do datového registru
}


/*
** ===================================================================
**     Název funkce  : twi_stop
**     Popis         :
**         Vyslání ukončovací podmínky na sběrnici I2C (TWI).
**     Parametry     : žádný
**     Výst. hodnota : žádná
** ===================================================================
*/
void twi_stop( void ) {
	TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN) ;
							// vyslání ukončovací podmínky
							// TWINT...TWI Interrupt Flag
							// TWSTO...TWI Stop Condition Bit
							// TWEN....TWI Enable Bit
}


/*
** Konec zdrojového souboru
*/
