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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Программный I2C, Непонятный и интересный глюк DS1307
manul78
сообщение Nov 14 2009, 02:02
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Начну по порядку.

Мне понадобилось подключить RTC DS1307 к AVR микроконтроллеру не имеющего TWI модуля. У меня есть самодельная
универсальная отладочная плата на ATmega16. На ней я "откатываю" софт. На борту имеется RS-232, LCD дисплей, и со-
ответственно RTC DS1307. На данной плате я решил не использовать TWI, а занятся "ногодрыганием"...
Скачал готовую рабочую библиотеку, слегка подправил её и вот что получается:

Читаю посредством дерганья ногами раз на раз не приходится, то всё хорошо, то лобуда полная...
Читаю посредством TWI все ОК. Ноги использую те-же самые.
Подключил JTAG более менее выставил задержки, процент "брака" уменьшился но не без него. Заметил, что после сброса
МК часы вообще перестают вести себя адекватно, но аппаратный TWI читает всё четко. Появилась мысль, что при сбросе
МК дергает порты, и DS1307 воспринимает это как СТАРТ (RTC подключен к батарейке, соответственно "не спит" и не сбра-
сывется ) и соответственно впадает в своеобразный ступор, т.е. ждет дальнейших сигналов от хоста. Изменил программу,
сделал возможность по одной команде от терминала читает через TWI , по другой "ногодрыганием". Думал используя аппа-
ратный буду выводить DS1307 из ступора после сброса... Ничего подобного, аппаратно читает отлично - программно полную
чушь... решил еще задействовать ЛСД для отслеживания потока... и всё заработало, но не потому, что я там что-то отсле-
дил, а потому, что ЛСД дисплей начал кушать ток... sad.gif

Вот теперь получается такая петрушка: При подключенном ЛСД и JTAG-е всё работает как без проблем. Никаких глюков.
Отключаю либо ЛСД либо JTAG - всё - пошла лобуда. Напряжение чёткое 5 В . Блок питания 4 Амперный, им чай кипят-
ить можно... Аппаратный TWI работает во всех случаях без проблем, читает всё как надо.

Кто сталкивался с подобными глюками подскажите пожалуйста где засада. Еще просьба, возможно имеется более по-
дробное описание DS1307, т.к. стандартный даташит вообще "не о чем". Меня интересуют таймы ACK и пр. не описанные,
а так-же интересно поведение микросхемы при прерванных передачах и пр. конфликтах на шине, и соответственно
выход из данных состояний.


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 14 2009, 03:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В оригинальной спецификации I2C от Philips есть рекомендация, которая гласит о том, что после подачи питания нужно поCLOCKать линией SCL. Не менее 9-и тактовых импульсов без старт- или стоп-условий. Это нужно как раз для того, чтобы вывести в нормальный режим "впавшую в ступор" логику I2C-slave. Второй типовой ошибкой программной реализации I2C является управление лог.1 на выходах, подключенных к шине, вместо того, чтобы использовать open-drain или Z-состояние пинов GPIO.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 14 2009, 03:41
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(manul78 @ Nov 14 2009, 04:02) *
Кто сталкивался с подобными глюками подскажите пожалуйста где засада.

Сталкивался с разными особенностями работы этой м/c, но то о чем Вы пишете слышу в первый раз.
DS1307 очень устойчиво работает на скоростях 100kHz и ниже, при соблюдении Vbat = 3..3.3V, Vcc >= 4.5V.
На скоростях выше 100kHz - она принципиально не работает!
Вероятно баг в софтовой библиотеке которую вы взяли. Баг с таймингами.
Когда подключаете JTAG и LCD что-то где-то подтормаживает и выравнивает тайминги.

БП используете импульсный или линейный? Если импульсный возможно имеют место кратковременные провалы Vcc DS'ки ниже 4.4V, которые приводят к отрубанию ее i2c интерфейса даже посреди активной транзакции.
Go to the top of the page
 
+Quote Post
manul78
сообщение Nov 19 2009, 23:39
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Спасибо всем за информацию и советы.

