alexf 0 23 августа, 2018 Опубликовано 23 августа, 2018 · Жалоба Искал я чип для очень простой задачи и обнаружил новые ATTiny серий 0 и 1. Вроде ATTiny214 как раз мне подойдет. Там есть аппаратная поддержка I2C, но в даташите больше не публикуют примеров использования. А драйвер I2C на сайте весьма громозкий - поддерживает multiple masters, lost arbitration и т.д. что мне ни к чему. Один мастер, один слейв. Кто нибуть видел примеры очень простого драйвера I2C для этих чипов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexf 0 24 августа, 2018 Опубликовано 24 августа, 2018 · Жалоба Попробовал совсем простой код. // 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 все равно перезапустит. Господа гуру: какие подводные камни ожидать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться