Перейти к содержанию
    

ATiny88 - проблема с TWI in slave mode

Здраствуйте,

 

Я нашел что 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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Осциллограммы показывают что TWI Tiny88 при введение в sleep моде просто перестает действовать (если SLA уже принять). Так если Tiny88 посылает данные и SDA находится в 0 в момент введения в sleep моде то SDA застрянет в 0 и не будет меняться из за SCL. После окончания sleep SDA линия будет навсегда в 0 и только reset TWI может восстанавить коммуникации.

 

Решение (если можно называть это решение) - если SLA уже принять не идти в sleep.

 

Я ну буду удивлен если проблема находится не только в Tiny88 но и в другие контроллеры is Tiny или AtMega.

Изменено пользователем Student2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как только "Host посылает SLA+R и чип успешно принимает SLA+R в прерывание" - сразу - прямо в прерывании - настраивай SMCR на Idle. Как только на I2C будет STOP - снова настраивай SMCR на PowerDown, так как просыпание в PowerDown возможно только если для TWI передается адрес (и он правильный), по остальным байтам чип не просыпается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я забыл сказать что проблема не в просыпания! Просто модуль перестает работать - как бы SCL отключен от модуля. Но буду попробавать ваши идеи!

 

Спасибо за идеи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Флаг 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению проблема хуже чем вам кажется. Я говорил с гуру в области 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 прерывание. Я сделал все это и проблема ушла навсегда!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно - решение проблемы точно как вы уже писали! Большое спасибо за идею! Я прочитал все что написали и только добавил почему надо так сделать. Всегда лучше знать почему что то происходить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...