Не буду утомлять подробностями, но помучился конкретно. Пробовал всё, и программно и с подтягивающими резисторами
игрался, рассчитывал по формуле RPU = tr (Rise time) / Cb (Capacitance load) - не помогло... Спаял еще одну схему RTC на
отдельной плате и с ней всё заработало. Что было, смешно говорить... кривая "земля"... выровнял потенциалы и всё. Ради
прикола прогнал все свои программные варианты, и как по волшебству все заработали... вот-так. Кстати надо отдать дол-
жное аппаратному TWI - работал безупречно даже с подтягивающими резисторами в 47кОм и 750 Ом... Железо laughing.gif

Теперь осталось пройти "Антарктиду" и "Сахару" а так-же "болтанку" при -25 и при +50... Если кому интересно, могу
рассказать результаты данных путешествий...


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 20 2009, 00:32
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(manul78 @ Nov 20 2009, 01:39) *
Кстати надо отдать должное аппаратному TWI - работал безупречно даже с подтягивающими резисторами в 47кОм и 750 Ом... Железо laughing.gif

А я был поражен когда понял, что аппаратное TWI у меня работает __без__ подтягивающих резисторов вообще! На одной шине мега мастре и 3 меги слейва, DS'ка и AT24 (400kHz). Все работало прекрасно, потом совсем случайно заметил, что а pull-up'ов то нет...
Go to the top of the page
 
+Quote Post
manul78
сообщение Nov 29 2009, 09:46
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



"Чьёрт побьери..." (с) "Бриллиантовая рука"

Опять не работает...
Стоило увеличит линию связи до 20 см. и всё... "кирдык". Даже на старт не реагирует... sad.gif (аппаратный TWI работает)
Сдаётся мне это емкостные дела. т.к. по даташитам емкость каждого канала I2C около 10-20 пФ, то у портов Меги она
как мне кажется намного выше + емкость самой линии... эх осциллоскопа цифрового нет ! sad.gif

Кто нибудь знает ёмкость портов у АТмег ? Ещё мысль посетила, что в процессе "ногодрыгания" слишком быстро проис-
ходит нарастание и падение фронтов, что вкупе с длинной линией не есть гут.

Смотрел функциональную схему аппаратного TWI, на входах-выходах там стоят схемы ограничения скорости нарастания и
помехоподавляющие фильтры. Как реализована схемотехника не известно. Посещает мысль использовать четыре ноги МК
вместо двух. Первая пара будет работать на состояние линий, а вторая подключенная параллельно только читать... Что
скажете ? Бредовая идея ?


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 29 2009, 10:54
Сообщение #7


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(defunct @ Nov 20 2009, 04:32) *
А я был поражен когда понял, что аппаратное TWI у меня работает __без__ подтягивающих резисторов вообще! На одной шине мега мастре и 3 меги слейва, DS'ка и AT24 (400kHz). Все работало прекрасно, потом совсем случайно заметил, что а pull-up'ов то нет...

Значит, пуллапы где то были.
На 400 кГц и с нормальными пуллапами на 2 кОм нарастающий фронт весьма поганый, не представляю, что там могло быть при подтяжке большим сопротивлением, а главное - какая при этом была реальная скорость интерфейса smile.gif
Go to the top of the page
 
+Quote Post
manul78
сообщение Nov 29 2009, 11:22
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Цитата(blackfin @ Nov 29 2009, 13:02) *
I2C у него не работает.. biggrin.gif


об I2C и покруче Вас люди зубы ломали... Связать аппаратный TWI Меги и DS1307 любой дебил за один рабочий час сможет.
А вот настроить программный I2C при плавающем питании от 3.3 до 5 и рабочих температурах от -25 до +40 совсем другой
разговор..., так шта тусуйтесь в "курилке" уважаемый, если по делу сказать нечего...

