Tak. Po zmodyfikowaniu:
Kod:
unsigned char mem_read_reg(unsigned char addr, uint16_t reg)
{
uint8_t data;
//nadaj adres slave + nr rejestru
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
TWIC_MASTER_DATA = (reg & 0xFF00) >> 8; // /256 adres rejestru
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
TWIC_MASTER_DATA = reg & 0x00FF; //adres rejestru
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
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
// send NACK and STOP
TWIC_MASTER_CTRLC = TWI_MASTER_ACKACT_bm|TWI_MASTER_CMD_STOP_gc;
// twic_result = TWI_OK; //poprawna operacja
return data;
}
Coraz bardziej podejrzewam 24C512 - nie mam, muszę zakupić...
Rozebrałem, na pamięci napis ATMLH440. Szukam info...