Цитата:
Из первых неприятностей с DS1337
Уфф... разобрался
Короче, в чем суть:
Официальная спецификация протокола I2C (v.2.1 от 2000г.) никак не регламентирует "способноть" ведомых устройств (Slave'ов) подвешивать линию SDA на шине.
Что есть очень прискорбно, т.к. производители Slave девайсов, слепо следуя указанной спецификаии, не удосужились организовать аппаратную обработку подобной ситуации!
По крайней мере у DS1337 такой обработки нет.
Хотя, немного задумавшись, прихожу к выводу, что это и не нужно. Мастер должен уметь сбрасывать шину самостоятельно, но в протоколе это не предусмотрено.Напомню, в чем дело:
Дабы не расписывать здесь работу протокола I2C, буду выражаться фигурально
Мастер принимает данные от Слейва, в этот момент по какой-то причине происходит рестрт Мастера, Слейв в этот момент передавал 0 по SDA ожидая очередной импульс тактового сигнала (SCL), но не дождался - Мастер "упал"...
Т.к. Слейв, в данном случае RTC, имеет резервное питание, он беззаботно продолжает удерживать SDA на низком уровне, ожидая строб на SCL.
Мастер, "поднявшись", инициализирует свой порт MSSP и пытается создать условие START, но нарывается на конфликт шины (SDA = 0, SCL = 1) и уходит в режим ожидания...
Спецификация протокола в принципе регламентирует "разруливание" этих конфликтов (Arbitration), но только если конфликт возник между двумя Мастерами, а это не наш случай
Что делать?
Инет вразумительного ответа не дал.
Пришлось использовать научный метод - при помощи молотка и такой-то.... ну то есть метод достаточно топорный, но работает
Просто до инициализации порта MSSP, проверяем состояние вывода, который сидит на SDA, и если он равен 0, "стучим" 8 раз 1-0 в вывод, который сидит на SCL.
В процессе "стука" линия SDA и переходит в нужнй нам высокий уровень. После этого инициализируем порт MSSP и начинаем работу с ним.
Почму "стучать" 8 раз? Это совсем не прикол какой-то!
Как я говорил, когда произошел сбой, Слейв передавал байт данных в шину, т.е. 8 бит. И пока он не "выговорится", т.е. пока не отдаст в шину все 8 бит, линию SDA не отпустит, гад!
Вот мы и даем ему возможность "выговорится" после чего он (естественно не получив бит подтверждения ACK) отпускает SDA.
Я тут не расписывал нюансы управления портами для организации "стука" (сброса шины), если у кого трудности с этим - пишите.
Как-то так...