P.S. Кстати Cyfral со своими дверями и домофонами используя AVR и I-Button (копеечные технологии) зарабатывают в
тысячу раз больше, чем Вы со своими blackfin-ами...


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 29 2009, 11:37
Сообщение #9


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(manul78 @ Nov 29 2009, 15:22) *
Связать аппаратный TWI Меги и DS1307 любой дебил за один рабочий час сможет.
А вот настроить программный I2C...

уже у "любого дебила" сил не хватает? biggrin.gif

Вооружитесь осциллографом и спецификацией на I2C и увидите воочию все ваши проблемы.

Цитата(rezident @ Nov 14 2009, 07:31) *
В оригинальной спецификации I2C от Philips есть рекомендация, которая гласит о том, что после подачи питания нужно поCLOCKать линией SCL. Не менее 9-и тактовых импульсов без старт- или стоп-условий.

А выполняют ли эту рекомендацию аппаратные контроллеры?
К примеру, при сопряжении STM32 и DS3231 это пришлось организовавать софтом, иначе иногда DS подвисала...
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 29 2009, 12:33
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(sonycman @ Nov 29 2009, 16:37) *
А выполняют ли эту рекомендацию аппаратные контроллеры?
К примеру, при сопряжении STM32 и DS3231 это пришлось организовавать софтом, иначе иногда DS подвисала...
Аппаратно? Самостоятельно? 07.gif Конечно нет! Модуль I2C (TWI) в МК нужно сначала проинициализировать, чтобы он заработал в режиме мастера. И вообще он может не использоваться в проекте или использоваться только как слейв. С какого тогда перепуга модуль I2C (TWI) должен сам какие-то импульсы по SCL генерировать?
Go to the top of the page
 
+Quote Post
manul78
сообщение Nov 29 2009, 13:22
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Цитата(sonycman @ Nov 29 2009, 14:37) *
Вооружитесь осциллографом и спецификацией на I2C и увидите воочию все ваши проблемы.


Был-бы у меня сейчас под рукой цифровой осцилоскоп, стал-бы я вам тупые вопросы задавать...

Цитата
А выполняют ли эту рекомендацию аппаратные контроллеры?
К примеру, при сопряжении STM32 и DS3231 это пришлось организовавать софтом, иначе иногда DS подвисала...


Выполняют или нет не знаю. Я лично ставлю число попыток доступа к шине и посылаю в цикле START затем SLA+R до
получения ACK. Надо отметить не всегда отзывается с первого раза, даже если на шине всего одно устройство.


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 29 2009, 14:29
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(manul78 @ Nov 29 2009, 18:22) *
Выполняют или нет не знаю. Я лично ставлю число попыток доступа к шине и посылаю в цикле START затем SLA+R до
получения ACK. Надо отметить не всегда отзывается с первого раза, даже если на шине всего одно устройство.
Зачем, спрашивается, задавать вопросы, если ответы вы не читаете? Я же вроде понятно написал и дал ссылку на спецификацию. После подачи питания нужно дать ≥9 импульсов по SCL без старт-условий!!!!
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 29 2009, 14:36
Сообщение #13


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(rezident @ Nov 29 2009, 16:33) *
Аппаратно? Самостоятельно? 07.gif Конечно нет! Модуль I2C (TWI) в МК нужно сначала проинициализировать, чтобы он заработал в режиме мастера. И вообще он может не использоваться в проекте или использоваться только как слейв. С какого тогда перепуга модуль I2C (TWI) должен сам какие-то импульсы по SCL генерировать?

Ваши слова:
Цитата(rezident @ Nov 14 2009, 07:31) *
В оригинальной спецификации I2C от Philips есть рекомендация, которая гласит о том, что после подачи питания нужно поCLOCKать линией SCL. Не менее 9-и тактовых импульсов без старт- или стоп-условий. Это нужно как раз для того, чтобы вывести в нормальный режим "впавшую в ступор" логику I2C-slave. Второй типовой ошибкой программной реализации I2C...

навели на мысль, что эти рекомендации относятся только к программной реализации I2C rolleyes.gif
Соответственно, в случае аппаратной они должны выполняться аппаратурой автоматически.

