Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Tiny2313+USI = I2C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
MTh
Столкнулся с такой проблемой:
Есть Мега 8 с TWI на борту.
Есть Tiny2313 c USI на борту.
Надо заставить их общаться по интерфейсу I2C.

С мегой никаких проблем: TWI завелся, проверен на DS1307 - ACK есть, на данный момент больше ничего не интресует.
Проблема в Тини. USI не хочет отправлять ACK.

Долго рылся в инете, нашел вот это: http://www.avrfreaks.net/index.php?name=PN...t=usi+slave+i2c

Там выложен пример кода и для Меги (Мастер) и для Тини-ведомый (Code for Sharing.rar), и автор утверждает что все работает.

Я адаптировал этот код к CV AVR - ACKов нет...
Путем дебагинга с помощью светодиодов выяснил что тинька не узнает свой адрес. Судя по коду и даташиту - все нормально.

Где я не прав?
AHTOXA
Я делал, всё работало.

Делал по AVR312.

Делал вот такую фигню smile.gif Исходники там же.
MTh
Спасибо.
Есть у меня подозрения о CV....
MTh
Хм...
Скачал WinAVR, твой проект - скомпилировал - не определяется устройство на шине sad.gif
Лучше сказать не отправляется ACK... Но! Устройство свой адрес узнает (у меня светик для отладки стоит), просто не отправляет ACK.

Маленько расскажу что я делаю: тупо в циклап перебираю все адреса от 0 до 7F... Вот на 0х10 загорается светодиод на Тиньке - адрес совпал, но ACK не передается... Опять же - судя по коду все верно...
MTh
Так, все проблема решена....
Я проверял наличие устройств на шине при помощи (ADDRESS>>1)|READ. (Кто с TWI работал поймет)
В Вашем коде вкралась некая неточность:
Если я с девайса попытаюсь читать просто послав адрес, то ничего не найду... А если писать - то пожалуйста - устрйство присутствует.
В вашем устройстве это не критично, но вообщем, неверно... Например EEPROM после такого поиска "глюкнет".

Но в любом случае спасибо за помощь, подтверждение того что USI таки работает и 100% рабочий код, дало мне повод посидеть еще пару вечерков и таки додавить!
AHTOXA
Цитата(MTh @ Jul 14 2008, 21:25) *
Так, все проблема решена....


Аминь 08.gif

Цитата
В Вашем коде вкралась некая неточность:
Если я с девайса попытаюсь читать просто послав адрес, то ничего не найду... А если писать - то пожалуйста - устрйство присутствует.


Странно... Вроде как там есть отправка ACK по приёму своего адреса...
MTh
Цитата(AHTOXA @ Jul 15 2008, 01:52) *
Аминь 08.gif
Странно... Вроде как там есть отправка ACK по приёму своего адреса...

Есть-то есть, только что произойдет если буфер отправки (TX на Slave) будет пуст? У Вас в обработчике OVERFLOW в подпрограмме обработки адреса стоит return... А непосредественная отправка ACK уже после... Другими словами, если я выдаю адрес с командой чтения.... то АСКа не будет - прога до этого места тупо не дойдет.
AHTOXA
Цитата(MTh @ Jul 15 2008, 05:20) *
если я выдаю адрес с командой чтения.... то АСКа не будет - прога до этого места тупо не дойдет.


Да, действительно. И зачем там эта проверка? Надо будет поправить...
Вот и верь после этого аппнотам :-)
MTh
smile.gif Я полторы недели убил.... больше аппноутам не верю...
SasaVitebsk
Да не надо никаким апнотам верить. Есть документы по данной шине - спецификация. Если реализуете протокол конкретной микрухи - то даташит на данную микруху читаем.

В общих чертах - всё просто. Возьмём устройство 1 и 2 (U1,U2). Если U1 выдаёт байт на шину, то U2 подтверждает приём ASKом. И наоборот. При пакетном чтении - если slave не хочет больше читать, то не выдаёт ASK. Master выдаёт стоп и прекращает передачу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.