#ifndef IICULTIMATE_H
#define IICULTIMATE_H

#include <mega8.h>
#include <m8_128.h>
#include <io.h>



#define i2c_PORT	PORTC				// Порт где сидит нога TWI
#define i2c_DDR		DDRC
#define i2c_SCL		5					// Биты соответствующих выводов
#define i2c_SDA		4


#define i2c_i_am_slave		0			// Если мы еще и слейвом работаем то 1. А то не услышит!

#define i2c_MaxBuffer		8			// Величина буфера Master режима RX-TX. Зависит от того какой длины строки мы будем гонять
#define i2c_MaxPageAddrLgth	2			// Максимальная величина адреса страницы. Обычно адрес страницы это один или два байта. 
										// Зависит от типа ЕЕПРОМ или другой микросхемы. 



#define i2c_type_msk	        0b00001100		// Маска режима
#define i2c_sarp		0b00000000		// Start-Addr_R-Read-Stop  							Это режим простого чтения. Например из слейва или из епрома с текущего адреса
#define i2c_sawp		0b00000100		// Start-Addr_W-Write-Stop 							Это режим простой записи. В том числе и запись с адресом страницы. 
#define i2c_sawsarp		0b00001000		// Start-Addr_W-WrPageAdr-rStart-Addr_R-Read-Stop 	Это режим с предварительной записью текущего адреса страницы

#define i2c_Err_msk		0b00110011		// Маска кода ошибок
#define i2c_Err_NO		0b00000000		// All Right! 						-- Все окей, передача успешна. 
#define i2c_ERR_NA		0b00010000		// Device No Answer 				-- Слейв не отвечает. Т.к. либо занят, либо его нет на линии.
#define i2c_ERR_LP		0b00100000		// Low Priority 					-- нас перехватили собственным адресом, либо мы проиграли арбитраж
#define i2c_ERR_NK		0b00000010		// Received NACK. End Transmittion. -- Был получен NACK. Бывает и так.
#define i2c_ERR_BF		0b00000001		// BUS FAIL 						-- Автобус сломался. И этим все сказано. Можно попробовать сделать переинициализацию шины


#define i2c_Busy		0b01000000  	// Trans is Busy				Битмаска флага "Передатчик занят, руками не трогать". 
#define i2c_Free		0b10111111  	// Trans is Free				Битмаска снятия флага занятости.


#define MACRO_i2c_WhatDo_MasterOut 	(MasterOutFunc)();		// Макросы для режимо выхода. Пока тут функция, но может быть что угодно
#define MACRO_i2c_WhatDo_ErrorOut   (ErrorOutFunc)();



typedef void (*IIC_F)(void);								// Тип указателя на функцию

extern IIC_F MasterOutFunc;									// Подрбрости в сишнике. 
extern IIC_F ErrorOutFunc;

extern u8 END;

extern u8 i2c_Do;											


extern u8 i2c_Buffer[i2c_MaxBuffer];
extern u8 i2c_index;
extern u8 i2c_ByteCount;

extern u8 i2c_SlaveAddress;
extern u8 i2c_PageAddress[i2c_MaxPageAddrLgth];

extern u8 i2c_PageAddrIndex;
extern u8 i2c_PageAddrCount;


extern void Init_i2c(void);


/*
extern u8 	WorkLog[30];
extern u8	WorkIndex;
*/
#endif