Вообще, подвисонов логики слэйвов в моей небольшой любительской практике не встречалось.
Кроме чипа DS3231. Но у него этот момент оговорён в даташите, и, имхо, является следствием бесперебойного функционирования часов от батареи, в отличие от управляющего контроллера.

Цитата(manul78 @ Nov 29 2009, 17:22) *
Я лично ставлю число попыток доступа к шине и посылаю в цикле START затем SLA+R до
получения ACK. Надо отметить не всегда отзывается с первого раза, даже если на шине всего одно устройство.

Я тоже каждую транзакцию выполняю, в случае ошибок, несколько раз.
Однако в тепличных комнатных условиях, при верно подобранных подтяг. резисторах это лишнее.
Ошибок и повторов, как правило, нет.
Это всё относится к аппаратному интерфейсу.
Go to the top of the page
 
+Quote Post
manul78
сообщение Nov 29 2009, 16:07
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Цитата(rezident @ Nov 29 2009, 17:29) *
Зачем, спрашивается, задавать вопросы, если ответы вы не читаете? Я же вроде понятно написал и дал ссылку на спецификацию. После подачи питания нужно дать ≥9 импульсов по SCL без старт-условий!!!!


Не нервничайте. Ответы я читаю. В данном случае я обращался к sonycman. Речь шла об аппаратном интерфейсе. smile.gif

Теперь по делу: Две совершенно одинаковых RTC схемы на основе DS1307. Единственную между ними разницу я нашел это
buckapp батарейки одна Panasonic другая Maxwell... smile.gif и шлейфы подключения 1) 3 см 2) 20 см

1) Работает исправно, но если читать всю память (64 байта) то иногда происходит срыв передачи в совершенно случайном
порядке. Корректных передач около 80%. Аппаратный читает всё четко - 100%

2) Не читает вообще. Не реагирует даже на START, т.к. уже после первой транзакции SLA+R нет ответа ACK.
Аппаратный читает всё четко - 100%. Грешил на повышенную емкость линии, повышал подтягивающие резисторы
от стандартных 4К7 до 15К - результат ноль. Аппаратный 100%. Начал грешить на недостаточный ток (3мА по специфи-
кации) и поехал в другую сторону - плавно понижал пулаппы до 1.5К - результат ноль. Аппаратный 100%.
Грешу на нарастание и спад фронтов. Осцилограф у меня есть только аналоговый, завтра попробую написать цикличес-
кие подпрограммы и для TWI и для программного I2C дабы сравнить фронты и пр. характеристики.


P.S. Неделю назад Harbinger мне поведал аналогичную историю как они замучались с программным I2C и в конце концов
плюнули на всё это и поставили отдельный аппаратный I2C контроллер. Т.е. он дал понять, что программный I2C
капризное и ненадежное решение годное только для "тепличных условий". Прошу всех столкнувшихся с данной
проблемой откликнутся, дабы я не бился лбом об стену. Возможно проще и надежней окажется изменение схемо-
теники устройства, т.е. переход на другую RTC, например с параллелельным или SPI интерфейсом.


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 29 2009, 17:47
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(manul78 @ Nov 29 2009, 21:07) *
Не нервничайте. Ответы я читаю. В данном случае я обращался к sonycman. Речь шла об аппаратном интерфейсе. smile.gif
Как-то уже слабо в это верится. cranky.gif В то, что читаете. Потому, что после этого сообщения
Цитата(defunct @ Nov 14 2009, 08:41) *
Вероятно баг в софтовой библиотеке которую вы взяли. Баг с таймингами.
Когда подключаете JTAG и LCD что-то где-то подтормаживает и выравнивает тайминги.
Вы должны были выложить исходники реализации "программного I2C". Хотя не исключено, что для вас
Цитата(manul78 @ Nov 29 2009, 21:07) *
Возможно проще и надежней окажется изменение схемо-
теники устройства
, т.е. переход на другую RTC, например с параллелельным или SPI интерфейсом.
, то бишь не решить проблему, а "замазать" ее laughing.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 00:49
Рейтинг@Mail.ru


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