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...