|
void TWI_Master_Initialise(void)
{
TWBR = TWI_Bit_Rate_Register; // Set bit rate register (Baudrate). Defined in header file.
TWSR = TWI_Prescaler_Bits; // Driver presumes prescaler to be 00.
}// Иннициализация RTC
char Fram_RTC_Init (void)
{
unsigned char temp;
/***** Посылка Старта *******************************************/
TWCR = (1<while (!(TWCR & (1< // что START был передан
if ((TWSR & 0xF8) != TWI_START)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса Slave ************************************/
TWDR = RTS_Write; // Загрузка адреса в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MTX_ADR_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса данных ***********************************/
TWDR = 0; // Закружаем 0 адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка РеСтарта *******************************************/
TWCR = (1<while (!(TWCR & (1< // что ReSTART был передан
if ((TWSR & 0xF8) != TWI_REP_START)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой/***** Посылка адреса Slave ************************************/
TWDR = RTS_Read; // Загрузка адреса в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MRX_ADR_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Принятие и сохранение данных *****************************/
for (temp = 0; temp < 9; temp++)
{
if (temp != 8) // Если не последний принимаемый байт, то уст. TWEA
{
TWCR = (1<| (1< while (!(TWCR & (1< // что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MRX_DATA_ACK)
// Если статус не сходиться то выходим с ошибкойreturn 0; // Проверим состояние TWI Status Regis
}
else
{
TWCR = (1<// и посылка данных while (!(TWCR & (1<
// что Команда была передана и подтверждение получено if ((TWSR & 0xF8) != TWI_MRX_DATA_NACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой}
ALL_DATA[temp] = TWDR; // Сохранение данных
}/***** Посылка STOP ********************************************/
TWCR = (1<(1< if ( TESTBIT( ALL_DATA[1],Flag_Osc_En ) == 1) // Если RTC не иннициализировалось,
{ // то выполняем ->
CLEARBIT (ALL_DATA[1], Flag_Osc_En); // Включем кварц
CLEARBIT (ALL_DATA[1], Flag_Tsen); // Выключем запоминание тампера
CLEARBIT (ALL_DATA[0],Flag_Test_Mode); // Выключаем TEST
CLEARBIT (ALL_DATA[0], Flag_Cal_Mode); // Выключаем режим калибровки
CLEARBIT (ALL_DATA[0], Flag_Write); // Выключаем запись
CLEARBIT (ALL_DATA[0], Flag_Read); // Выключаем чтение
/****** Сохраняем регистры *****************************/
/***** Посылка Старта *******************************************/
TWCR = (1<while (!(TWCR & (1< // что START был передан
if ((TWSR & 0xF8) != TWI_START)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса Slave ************************************/
TWDR = RTS_Write; // Загрузка адреса в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MTX_ADR_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса данных ***********************************/
TWDR = 0; // Закружаем 0 адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой/***** Посылка данных ******************************************/
TWDR = ALL_DATA[0]; // Закружаем данные в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка данных ******************************************/
TWDR = ALL_DATA[1]; // Закружаем данные в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка STOP ********************************************/
TWCR = (1<(1<
}
return 1;}
/*********************************************************************/
/************ Чтение Даты и времени **********************************/
/*********************************************************************/
char Time_Read ( char *ALL_DATA )
{
// 1. Прочитать регистры №№ 2-8
unsigned char temp;
/***** Посылка Старта *******************************************/TWCR = (1<
while (!(TWCR & (1< // что START был передан
if ((TWSR & 0xF8) != TWI_START && (TWSR & 0xF8) != TWI_REP_START)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса Slave ************************************/
TWDR = RTS_Write; // Загрузка адреса в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MTX_ADR_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса записываемого байта данных ***********************************/
TWDR = 0; // Закружаем адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Установка бита чтения ***********************************/
TWDR = 0x01; // Закружаем RD в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/****** Считываем время *******************************************/
/***** Посылка РеСтарта *******************************************/
TWCR = (1<while (!(TWCR & (1< // что ReSTART был передан
if ((TWSR & 0xF8) != TWI_REP_START)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой/***** Посылка адреса Slave ************************************/
TWDR = RTS_Read; // Загрузка адреса в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MRX_ADR_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Принятие и сохранение данных *****************************/
for (temp = 1; temp < 9; temp++)
{
if (temp != 8) // Если не последний принимаемый байт, то уст. TWEA
{
TWCR = (1<| (1< while (!(TWCR & (1< // что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MRX_DATA_ACK)
// Если статус не сходиться то выходим с ошибкойreturn 0; // Проверим состояние TWI Status Regis
}
else
{
TWCR = (1<// и посылка данных while (!(TWCR & (1<
// что Команда была передана и подтверждение получено if ((TWSR & 0xF8) != TWI_MRX_DATA_NACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой}
ALL_DATA[temp] = TWDR; // Сохранение данных
}/***** Посылка STOP ********************************************/
TWCR = (1<(1< /***** Востанавливаем бит чтения равным нулю ********************/
/***** Посылка Старта *******************************************/
TWINT установиться, это отвечает
TWCR = (1<while (!(TWCR & (1< // что START был передан
if ((TWSR & 0xF8) != TWI_START)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса Slave ************************************/
TWDR = RTS_Write; // Загрузка адреса в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MTX_ADR_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса данных ***********************************/
TWDR = 0; // Закружаем 2 адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Очистка бита чтения ***********************************/
TWDR = 0x00; // Закружаем 2 адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка STOP ********************************************/
TWCR = (1<(1<
return 1;
}
char Time_Write ( char *ALL_DATA )
{
/****** Устанавливаем время *******************************************/
unsigned char temp;// Разрешения записи RW = 1
/***** Посылка Старта *******************************************/
TWINT установиться, это отвечает
TWCR = (1<while (!(TWCR & (1< // что START был передан
if ((TWSR & 0xF8) != TWI_START)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса Slave ************************************/
TWDR = RTS_Write; // Загрузка адреса в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MTX_ADR_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса записываемого байта данных ***********************************/
TWDR = 0; // Закружаем адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка байта данных ***********************************/
TWDR = 0x02; // Закружаем адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка STOP ********************************************/
TWCR = (1<(1< // Запись времени
/***** Посылка Старта *******************************************/
TWINT установиться, это отвечает
TWCR = (1<while (!(TWCR & (1< // что START был передан
if ((TWSR & 0xF8) != TWI_START)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса Slave ************************************/
TWDR = RTS_Write; // Загрузка адреса в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MTX_ADR_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса записываемого байта данных ***********************************/
TWDR = 2; // Закружаем адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкойfor (temp = 2; temp<9; temp++)
{
/***** Посылка адреса записываемого байта данных ***********************************/
TWDR = ALL_DATA[temp]; // Закружаем адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
}
/***** Посылка STOP ********************************************/
TWCR = (1<(1<
// Запрещение записи RW = 0/***** Посылка Старта *******************************************/
TWINT установиться, это отвечает
TWCR = (1<while (!(TWCR & (1< // что START был передан
if ((TWSR & 0xF8) != TWI_START)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса Slave ************************************/
TWDR = RTS_Write; // Загрузка адреса в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что Команда была передана и подтверждение получено
if ((TWSR & 0xF8) != TWI_MTX_ADR_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка адреса записываемого байта данных ***********************************/
TWDR = 0; // Закружаем адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка байта данных ***********************************/
TWDR = 0x00; // Закружаем адрес в TWDR
TWCR = (1<| (1<
while (!(TWCR & (1<// что данные были переданы и подтверждение получено if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)
return 0; // Проверим состояние TWI Status Register.
// Если статус не сходиться то выходим с ошибкой
/***** Посылка STOP ********************************************/
TWCR = (1<(1<
return 1;
}
E-mail: info@telesys.ru