TWI Slave на ATtiny25

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

TWI Slave на ATtiny25

Сообщение Scorpio » 27 май 2010, 18:20

Понадобилось мне управлять от 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.
Все это реализовано в тестовой программке с подробными комментариями, для наглядности сделанной одним файлом.
TINY25-I2C.c
main
(9.88 КиБ) Скачиваний: 1360
TINY25-I2C.zip
Проект под CAVR
(56.97 КиБ) Скачиваний: 0
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: TWI Slave на ATtiny25

Сообщение avr123.nm.ru » 27 май 2010, 21:25

Полезные проект, спасибо ! :good:
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: TWI Slave на ATtiny25

Сообщение Scorpio » 27 май 2010, 22:48

Всегда пожалуйста, Учитель.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19