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

 
 
> Программный 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
 
Start new topic
Ответов
manul78
сообщение Nov 29 2009, 18:11
Сообщение #2


Местный
***

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



Нашел кое чего, возможно будет интересно.

Цитата
Wait a moment
That's almost it for simple I2C communications, but there is one more complication. When the master is reading from the slave, its the slave that places the data on the SDA line, but its the master that controls the clock. What if the slave is not ready to send the data! With devices such as EEPROMs this is not a problem, but when the slave device is actually a microprocessor with other things to do, it can be a problem. The microprocessor on the slave device will need to go to an interrupt routine, save its working registers, find out what address the master wants to read from, get the data and place it in its transmission register. This can take many uS to happen, meanwhile the master is blissfully sending out clock pulses on the SCL line that the slave cannot respond to. The I2C protocol provides a solution to this: the slave is allowed to hold the SCL line low! This is called clock stretching. When the slave gets the read command from the master it holds the clock line low. The microprocessor then gets the requested data, places it in the transmission register and releases the clock line allowing the pull-up resistor to finally pull it high. From the masters point of view, it will issue the first clock pulse of the read by making SCL high and then check to see if it really has gone high. If its still low then its the slave that holding it low and the master should wait until it goes high before continuing. Luckily the hardware I2C ports on most microprocessors will handle this automatically.

Sometimes however, the master I2C is just a collection of subroutines and there are a few implementations out there that completely ignore clock stretching. They work with things like EEPROM's but not with microprocessor slaves that use clock stretching. The result is that erroneous data is read from the slave. Beware!



Англичанин пишет о "подводных камнях" в программной реализации I2C. Смысл в следующем, что примитивные устрой-
ства типа EEPROM работают обычно без проблем, т.к. передача идет непрерывно байт за байтом, а вот с другими I2C
устройствами "засада" в плане, что иногда устройство не может в данный момент передать байт информации и соответ-
ственно если аппаратный I2C может ждать, то программный пролетает и соответственно выдает некорректные данные.
В моём случае когда DS1307 передает данные возможно совпадение по обращению, т.е. попытка считать и передать на
шину например информации из ячейки "минуты", в тот момент когда RTC производит туда запись (инкремент минут).
На данную операцию приоритет выше, соответственно происходит задержка в передаче и как следствие срыв передачи
в программной реализации I2C.

Вывод: 1) Дорабатывать софт, под конкретное устройство.
2) Использовать RTC с аппаратным интерфейсом имеющимся на борту МК, в моём случае SPI (DS1305, DS1306)
места занимают больше и стоят соответственно дороже.

Если не удастся грамотно реализовать пункт 1, придется делать пункт 2... Хорошо что платы в производство не отдал laughing.gif

Цитата(rezident @ Nov 29 2009, 20:47) *
Как-то уже слабо в это верится. cranky.gif В то, что читаете. Потому, что после этого сообщения
Вы должны были выложить исходники реализации "программного I2C". Хотя не исключено, что для вас
, то бишь не решить проблему, а "замазать" ее laughing.gif


Хорошо выкладываю, хотя дело не в ней... хотя возможно она хороша для EEPROM но не годится для других I2C девайсов.

main называется stdiodemo.c , аппаратный I2C в "головном", остальные (UART, LCD) размазаны...
программный модуль I2C называется I2csw.c и еже с ним...

Сообщение отредактировал manul78 - Nov 29 2009, 18:17
Прикрепленные файлы
Прикрепленный файл  TEST_I2C.ZIP ( 125.85 килобайт ) Кол-во скачиваний: 45
 


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


Гуру
******

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



Цитата(manul78 @ Nov 29 2009, 23:11) *
Вывод: 1) Дорабатывать софт, под конкретное устройство.
Да не под конкретное устройство, а в соответствии со спецификацией I2C!!! Спецификацией, которую вы упорно не желаете изучить, а игнорируете. В противном случае вы давно бы переделали функцию там, где после установки SCL (и SDA) в HI вы почему-то не делаете проверку состояния, а действительно ли линия SCL установилась в HI? Ведь именно в такие моменты RTC может подтормаживать обмен "растягивая" низкий уровень SCL. Причем замечу, что "растягивая" в полном соответствии со спецификацией I2C!
P.S. хотя, посмотрев в даташит DS1307, признаю, что я немного преувеличил. SCL у нее чисто входной сигнал и растягивать SCL она не может. Но для реализации программного интерфейса I2C все, мною написанное, верно. Входная и выходная логика автомата состояний I2C должны быть связаны именно состояниями шины, а не состояниями битов регистров периферии GPIO.
Go to the top of the page
 
