luben111 0 14 декабря, 2009 Опубликовано 14 декабря, 2009 · Жалоба Здраствуйте, Я нашел что Tiny88 держится непослушно в TWI slave mode и тянет линия SDA к GND на неопределенное время после просыпание. Сценарий возникновение проблемы такой: 1. Tiny88 в TWI slave моде, имеет адрес SLA и прерывание только на TWI. Чип работает на внутренним осцилляторе 8MHz. 2. Host посылает SLA+R и чип успешно принимает SLA+R в прерывание. Host начинает читать следующий байт. 3. В то время когда чтения байта происходить (после выполнения прерывании для SLA+R) Tiny88 разрешает прерывание из WDT и уходит в deep sleep mode - все модули с исключение TWI отключенный из питания из PRR. Просыпание возможно только из TWI или WDT. 4. Когда последний бит уже послан Tiny88 находиться в deep sleep моде. 5. Здесь происходить что то неладное (я в процесс уточнения что конкретно происходить )- чип просыпается но держит линия SDA к GND. Только установка и сброс TWSTO или забрана/разрешения TWEN может восстановить SDA. Вопрос - кто то встречал уже такое поведение Tiny88? Как можно обманут процессора и избежать задержка SDA? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
luben111 0 14 декабря, 2009 Опубликовано 14 декабря, 2009 (изменено) · Жалоба Осциллограммы показывают что TWI Tiny88 при введение в sleep моде просто перестает действовать (если SLA уже принять). Так если Tiny88 посылает данные и SDA находится в 0 в момент введения в sleep моде то SDA застрянет в 0 и не будет меняться из за SCL. После окончания sleep SDA линия будет навсегда в 0 и только reset TWI может восстанавить коммуникации. Решение (если можно называть это решение) - если SLA уже принять не идти в sleep. Я ну буду удивлен если проблема находится не только в Tiny88 но и в другие контроллеры is Tiny или AtMega. Изменено 14 декабря, 2009 пользователем Student2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niXto 0 14 декабря, 2009 Опубликовано 14 декабря, 2009 · Жалоба Как только "Host посылает SLA+R и чип успешно принимает SLA+R в прерывание" - сразу - прямо в прерывании - настраивай SMCR на Idle. Как только на I2C будет STOP - снова настраивай SMCR на PowerDown, так как просыпание в PowerDown возможно только если для TWI передается адрес (и он правильный), по остальным байтам чип не просыпается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
luben111 0 14 декабря, 2009 Опубликовано 14 декабря, 2009 · Жалоба Я забыл сказать что проблема не в просыпания! Просто модуль перестает работать - как бы SCL отключен от модуля. Но буду попробавать ваши идеи! Спасибо за идеи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niXto 0 14 декабря, 2009 Опубликовано 14 декабря, 2009 · Жалоба Флаг TWINT сбрасывается? Для сброса в него нужно записать 1, аппаратно он НЕ сбрасывается. Also note that clearing this flag starts the operation of the TWI, so all accesses to the TWI Address Register (TWAR), TWI Status Register (TWSR), and TWI Data Register (TWDR) must be complete before clearing this flag TWSR нужно читать после каждого байта!!! 0 на SDA означает "подтверждение приема" (для мастера). После сброса TWINT он переходит в 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
luben111 0 15 декабря, 2009 Опубликовано 15 декабря, 2009 · Жалоба К сожалению проблема хуже чем вам кажется. Я говорил с гуру в области Atmel и теперь все понятно как это происходить и как можно обмануть: 1. Tiny88 может принимать SLA в Power sleep моде но не может принимать и посылать данные в Power sleep моде !! Причина об этом очень долго объяснить но находиться в внутренний state machine. 2. Так если SLA уже принять не надо входить в Power sleep в никаком случае - это может сломать коммуникации. Можно использовать только Idle Sleep 3. Проблема можно увидеть в практически каждом камне Atmel !!!! То что Power Down Sleep не используется так часто и то что обычно в Power Down sleep принимается SLA в 99.9% делает эту проблему трудной для отыскания. Решение - следить за SLA и если он принять идти в Idle sleep. Нужно сделать хорошая state machine в TWI прерывание. Я сделал все это и проблема ушла навсегда! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niXto 0 15 декабря, 2009 Опубликовано 15 декабря, 2009 · Жалоба Ну я же сразу это посоветовал. Вы хоть читаете, что вам пишут? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
luben111 0 15 декабря, 2009 Опубликовано 15 декабря, 2009 · Жалоба Конечно - решение проблемы точно как вы уже писали! Большое спасибо за идею! Я прочитал все что написали и только добавил почему надо так сделать. Всегда лучше знать почему что то происходить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться