Код
//Инициализация i2c шины.
TWBR |= 1<<TWBR6|1<<TWBR5|1<<TWBR1|1<<TWBR0; //Резонатор 14.7456МГц.
TWSR &= (~((1<<TWPS1)|(1<<TWPS0)));
TWAR |= 1<<TWA0|1<<TWA1|1<<TWA3|1<<TWA5; //задано произвольно просто чтоб было. МК - мастер.
TWAR &= (~((1<<TWGCE))); //запрещаю всякие там общие вызовы моего МК.
DDRD |= 1<<PD0|1<<PD1; //SDA и SCL делаю как выходы + PullAp.
PORTD |= 1<<PD0|1<<PD1;
//*************************************************
//А это сама функция старт i2c соединения
//*************************************************
static unsigned char i2c_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Устанавливается состояние START
while (!(TWCR & (1<<TWINT))); //Задержка до установки флага TWINT. Он означает что
//состояние START было передано
if ((TWSR & 0xF8) == START) //Проверяем значение в TWI Status Register
{WriteDisplay(0x30);
return(0);}
else
{WriteDisplay(0x31);
WriteIndLed(TWSR);
return(1);}
}
TWBR |= 1<<TWBR6|1<<TWBR5|1<<TWBR1|1<<TWBR0; //Резонатор 14.7456МГц.
TWSR &= (~((1<<TWPS1)|(1<<TWPS0)));
TWAR |= 1<<TWA0|1<<TWA1|1<<TWA3|1<<TWA5; //задано произвольно просто чтоб было. МК - мастер.
TWAR &= (~((1<<TWGCE))); //запрещаю всякие там общие вызовы моего МК.
DDRD |= 1<<PD0|1<<PD1; //SDA и SCL делаю как выходы + PullAp.
PORTD |= 1<<PD0|1<<PD1;
//*************************************************
//А это сама функция старт i2c соединения
//*************************************************
static unsigned char i2c_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Устанавливается состояние START
while (!(TWCR & (1<<TWINT))); //Задержка до установки флага TWINT. Он означает что
//состояние START было передано
if ((TWSR & 0xF8) == START) //Проверяем значение в TWI Status Register
{WriteDisplay(0x30);
return(0);}
else
{WriteDisplay(0x31);
WriteIndLed(TWSR);
return(1);}
}
Почему то после прогона МК этой функции светодиоды зажигаются так, что это соответствует коду (0xEC). Значение "0" на дисплее не видел ни разу хоть умри. Кстати для чистоты эксперимента выпаял с шины все девайсы кроме DS1307Z - часы.
