Код здесь.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Неуч 30 января 2005 г. 02:21
В ответ на: Народ. Помогите разобраться с I2C в Атмеге. отправлено Неуч 30 января 2005 г. 01:24


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