/*
 * TW_interface.h
 *
 * Created: 6.11.2012 13:09:37
 *  Author: Kubrt
 */ 


#ifndef TW_INTERFACE_H_
#define TW_INTERFACE_H_

void TWI_init(void)
{
	#define START 0x08
	#define SLA_R 0xA1
	#define SLA_W 0xA0
	#define MT_SLA_ACT 0x18
	#define MT_DATA_ACT 0x28
	#define MR_SLA_ACT 0x40
	#define MR_DATA_ACT 0x50
	#define MR_DATA_NACT 0x58
	TWBR = F_CPU/F_TWI-16-1;
}
int EEPROM_write(uint16_t adress, unsigned char data)
{
	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // vynulování přerušení | start bit | povolení TWI
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != START)				//kontrola správnosti příznaku
		return 1;
	TWDR = SLA_W;							//příprava adresy zařízení
	TWCR = (1<<TWINT)|(1<<TWEN);			//zahájení přenosu
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != MT_SLA_ACT)		//kontrola správnosti příznaku adresa
		return 2;
	/* Zápis adresa_H*/	
	TWDR = adress>>8;						//zápis adresy_H
	TWCR = (1<<TWINT)|(1<<TWEN);			//zahájení přenosu
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != MT_DATA_ACT)		//kontrola správnosti příznaku data
		return 3;
	/* Zápis adresa_L*/	
	TWDR = adress;							//zápis adresy_L
	TWCR = (1<<TWINT)|(1<<TWEN);			//zahájení přenosu
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != MT_DATA_ACT)		//kontrola správnosti příznaku data
		return 4;
	/* Zápis dat*/	
	TWDR = data;							//zápis dat
	TWCR = (1<<TWINT)|(1<<TWEN);			//zahájení přenosu
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != MT_DATA_ACT)		//kontrola správnosti příznaku data
		return 5;	
	/*STOP stav*/
	TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
	_delay_ms(3);
	return 6;
}
unsigned char EEPROM_read(uint16_t adress)
{
	_delay_us(10);
	
	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // vynulování přerušení | start bit | povolení TWI | zapnutí ACT
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != START)				//kontrola správnosti příznaku
		return 1;
	TWDR = SLA_W;							//příprava adresy zařízení
	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);	//zahájení přenosu
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != MT_SLA_ACT)		//kontrola správnosti příznaku adresa
		return 2;
	/* Zápis adresa_H*/	
	TWDR = adress>>8;						//zápis adresy_H
	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);	//zahájení přenosu
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != MT_DATA_ACT)		//kontrola správnosti příznaku data
		return 3;
	/* Zápis adresa_L*/	
	TWDR = adress;							//zápis adresy_L
	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);	//zahájení přenosu
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != MT_DATA_ACT)		//kontrola správnosti příznaku data
		return 4;
		
	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);// vynulování přerušení | start bit | povolení TWI
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != 0x10)				//kontrola správnosti příznaku
		return 5;
	
	TWDR = SLA_R;							//příprava adresy zařízení
	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);	//zahájení přenosu
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != MR_SLA_ACT)		//kontrola správnosti příznaku adresa
		return 6;	
		
	/* Čtení dat*/	
	TWCR = (1<<TWINT)|(1<<TWEN);			//zahájení přenosu
	while (!(TWCR & (1<<TWINT)));			//čekání na příznak TWINT
	if ((TWSR & 0xF8) != MR_DATA_NACT)		//kontrola správnosti příznaku data
		return 7;
	/*STOP stav*/
	TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
	_delay_ms(1);
	return TWDR;
}



#endif /* TW_INTERFACE_H_ */