реклама на сайте
подробности

 
 
> ATiny88 - проблема с TWI in slave mode
Student2
сообщение Dec 14 2009, 06:26
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



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

Я нашел что 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?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
Student2
сообщение Dec 14 2009, 13:43
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



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

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

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

Сообщение отредактировал Student2 - Dec 14 2009, 13:47
Go to the top of the page
 
+Quote Post
niXto
сообщение Dec 14 2009, 15:01
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 24-06-09
Из: Беларусь
Пользователь №: 50 607



Как только "Host посылает SLA+R и чип успешно принимает SLA+R в прерывание" - сразу - прямо в прерывании - настраивай SMCR на Idle. Как только на I2C будет STOP - снова настраивай SMCR на PowerDown, так как просыпание в PowerDown возможно только если для TWI передается адрес (и он правильный), по остальным байтам чип не просыпается.
Go to the top of the page
 
+Quote Post
Student2
сообщение Dec 14 2009, 15:34
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



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

Спасибо за идеи!
Go to the top of the page
 
+Quote Post
niXto
сообщение Dec 14 2009, 19:36
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 24-06-09
Из: Беларусь
Пользователь №: 50 607



Флаг 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
Go to the top of the page
 
+Quote Post
Student2
сообщение Dec 15 2009, 04:40
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



К сожалению проблема хуже чем вам кажется. Я говорил с гуру в области 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 прерывание. Я сделал все это и проблема ушла навсегда!
Go to the top of the page
 
+Quote Post
niXto
сообщение Dec 15 2009, 05:57
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 24-06-09
Из: Беларусь
Пользователь №: 50 607



Ну я же сразу это посоветовал. Вы хоть читаете, что вам пишут?
Go to the top of the page
 
+Quote Post
Student2
сообщение Dec 15 2009, 07:40
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Конечно - решение проблемы точно как вы уже писали! Большое спасибо за идею! Я прочитал все что написали и только добавил почему надо так сделать. Всегда лучше знать почему что то происходить.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 22:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016