Понадобилось мне управлять от LEGO NXT миниатюрным сервомоторчиком по I2C. Решил приспособить валяющийся без дела МК ATtiny25 под универсальный адаптер. Из 6-ти имеющихся у него ног-портов, 2 используются на I2C, а оставшиеся 4 в зависимости от применения.
Осталось заставить МК общаться с NXT в качестве ведомого устройства. Готовых решений под CAVR в сети не нашел, порылся в разных источниках, нашел пример под IAR, но с ним связь ни хрена не работала. В конце концов разобрался сам. Так что делюсь своими изысканиями.
Сам протокол I2C (он же TWI) подробно описан в различной литературе, в том числе и Википедии.
CAVR имеет встроенную библиотеку I2C.h, с помощью которой можно заставить любые 2 ноги МК работать в качестве Master. Slave почему-то такой библиотеки не удостоился. Кроме того, «меги» имеют полную аппаратную поддержку TWI . Более хилые «тини» такой радости лишены, но возможности встроенного в них USI интерфейса, частично упрощают организацию обмена между TWI устройствами.
Что может ATtiny USI в режиме TWI Slave, при соответствующей настройке:
- Определить состояние «старт», когда Master захватывает шину для передачи данных, и сформировать аппаратное прерывание;
- По тактовым импульсам SCL, сдвигать 8-битный регистр данных до момента переполнения 4х-разрядного счетчика, и выдавать соответствующий бит данных в SDA (если линия настроена на выход), либо, наоборот, считывать состояние SDA (если линия настроена на вход). При переполнении счетчика также можно включить прерывание.
- Определять состояние «стоп», когда Master отпускает шину. Прерывание при этом не предусмотрено.
Что остается сделать вручную:
- Определить адресс запрашиваемого Slave устройства и сравнить его со своим индетификатором. Если предполагается, что в сети только один ведомый, то этого можно и не делать.
- Определить направление передачи и настроить соответствующую логику работы на прием или передачу.
- Сформировать или считать сигнал подтверждения (ACK) после приема или передачи каждого байта, остановить прием при потере подтверждения от ведущего.
- Ну и, естественно, вовремя работать с регистром данных USI.
Все это реализовано в тестовой программке с подробными комментариями, для наглядности сделанной одним файлом.