#ifndef TWI_H
#define TWI_H
//******************************** Отладка *********************************//
//#define TWI_DEBUG
//******************************** /Отладка ********************************//
//********************** Статусные коды TWI модуля ***************************//
// Общие статусные коды.
// Состояние START сформировано.
#define TWI_START 0x08
// Состояние повторный START сформировано.
#define TWI_REP_START 0x10
// Был потерян приоритет.
#define TWI_ARB_LOST 0x38
// Статусные коды ведущего передатчика.
// Был передан пакет SLA+W и получено подтверждение.
#define TWI_MTX_ADR_ACK 0x18
// Был передан пает SLA+W и не получено подтверждение.
#define TWI_MTX_ADR_NACK 0x20
// Был передан байт данных и получено подтверждение.
#define TWI_MTX_DATA_ACK 0x28
// Был передан байт данных и не получено подтверждение.
#define TWI_MTX_DATA_NACK 0x30
// Статусные коды ведущего приемника.
// Был передан пакет SLA+R и получено подтвеждение.
#define TWI_MRX_ADR_ACK 0x40
// Был передан пакет SLA+R и не получено подтверждение.
#define TWI_MRX_ADR_NACK 0x48
// Байт данных принят и передано подтверждение.
#define TWI_MRX_DATA_ACK 0x50
// Был принят байт данных без подтверждения.
#define TWI_MRX_DATA_NACK 0x58
// Другие статусные коды.
// Неопределенное состояние (TWINT = "0").
#define TWI_NO_STATE 0xF8
// Ошибка на шине из-за некоректных состояний СТАРТ или СТОП.
#define TWI_BUS_ERROR 0x00
// Пользовательские коды.
// Успешное завершение.
#define TWI_SUCCESS 0xff
//********************** /Статусные коды TWI модуля **************************//
//*********************** Функции получения байта адреса *********************//
#define TWI_GET_READ_BYTE(ADDRESS) ((ADDRESS)<<1)|1;
#define TWI_GET_WRITE_BYTE(ADDRESS) ((ADDRESS)<<1)|0;
//*********************** /Функции получения байта адреса ********************//
//*************************** Публичные функции ****************************//
///
/// Инициализация и установка частоты SCL сигнала.
///
void TwiMasterInit(void);
///
/// Изменение скорости TWI.
///
/// Скорость TWI.
void TwiChangeSpeed(uint32_t twiSpeed);
///
/// Получить статус TWI модуля.
///
/// Статус TWI модуля.
uint8_t TwiGetState(void);
///
/// Получить статус, работа с TWI завершена.
///
/// Работа с TWI завершена..
uint8_t TwiGetFinishStep(void);
///
/// Передать данные.
///
/// Массив данных для отправки.
/// Размер массива msg.
void TwiSendData(uint8_t *msg, uint8_t msgSize);
///
/// Передать данные. С дополнительным ожиданием завершения операции.
///
/// Массив данных для отправки.
/// Размер массива msg.
void TwiSendDataOnInit(uint8_t* msg, uint8_t msgSize);
///
/// Устанавливаем начальный регистр.
///
/// Адрес устройства.
/// Номер начального регистра.
void TwiSetBeginReg(uint8_t address, uint8_t beginReg);
///
/// Устанавливаем начальный регистр. С дополнительным ожиданием завершения операции.
///
/// Адрес устройства.
/// Номер начального регистра.
void TwiSetBeginRegOnInit(uint8_t address, uint8_t beginReg);
///
/// Отправляем запрос на чтение.
///
/// Адрес устройства.
/// Размер массива msg.
void TwiReadBytes(uint8_t address, uint8_t msgSize);
///
/// Отправляем запрос на чтение. С дополнительным ожиданием завершения операции.
///
/// Адрес устройства.
/// Массив данных для отправки.
void TwiReadBytesOnInit(uint8_t address, uint8_t msgSize);
///
/// Читаем значение регистра по адресу и номеру регистра. С дополнительным ожиданием завершения операции.
///
/// Адрес устройства.
/// Номер регистра.
uint8_t TwiGetByteOnInit(uint8_t address, uint8_t numberReg);
///
/// Получить принятые данные. Переписываем данные буфера драйвера в свой буфер.
///
/// Массив в который необходимо переписать данные.
/// Размер массива msg.
/// Статус TWI модуля.
uint8_t TwiGetData(uint8_t *msg, uint8_t msgSize);
//*************************** /Публичные функции ***************************//
#ifdef TWI_DEBUG
//***************************** Функции отладки ****************************//
///
/// Возращает кол-во ошибок со старта приложения.
///
uint16_t TwiGetCountError();
///
/// Возращает последнюю ошибку.
///
uint8_t TwiGetLastError();
///
/// Возращает последний обработанный индекс массива в прерывании.
///
uint8_t TwiGetTwiBufIndex();
///
/// Устанавляем размер регистра адреса в байтах.
///
/// Размер регистра адреса в байтах.
void TwiSetToLengthAddressReg(uint8_t length);
//**************************** /Функции отладки ****************************//
#endif
#endif //TWIM_H