+Quote Post
manul78
сообщение Nov 30 2009, 00:23
Сообщение #4


Местный
***

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



Цитата(rezident @ Nov 29 2009, 21:28) *
P.S. хотя, посмотрев в даташит DS1307, признаю, что я немного преувеличил. SCL у нее чисто входной сигнал и растягивать SCL она не может. Но для реализации программного интерфейса I2C все, мною написанное, верно. Входная и выходная логика автомата состояний I2C должны быть связаны именно состояниями шины, а не состояниями битов регистров периферии GPIO.


Значит получается что следующая информация конкретно на DS1307 не распространяется ?

Цитата
Скорость обмена по шине TWI задается ведущим, т.к. именно он генерирует тактовые импульсы. Однако, если
ведомый не может принимать данные с такой скоростью или ему нужно время на обработку данных между приемом пакетов,
он может увеличить паузу между тактовыми импульсами, удерживая на линии SCL сигнал НИЗКОГО уровня


Т.е. Вы хотите сказать что на линии SCL в DS1307 нет ключа "на землю" для реализации данной функции ?

Кстати, даже наличие "гармошки" не избавляет от проблем, а только прибавляет их. Многочисленные переключения с входа
на выход и обратно к хорошему не приведут как я думаю, хотя не пробовал ещё... Была мысль задействовать еще пару
портов чисто на вход как зонды состояния шины, подключив их параллельно. Гораздо меньше переключений и соответст-
венно отсутствие помех на шине. Т.е. 2 порта находящихся по мере надобности либо в Z состоянии (DDR -вход, PORT-1) и
лог 0 (DDR - выход, PORT - 0). Имитация I2C . И 2 порта исключительно на чтение (DDR -вход, PORT-1) , возможно
получится... Ешё грешу на слишком быстрые нарастания фронтов, возможно и из за этого обрывы передач. С фронтами
что делать не знаю. Емкость линии попробовать увеличить ?

Ежели не получится придется перейти на SPI и "замазать" проблему... smile.gif Всё равно всем спасибо за поддержку !


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


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(manul78 @ Nov 30 2009, 02:23) *
Многочисленные переключения с входа
на выход и обратно к хорошему не приведут как я думаю, хотя не пробовал ещё...
Уууу... А ведь rezident в самом первом ответе вам сказал, что делать надо именно так. Если вы упорно выставляете на шину единицу выходом контроллера, то можете до посинения шаманить, борясь с чудесатыми граблями, которые сами себе любовно разложили. Вот вам для размышлений: http://electronix.ru/forum/index.php?showtopic=29602


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- manul78   Программный I2C   Nov 14 2009, 02:02
- - rezident   В оригинальной спецификации I2C от Philips есть ре...   Nov 14 2009, 03:31
- - defunct   Цитата(manul78 @ Nov 14 2009, 04:02) Кто ...   Nov 14 2009, 03:41
- - manul78   Спасибо всем за информацию и советы. Не буду ут...   Nov 19 2009, 23:39
|- - defunct   Цитата(manul78 @ Nov 20 2009, 01:39) Кста...   Nov 20 2009, 00:32
|- - sonycman   Цитата(defunct @ Nov 20 2009, 04:32) А я ...   Nov 29 2009, 10:54
- - manul78   "Чьёрт побьери..." (с) "Бриллиантов...   Nov 29 2009, 09:46
- - sonycman   Цитата(rezident @ Nov 29 2009, 16:33) Апп...   Nov 29 2009, 14:36
- - rezident   Цитата(manul78 @ Nov 29 2009, 21:07) Не н...   Nov 29 2009, 17:47
|- - rezident   Цитата(manul78 @ Nov 30 2009, 05:23) Знач...   Nov 30 2009, 17:31
- - manul78   Исправил библиотеку в соответствии со стандартом I...   Dec 9 2009, 19:28
- - Verifi   Цитата(manul78 @ Dec 9 2009, 22:28) На ст...   Dec 10 2009, 06:38
- - manul78   Цитата(Verifi @ Dec 10 2009, 09:38) А есл...   Dec 10 2009, 15:08
- - Verifi   Цитата(manul78 @ Dec 10 2009, 18:08) А по...   Dec 11 2009, 06:18
- - Сергей Борщ   Цитата(Verifi @ Dec 11 2009, 08:18) зачем...   Dec 11 2009, 11:06


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

 


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


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