//***************************************************************************
//
//  Author(s)...: Павел Бобков  http://ChipEnable.Ru   
//
//  Target(s)...: mega16
//
//  Compiler....: IAR
//
//  Description.: Драйвер ведущего TWI устройства. 
//                Код основан на Atmel`овских доках - AVR315.
//
//  Data........: 13.11.13
//
//***************************************************************************
#ifndef TWIM_H
#define TWIM_H

#include <ioavr.h>
#include <intrinsics.h>
#include <stdint.h>

/****************************************************************************
  Настройки модуля
****************************************************************************/

/*если не определена тактовая 
частота, определяем ее здесь*/
#ifndef F_CPU
   #error F_CPU!!!
#endif

/*размер буфера TWI модуля*/
#define TWI_BUFFER_SIZE  8      

/****************************************************************************
  Статусные коды TWI модуля 
****************************************************************************/

/*Общие статусные коды */                    
#define TWI_START                  0x08  // состояние START сформировано 
#define TWI_REP_START              0x10  // состояние повторный START сформировано 
#define TWI_ARB_LOST               0x38  // был потерян приоритет 

/*Статусные коды ведущего передатчика*/                
#define TWI_MTX_ADR_ACK            0x18  // был передан пакет SLA+W и получено подтверждение
#define TWI_MTX_ADR_NACK           0x20  // был передан пает SLA+W и не получено подтверждение
#define TWI_MTX_DATA_ACK           0x28  // был передан байт данных и получено подтверждение  
#define TWI_MTX_DATA_NACK          0x30  // был передан байт данных и не получено подтверждение

/*Статусные коды ведущего приемника*/ 
#define TWI_MRX_ADR_ACK            0x40  // был передан пакет SLA+R и получено подтвеждение 
#define TWI_MRX_ADR_NACK           0x48  // был передан пакет SLA+R и не получено подтверждение 
#define TWI_MRX_DATA_ACK           0x50  // байт данных принят и передано подтверждение  
#define TWI_MRX_DATA_NACK          0x58  // был принят байт данных без подтверждения  

/*Другие статусные коды*/
#define TWI_NO_STATE               0xF8  // неопределенное состояние; TWINT = “0”
#define TWI_BUS_ERROR              0x00  // ошибка на шине из-за некоректных состояний СТАРТ или СТОП

/*Пользовательские коды*/
#define TWI_SUCCESS                0xff

/****************************************************************************
  Определения констант
****************************************************************************/

#define TWI_READ_BIT     0       // позиция R/W бита в адресном пакете
#define TWI_ADR_BITS     1       // позиция адреса в адресном пакете
#define TRUE             1
#define FALSE            0

/****************************************************************************
  Пользовательские функции
****************************************************************************/

/*Инициализация и установка частоты SCL сигнала*/
uint8_t TWI_MasterInit(uint16_t fr);

/*Передать данные*/
void TWI_SendData(uint8_t *msg, uint8_t msgSize);

/*Получить принятые данные*/
uint8_t TWI_GetData(uint8_t *msg, uint8_t msgSize);

/*Взять статус TWI модуля*/
uint8_t TWI_GetState(void);

#endif //TWIM_H