Nie podejrzewaj jeszcze pamięci !!!.
W tej Twojej Modyfikacji masz babola.
Wysyłasz 2 bajty adresu komórki pamięci - ok - tak powinno być.
A to co robisz w następnych liniach :
Kod:
TWIC_MASTER_ADDR = addr; //adres ukladu + WR, generuje START
while(!(TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm)); //wait for WIF
twic_result = twic_test_result(); //wez status operacji
if (twic_result != TWI_ACK) return 0; //ACK idz dalej, inny zwracaj kod bledu
//nadaj adres do odczytu
TWIC_MASTER_ADDR = addr | 0x01; //adres ukladu I2C + RD
while(!(TWIC_MASTER_STATUS & TWI_MASTER_RIF_bm)); //czekaj na zakonczenie odbioru
data = TWIC_MASTER_DATA; //odczytany bajt
jest prawdopodobnie źle. Zobacz do noty producenta - strona 11
Po wysłaniu adresu komórki pamięci należy wygenerować START podając adres układu slave z ustawionym bitem READ ( addr |0x01 ).
U Ciebie - wysyłasz adres układu z bitem WRITE - generując START i następnie ponownie wysyłasz adres układu ale już z bitem READ - ponownie generując START
I tu się robi (tak mi się wydaje) zamieszanie obecnie...