Интересно то, что часы DS1307 эта хрень инициирует. Т.е. пара записей и одно чтение выполняется вполне корректно. Потом все виснет на стадии проверки готовности while (!(TWCR & (1<<TWINT)));
Ситуация схожая с описаной по ссылке.
http://www.genshiken.ru/club/index.php?topic=1763.0
Не дайте умереть проекту - доделаю, обязательно выложу мож кому пригодится.
#include <mega8.h>
extern unsigned char Errors; //Счетчик ошибок
//--------------------------------------------------------------------------------
void I2CInit(void) {
TWBR = 200; //Set bit rate register (Baudrate). Defined in header file.
TWDR = 0xFF; //Default content = SDA released.
TWCR = (1<<TWEN)| //Enable TWI-interface and release TWI pins.
(0<<TWIE)|(1<<TWINT)| //Disable Interupt and polling flag
(0<<TWEA)|(0<<TWSTA)| //TWEA:TWI Enable Acknowledge Bit and TWSTA:TWI START Condition Bit
(0<<TWSTO)|(0<<TWWC); } //TWSTO:TWI STOP Condition Bit and TWWC:TWI Write Collision Flag
//--------------------------------------------------------------------------------
unsigned char Sendi2c(unsigned char DATA){//Передача байта на шину I2C
TWDR = DATA; //
TWCR = (1<<TWEN)| //Enable TWI-interface and release TWI pins.
(0<<TWIE)|(1<<TWINT)| //Disable Interupt and polling flag
(0<<TWEA)|(0<<TWSTA)| //TWEA:TWI Enable Acknowledge Bit and TWSTA:TWI START Condition Bit
(0<<TWSTO)|(0<<TWWC); //TWSTO:TWI STOP Condition Bit and TWWC:TWI Write Collision Flag
while (!(TWCR & (1<<TWINT)));
return 0; } //Ожидание готовности трансивера
//--------------------------------------------------------------------------------
unsigned char ResI2c(void) { //Прием байта с шины I2C
unsigned char DATA = 0; //Переменная для хранения принятого байта.
//while (!(TWCR & (1<<TWINT))); //Ожидание готовности приема
DATA = TWDR; //
return DATA; } //Возвращаем принятый байт.
//--------------------------------------------------------------------------------
void Strti2c(void) { //Передача условия старта на шину I2C
TWCR = (1<<TWEN)| //Enable TWI-interface and release TWI pins.
(0<<TWIE)|(1<<TWINT)| //Disable Interupt and polling flag
(0<<TWEA)|(1<<TWSTA)| //TWEA:TWI Enable Acknowledge Bit and TWSTA:TWI START Condition Bit
(0<<TWSTO)|(0<<TWWC); //TWSTO:TWI STOP Condition Bit and TWWC:TWI Write Collision Flag
while (!(TWCR & (1<<TWINT))); } //Ожидание готовности трансивера
//--------------------------------------------------------------------------------
void Stopi2c(void) { //Передача условия стопа на шину I2C
TWCR = (1<<TWEN)| //Enable TWI-interface and release TWI pins.
(0<<TWIE)|(1<<TWINT)| //Disable Interupt and polling flag
(0<<TWEA)|(0<<TWSTA)| //TWEA:TWI Enable Acknowledge Bit and TWSTA:TWI START Condition Bit
(1<<TWSTO)|(0<<TWWC); //TWSTO:TWI STOP Condition Bit and TWWC:TWI Write Collision Flag
//if ((TWSR & 0xF8) != START) //Check value of TWI Status Register. Mask prescaler bits.
// {(Errors++);} //If status different from START - ERROR
}
//--------------------------------------------------------------------------------