/*
 * i2c.h
 *
 * Created: 5/21/2014 11:41:32 PM
 *  Author: true
 */ 


#ifndef I2C_H_
#define I2C_H_


#include "config.h"


/* macros */
#define	i2c_clear_int_flag()		TWCR |= _BV(TWINT)

#define i2c_disable_interrupt()		TWCR &= ~(_BV(TWIE))
#define i2c_enable_interrupt()		TWCR |= _BV(TWIE)

#define i2c_disable_slave()			TWCR &= ~(_BV(TWEA))
#define i2c_enable_slave()			TWCR |= _BV(TWEA)


/* configuration */
static inline void i2c_slave_init(uint8_t address, uint8_t enable_general_addr)
{
	// set bitrate register, clear prescaler
	// should get us 400KHz (fast mode) max rate
	TWBR = 2;
	TWSR = ~(_BV(TWPS0) | _BV(TWPS1));
	
	// set slave address and clear address mask
	TWAR = ((address << 1) | (enable_general_addr & 1));
	TWAMR = 0;
	
	// enable auto-ack, enable TWI, and enable the TWI interrupt
	TWCR = _BV(TWEA) | _BV(TWEN) | _BV(TWIE);
}

/* sending */
static uint8_t i2c_slave_tx(uint8_t byte, uint8_t is_last_byte)
{
	// load data
	TWDR = byte;
	
	// start sending
	TWCR |= _BV(TWINT);
	
	if (is_last_byte) {
		// this is all the data we have to send; send a nack after this byte
		i2c_disable_slave();	
	}
	
	return 0;
}


#endif /* I2C_H_ */