Попробовал совсем простой код.
CODE
// write addr to start write op
TWI0.MADDR = slave_adr << 1;
while((TWI0_MSTATUS & TWI_WIF_bm) == 0); // wait to write done
TWI0.MDATA = 0; // addr 0
while((TWI0_MSTATUS & TWI_WIF_bm) == 0); // wait to write done
TWI0.MCTRLB |= TWI_ACKACT_NACK_gc; //?
TWI0.MADDR = slave_adr << 1 | 1; // addr to read
while((TWI0_MSTATUS & TWI_RIF_bm) == 0); // wait for read done
data = TWI0.MDATA;
TWI0.MCTRLB |= TWI_ACKACT_NACK_gc;
TWI0.MCTRLB |= TWI_MCMD_STOP_gc;
// end
TWI0.MSTATUS |= (TWI_RIF_bm | TWI_WIF_bm);
TWI0.MCTRLA &= ~(TWI_RIEN_bm | TWI_WIEN_bm);
Даже работает. Понятно что бесконечных циклов делать не следует, но вроде флаги WIF и RIF всегда устанавливаются. При одном клиенте на линии вроде бы ошибок ждать не приходится. А если совсем зависнет, Watchdog все равно перезапустит. Господа гуру: какие подводные камни ожидать?