#define ds3231 0b11010001
"
...младший бит, определяет направление пересылки данных. "Ноль" означает, что ведущий будет записывать информацию в выбранного ведомого. "Единица" означает, что ведущий будет считывать информацию из ведомого."
Т.е. ты хочешь читать из ведомого устройства. А не нужно ли ему вначале передать
что хочется прочитать, адрес регистра, например?
TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE); // старт
while (!(TWCR &( 1<<TWINT))); // ожидание подъема twint
if ((TWSR & 0xF8) != 0xF8); else PORTB |= (1 << 2); // ежели ошибка- загорится лампа
Зачем включать прерывание, если не используешь его? (TWIE)
Статус удачного старта - 0x08, т.е. для зажигания при ошибке нужно
if ((TWSR & 0xF8) != 0x08) PORTB |= (1 << 2);TWDR= addrW;
TWCR= (1<<TWINT)|(1<<TWEN);
while (!(TWCR &( 1<<TWINT))); // ожидание подъема twint
После передачи адреса устройства хорошо бы проверить результат, код успешного передачи адреса (TWSR & 0xF8) == 0x18
TWDR= addrDATA;
TWCR= (1<<TWINT)|(1<<TWEN);
while (!(TWCR &( 1<<TWINT))); // ожидание подъема twint
if ((TWSR & 0xF8) != 0xF8) ;else PORTB |= (1 << 3); // ежели ошибка- загорится лампа
Здесь, видимо, передаётся адрес регистра. Кстати, код успешной передачи данных (TWSR & 0xF8) == 0x28
Но i2c-адрес говорит "читаем из ведомого". Таким образом, ведомый начал что-то отвечать, но что?
В это же время ведущий начал что-то передавать - получили коллизию.
В общем, летит старт, летит адрес, адрес прилетает нормально, * далее летит неправильный (обычно пустой или, 4 раза генерирует некую белибирду)
i2c работает так, как ты ей сказал. А не так, как хотел чтобы оно работало.

В даташите описан алгоритм приема и передачи в/из ведомого.