Вы находитесь на странице: 1из 14

1/2.

"Бомбардировка" (напалм) района "дислокации" сигнала АСК


(или "хроника пикирующего бомбардировщика").

Общее замечание: имеется три названия рассматриваемой "связки": "Master - Slave", "Ведущий
- ведомый", "Мастер - помощник".
К английскому определению "Master - Slave", лично у меня, душа в упор не лежит
("русского духа" нет и "Русью совсем не пахнет"), а посему, я его безжалостно "бракую"
(даже и "на порог не пущу").
Определение "Ведущий - ведомый", хотя и универсально, но заставляет напрягаться,
так как корни обеих слов одинаковы.
А вот "Мастер - помощник" - в самый раз (и "Русью пахнет". Придумано русским). Это
определение, преимущественно, применял и буду применять.
Итак, имеется 4 отдельных "кирпича":

1. Старт-стопные условия.
2. Режимный байт.
3. Два адресных байта (с учетом объема памяти и порядка старшинства байтов).
4. Байт данных, который нужно записать в выбранную ячейку внешней памяти.
Так как интерфейс последовательный, то сразу же возникает вопрос о порядке
следования. Особо мудрить тут не с чем, так как, при таком "раскладе" и по здравому
разумению, ничего более приемлемого, чем указанный ниже порядк следования,
придумать просто нельзя.

1. До момента обращения "мастера" к "помощнику", "помощник" находится в ждущем режиме


(на линиях SCL и SDA, "мастер" заранее выставил единицы).
2. "Мастер" формирует старт-условие, и "помощник" "просыпается".
3. "Мастер" выдает в линию SDA режимный байт (а по линии SCL - такт под него).
После этого, "помощник соображает", что, во-первых, "мастер домогается" его
функциональности (1010), во-вторых, он "домогается" именно той микросхемы,
адресный код которой (000) присвоен "помощнику" (здесь и далее речь идет только об
одной м/схеме 24С64А, у которой выводы A2,1,0 распаяны на корпус), в-третьих,
"помощник понимает", что "мастер", в дальнейшем, вознамерен произвести запись
(R/W=0) в ячейку его памяти (напоминаю, что речь, пока, идет только о записи одного
байта данных).
Соответственно, "помощник", внутри своей "начинки", "предпринимает действия"
(конструктору это знать не обязательно), необходимые для того чтобы, в будущем,
"рабски" выполнить и эти, и следующие "приказания мастера".
4. После завершения формирования "мастером" режимного байта, он перестраивается на
работу "на вход" и анализирует состояние линии SDA на предмет наличия на ней
сигнала АСК, который (0), в случае успешной обработки режимного байта, выдает в
линию SDA "помощник".
Сейчас и далее предполагаю, что байты принимаются "помощником" без ошибок
(АСК=0).
5. После обнаружения на линии SDA нуля сигнала АСК, "мастер" перестраивается на
работу "на выход" и выдает в линию SDA старший байт адреса (а по линии SCL - такт
под него), с байтами №№7,6,5=0 (для 8-килобайтной памяти 24С64А).
6. После завершения формирования "мастером" старшего байта адреса, он

1
перестраивается на работу "на вход" и анализирует состояние линии SDA на предмет
наличия на ней сигнала АСК, который (0), в случае успешной обработки старшего байта
адреса, выдает в линию SDA "помощник".
7. После обнаружения на линии SDA нуля сигнала АСК, "мастер" перестраивается на
работу "на выход" и выдает в линию SDA "полноценный", младший байт адреса (а по
линии SCL - такт под него).
8. После завершения формирования "мастером" младшего байта адреса, он
перестраивается на работу "на вход" и анализирует состояние линии SDA на предмет
наличия на ней сигнала АСК, который (0), в случае успешной обработки младшего
байта адреса, выдает в линию SDA "помощник".
9. После обнаружения на линии SDA нуля сигнала АСК, "мастер" перестраивается на
работу "на выход" и выдает в линию SDA байт данных, который нужно записать в
выбранную ранее (по адресному запросу) ячейку памяти "помощника" (кульминация
или то, ради чего затеян весь этот "сыр-бор").
10. После завершения формирования "мастером" байта данных, он перестраивается на
работу "на вход" и анализирует состояние линии SDA на предмет наличия на ней
сигнала АСК, который (0), в случае успешной записи байта данных, выдает в линию
SDA "помощник".
11. После обнаружения на линии SDA нуля сигнала АСК, и в случае записи только
одного байта данных, "мастер" перестраивается на работу "на выход" и формирует стоп-
условие, после чего "помощник" "засыпает", то есть, уходит в ждущий режим.
В конечном итоге, на линиях SCL и SDA, фиксируются единицы, и они будут на них
зафиксированы на все то время, пока "мастер" будет заниматься "делами", не имеющими
прямого отношения к "помощнику".

Общий итог: основное "рабочее" действие (запись байта данных в ячейку памяти "помощника")
происходит в самом конце, а в начале, должны быть четко соблюдены все
"формальности", связанные с подготовкой к этому "рабочему" действию.
Вот что получилось:

На этой картинке показано только то, что "творится" на линии данных (SDA).
Только вот не понятно, что "творится" на линии такта (SCL) и как все это "хозяйство"
работает в "куче"?
Это горе - не беда. Вот Вам еще одна, более "развернутая", картинка:

2
На рис. 2 обе эпюры "замасштабированы" относительно друг друга, и поэтому можно составить
себе достаточно ясное представление о фазовых "привязках".
В своем принципе, они ровным счетом такие же, как и фазовые "привязки", показанные
в 1-м подразделе.
Обратите внимание на надпись "Обязательные условия".
Это именно то, о чем говорилось в 1-м подразделе (еще раз напоминаю "важняк").
Все остальные интервалы времени - следствие выполнения этих обязательных условий,
с учетом дополнительной задержки тактовой последовательности импульсов, на время
Ттакт/2, после старта.
По поводу последнего: если после старта и задержки Тз, дополнительно не задержать
импульсную последовательность такта, то 1-й строб будет сформирован не во время
гарантированно надежной установки на линии SDA бита №7, а до начала
формирования бита №7, то есть, на "участке прохождения" "технологического" бита
(всегда 0), не несущего никакой "смысловой нагрузки", что есть ошибка.
Еще раз напоминаю, что "технологический" бит на линии данных нужен по той простой
причине, что если уровень на линии данных сменился с 1 на 0 (старт), то, прежде чем
формировать единицу бита №7 режимного байта, этот 0 должен быть на какое-то время
зафиксирован ("постоять на линии" относительно старт-условия).
В данном случае, когда время формирования "технологического" бита принято равным
периоду такта (а можно сделать и кратной периоду такта), по указанной выше причине,
дополнительная задержка первого (после старта) спада (на линии SCL), на время
Ттакт/2 (общее время задержки = Тз + Ттакт/2), необходима для того, чтобы "выйти в
запланированный сектор обстрела".
Время формирования "технологического" бита можно сделать и кратным периоду такта,
но тогда соответствующим образом нужно увеличить и время дополнительной
задержки.
Примечание: с целью наиболее эффективного, первичного (упрощенного, но это не
беда. Еще не вечер) "въезда" в заявленную тему, все предшествующие и часть
последующих рассуждений, "привязаны" к удобной и привычной для любого
электронщика форме сигнала типа "меандр".
Итак, на данный момент, "глобальный" (общий) принцип записи байта данных, в
ячейку внешней памяти, должен быть Вам понятен (я надеюсь на это).
Теперь можно "углубляться" в детали.
Окидываю "орлиным, оценивающим взором" "поле битвы".
"Битва" ("артподготовка" и не более того) проходит успешно, но победой, пока, "не
пахнет".
”Глубинная” суть этого "взора" заключается в поговорке "семь раз отмерь и один раз
отрежь".
Лучше изначально и сознательно к чему-нибудь попридираться (типа "Ты чего, боец,
камикадзе что-ли? Почему подсумок пустой? Старшина, ...! ...!! ...!!! Сгною!!!!), чтобы

3
потом, когда "войска двинутся в бой", "кирпичи на голову не падали".
Во всем, что касается байтов и старт-стопных "дел", имеется относительный порядок,
который, в случае чего, в ходе дальнейших "разборок" и работы над программой, можно
довести до идеального.
По крайней мере, в этой "епархии" все четко объясняется, а "пупырышки" не носят
"смертельного характера".
А вот в вопросах, касающихся "промежутка" между байтами, в котором формируется
сигнал АСК, "мути" полно.

"Разборки" с сигналом АСК и всем, что с ним связано.


Суть проблемы.
Ранее, я предполагал, что интервал времени, в котором формируется сигнал АСК, равен
одному периоду такта.
До данного момента, такое упрощение (совершенно сознательно мной использованное и
ориентированное на привычный образ мыслей электронщика), с обучающей точки
зрения, было вполне оправдано, так как, для начала, нужно было, с как можно
меньшими проблемами и меньшим количеством "прыжков в стороны", "въехать" в
"глобальную" стратегию записи, а смена направления этого "вектора тяги" в сторону
(распыление внимания на "разборки повышенной крутизны"), во время столь
"интимного" процесса, привела бы к созданию повышенного "уровня бардака в мозгах"
уже на начальной стадии уяснения этой самой "глобальной" стратегии, что, как сами
понимаете, совсем не есть "зер гут".
А вот теперь, когда "контуры прорисованы", можно, со спокойной совестью, "раздолбать
этот чертов АСК" так, чтобы "пух и перья летели".
Желание в наличии. Осталось выяснить, что "долбать"? Формулирую суть "мути".
В части касающейся того, что творится на шине I2C, в "секторе обстрела" с названием
АСК, все то, что я прочитал в этой связи, крайне загадочно и абсолютно не внятно.
Соответствующие авторы, для того чтобы не заработать себе "геморрой", просто
благоразумно обходят эту "скользкую" тему или вообще "шарахаются от нее, как черт от
ладана".
В лучшем случае, имеет место быть, крайне неубедительное и смехотворное, "тявканье Моськи
на слона".
Этот "детский лепет", в "высших сферах", почему-то называется "крайней степенью
разжеванности". Если это так, то курицы летают.
Наиболее "хитропопые" авторы, туманно и осторожно (с оглядкой и "прятанием концов
в воду") ссылаются на так называемый арбитраж, с тем подтекстом, что тайна сия (в
туманном приложении к АСК) велика есть, и "гады"-разработчики беспробудно
сторожат эту "великую тайну" ("Я бы с превеликой радостью и "открытым забралом", да
только "на нет и суда нет").
Короче, ребята не плохо устроились и хорошо сидят.
Во-первых, это просто "отмазка", а во-вторых, это совсем из "другой оперы".
Вот такой "баландой" нас кормят и еще "спасибо" требуют (самые натуральные
"недоваренные щи", о которых я упоминал).
Все что связано с АСК и есть, едва ли, не самый главный источник "мути" на пути к
детальному пониманию не только всей концепции интерфейса I2C, но и более мелких
его составляющих! И это называется многократно "разжеванным"?
Ну хватит, пар выпустил, пора и дело делать.
Вашему вниманию предлагается детальное объяснение обозначенной выше "мути".
Это те нормальные "щи", которые я, в свое время, "сварил" для себя, и которые

4
предлагаю "отведать" Вам. Даю Вам практически полную гарантию того, что такой
развернутой информации по "взлому АСК" Вы просто нигде не найдете.
Общие положения.
Для начала, чтобы "Русью запахло", нужно как следует "завестись".
Это выглядит примерно так: "Ах ты устрица недоваренная! Кипяточку решила
попробовать, буржуйское отродье? Сейчас организуем...".
Короче, по праву сильного, берем свое. А теперь, шутки в сторону.
В контексте сказанного ранее (запись одного байта данных), выстраиваю логическую
цепочку рассуждений.
Чтобы не распылять внимания и сразу "взять быка за рога", я буду ориентироваться на
самый проблемный "участок" эпюры, который помечен как АСК и который расположен
правее бита №0 записываемого байта данных.
Сначала нужно собрать исходные данные (подготовиться к "мозговому штурму").
Вопрос: "Каким образом "помощником" идентифицируются биты записываемого
байта"?
Ответ: при помощи стробов, вырабатываемым "мастером" под каждый бит байта
данных.
А дальше-то что, ведь все считанные с байта данных уровни его битов должны быть
"помощником" (при помощи этих самых стробов) куда-то записаны ("заложены в
закрома")?
Не нужно быть семи пядей во лбу, чтобы понять, что, сначала, все 8 битов байта
должны быть последовательно считаны в однобайтный регистр оперативной памяти
"помощника", стандартное название которого - регистр данных (это что-то типа
аккумулятора W в ПИКах).
В регистр данных, в соответствии с логикой работы последовательного интерфейса
(любого типа), запись (ее инициируют стробы) производится побитно (начиная с бита
№7) и "по верху" "старых" данных ("старого" байта), то есть, очищать регистр данных,
перед записью в него следующего байта, не нужно.
А раз это так, то, после окончания последнего стробирования (под бит №0), байт
("полноценный"!!!) в регистре данных готов к дальнейшей обработке в "дебрях
помощника".
Что значит "готов к обработке"? Это значит, что строб 9-го такта, внутри "помощника",
"запускает в работу" одно действие (из "набора" возможных действий), конкретный
выбор которого определяется как функциональной "начинкой" (числовым значением),
так и порядком следования байтов, сформированных "мастером" на линии SDA.
Ниже приведен перечень этих действий, для случая записи байта данных в ячейку
памяти, без учета старт-стопных условий и АСК.
1. После передачи 1-го байта (режимного) и прохождения строба соответствующего 9-го
такта, "помощник" перестраивает свою аппаратную структуру (при помощи внутренних
коммутаторов) под функциональность 1-го байта (выбор "глобальной"
функциональности, выбор адреса м/схемы, выбор режима чтение/запись).
2. После передачи 2-го байта (старший байт адреса) и прохождения строба
соответствующего 9-го такта, "помощник" переписывает, из регистра данных, адресный
байт старшего разряда, в старший разряд своего счетчика адреса.
3. После передачи 3-го байта (младший байт адреса) и прохождения строба
соответствующего 9-го такта, "помощник" переписывает, из регистра данных, адресный
байт младшего разряда, в младший разряд своего счетчика адреса.
4. После передачи 4-го байта (в рассматриваемом случае, байт данных, предназаченный
для записи) и прохождения строба соответствующего 9-го такта, "помощник" "запускает"
процедуру записи в выбранную ранее ячейку памяти.

5
По поводу счетчика адреса. Примечание: вспомните HD44780.
В нем также есть счетчик адреса (АС), и принцип его работы точно такой же, как и
принцип работы счетчика адреса м/схем памяти, за исключением того, что счетчик
адреса HD44780 не двухбайтный, как в рассматриваемом случае, а однобайтный.
И еще: счетчик адреса HD44780 можно и инкрементировать, и декрементировать, а
счетчик адреса м/схемы памяти 24Схх можно только инкрементировать (подробности -
позднее).
Во всех 4-х случаях, после завершения 8-тактной процедуры последовательной записи
всех битов байта в регистр данных, этот байт просто целиком ("одномоментно")
копируется (по быстрому, внутреннему, параллельному интерфейсу) из регистра
данных в одно из, если так можно выразиться, внутренних исполнительных устройств
"помощника", которое либо соответствующим образом корректирует "режимность"
"помощника" (для пункта 1), либо производит коррекцию адреса (для 2-го и 3-го
пунктов), либо "запускает" рабочее действие" (для 4-го пункта).
Итак, для пунктов 1, 2, 3, факт копирования, из регистра данных, окончательно
сформированного байта, и есть совершение очень быстрого "рабочего действия" (а
проще говоря, само "рабочее действие").
А вот для 4-го пункта, факт копирования, из регистра данных, окончательно
сформированного байта, не есть совершение "рабочего действия", а есть только запуск в
работу "рабочего действия" (процедуры чтения или записи).
Такая, может быть, несколько упрощенная трактовка производимых "телодвижений",
тем не менее отражает суть "механики" работы "помощника" и помогает разобраться с
некоторыми важными моментами.
Как помогает? Следите за ходом рассуждений.
Вопрос: "Если, при помощи внешнего такта, процедура записи/чтения (а это дело не
быстрое, а значит и многотактное) только запускается в работу, то что обеспечивает
исполнение этой процедуры, ведь, исходя из моего предположения, у "помощника" нет
своего внутреннего такта, а внешний такт не расчитан на обслуживание этой
процедуры"?
Ответ: у "помощника" нет внутреннего такта, засинхронизированного с тактом
"мастера", но есть внутренний такт не засинхронизированный с тактом "мастера".
Внешний такт первичен, а внутренний такт вторичен в том смысле, что второе "глядит в
рот" первому: "пачки" импульсов внутреннего такта "своего мнения не имеют", а посему,
запускаются все теми же стробами, инициирующими начало процедур чтения или
записи, а заканчиваются после успешного завершения этих процедур.
Речь идет о простейшем, внутреннем (находится в 24Схх), управляемом (внешним
тактом) RC генераторе.
Именно он "тактово обслуживает" процедуры чтения и записи, и именно он (период его
такта), в первую очередь, определяет длительность их цикла.
Обычно, ориентируются на длительность цикла записи, так как он самый "массивный".
Для 24Схх, этот параметр составляет не более 10 миллисекунд. Реально, эта цифра
меньше, но, для конкретики, я буду ориентироваться на нее.
После выяснения этих обстоятельств, разумно предположить, что, в случае успешной
записи байта данных, интервал времени, который отделяет бит №0 записанного байта от
стоп-условия (в случае записи одного байта) или от бита №7 следующего,
предназначенного для записи, байта (в случае записи нескольких байтов. Об этом
ниже), "превращается" в своеобразного "раздолбая", который "портит фазу строя" в том
смысле, что все люди как люди, "шагают" с кратностью машинного цикла "мастера", а
этот "раздолбай" "плевал с высокой колокольни" на эту самую кратность, так как у него
свой RC генератор.

6
И игнорировать его нельзя, так как он имеет статус "вожака стаи".
Есть от чего "репу почесать": АСК "шарахается как ежик в тумане", а тут еще этот
"подарок судьбы (кирпич) на голову свалился".
И амнезийный боец, "гаденыш", ехидно улыбается (вот буржуи удружили ...).
Оно и понятно - "моя твоя не понимайт".
Попробуй ему объяснить, что значит, например, "кузькина мать" или "русский дух": до конца
жизни будет глазами хлопать и соображать.
А вообще, "призывной контингент" пошел совсем никудышный - сплошные буржуи.
Как с такими, в русской армии, "справно службу тащить"?
"Военкоматы" совсем обнаглели и "мышей не ловят".
Своих, рязанских да тверских что ли нет?
Бравый голос из-за кулис (откуда-то сверху): "Боеспособных нет, родимый. Контингент
пьян вдрабадан, под лавками валяется и чуть что, сразу дерется и зверским матом
ругается. Никакой управы нет. Проще буржуев рекрутировать."
Вот тебе бабушка и Юрьев день ... А на кой черт вы там, в "военкомате", задницы
отсиживаете? Готовьте рассол, холодный душ и мокрые простыни! Приводите
контингент в чувство! Вам за это рублики платят!
Голос из-за кулис: "Да пошел ты со своими копейками ... Вот буржуи платят, так платят.
Для них и стараемся".
А расхлебывать кому? Дело-то, по любому, ведь нужно делать!
Голос из-за кулис: "Тебе нужно? Вот и расхлебывай".
Ну как русскому мужику, после этого паскудства (без кавычек), не озвереть???
Ну держись, мать сыра земля!
Конец 1-й части "спектакля". Антракт.
Начало 2-й части "спектакля". Название: "Русский бунт - кровавый и беспощадный".
Дубина как-то по-старомодному выглядит. Задействую-ка я бомбардировщик.
Боекомплект загружен, баки полные, пропеллер крутится. На взлет!
"Хроника пикирующего бомбардировщика".
Почему я выбрал бомбардировщик? А врага нужно бить его же оружием.
Буржуи как воюют? С комфортом прилетели, с комфортом кнопочку нажали, с
комфортом улетели.
А внизу, после этого, остается выжженная земля.
Я проделаю то же самое, только не на "нашей", а на "их территории".
Расчитываю "координаты цели".
Мне нужно капитально разобраться со всем тем, что творится на шине I2C в
промежутке времени между окончанием формирования бита с №0 байта данных,
предназначенного для записи (записывается всего один байт данных) и стопом.
Прохожу по всей этой "цепочке".
От чего "плясать"? От момента окончания формирования бита №0.
Бит №0 "мастер сформировал. Что дальше? Далее, обычным образом (так же, как и
стробы предыдущих тактов под текущий байт), формируется строб 9-го такта.
С него-то и начинается вся "свистопляска".
Строб 9-го такта запускает процедуру записи текущего байта данных в ранее
выбранную ячейку памяти.
Это означает что внутренний, тактовый RC генератор ("раздолбай") начал работать, то
есть, выдавать внутренний такт, необходимый для осуществления процедуры записи.
Как конкретно происходит запись, знать вовсе не нужно (она займет некоторое время), а
нужно знать то, что, по окончании записи (в случае успешной записи байта), автоматика
24Схх запретит работу внутреннего, тактового RC генератора и одновременно с этим,
посредством открывания транзистора формирователя сигнала АСК, сформирует 0 на

7
линии SDA (это и есть начало формирования сигнала АСК).
А раз это так, то после начала процедуры записи, "мастер" должен приступить к анализу
состояния линии SDA, с целью обнаружения (или нет) нуля сигнала АСК.
Но для этого, "мастер" сначала должен перестроить свой вывод порта, подключенный к
линии SDA, с работы "на выход" на работу "на вход", после чего рабочая точка его
("мастера") программы должна "закольцеваться" в ПП анализа состояний линии SDA,
вплоть до обнаружения на ней нуля.
Момент обнаружения "мастером" сигнала АСК (нуля на линии SDA) зависит от
момента окончания записи и времени полного цикла ПП анализа.
В любом случае, принципиально (в смысле каких-то бяк, связанных с надежностью
работы устройства), это "погоды не делает" (за счет этого, время формирования сигнала
АСК будет "гулять" во времени, и не более того).
Теперь нужно навести порядок в терминологии: нельзя говорить "бит АСК", так как, по
причине указанной выше, он "и близко к биту данных не стоит" (отсутствует "привязка"
к времени формирования "мастером" бита данных на линии SDA).
Ранее, в целях упрощенного, первичного "въезда", такое, также упрощенное, название
было оправдано, но теперь пришло время от него отказаться.
Нужно говорить не "бит АСК", а "сигнал АСК".
Последнее не отражает фазовой "привязки" момента начала формирования сигнала АСК
(переход от 1 к 0) к такту "мастера", что и имеет место быть (момент конца
формирования сигнала АСК к такту "мастера" "привязан", см. ниже).
Пошли дальше.
Итак, "мастер" обнаружил сигнал АСК и тем самым выполнил свою "миссию"
(убедился, что байт записался "не криво").
Теперь нужно сформировать стоп-условие (в данном случае), но прежде чем сделать
это, нужно перестроить вывод порта, подключенный к линии SDA, с работы "на вход"
на работу "на выход" (чтобы можно было сформировать стоп-условие).
После завершения этой перестройки, "мастер" выдает единицу на линию SDA, что и
есть стоп-условие.
Для его полной корректности, время формирования единицы 9-го такта нужно
"затянуть", то есть, если записывается всего один байт данных (или последний байт из
массива байтов данных), то, после формирования единичного уровня 9-го такта,
"мастер" не должен больше производить каких-то "телодвижений" на линии SCL (не
менять 1 на 0).
Одновременно с формированием стоп-условия, завершается формирование сигнала
АСК (0 меняется на 1).
После этого, "помощник" "уходит в спячку" (до следующего старта).
Все сказанное выше иллюстрирует вот эта картинка:

8
На ней Вы видите "разрисовку" того, что было сказано выше.
Следующая картинка иллюстрирует "дела", творящиеся в "районе АСК" при
"потоковой" (последовательной) записи байтов. Здесь я несколько забегаю вперед, но
повод "подвернулся" уж больно хороший (сравнить есть с чем). Сейчас главное - понять
разницу, а что такое "потоковая" запись байтов я объясню позднее.

Сравните рисунки 3 и 4. У них только 2 отличия:


1. В случае "потоковой" записи байтов, импульс 9-го такта не "затягивается, а
формируется "мастером" полностью.
2. Формирование импульса АСК происходит не в момент стопа, а в момент начала

9
формирования "мастером" бита №7 следующего байта.
А что творится в "промежутке" между "технологическими" байтами? А вот что:

Здесь кое-что нужно пояснить.


По сравнению с процедурами записи или чтения, процедура "запуска в работу"
"технологических" байтов (первые три на рис. 1 или 2) требует малого времени (я бы
даже сказал, что "микроскопического").
И в самом деле, для того чтобы скопировать байт из регистра данных (а он копируется
по внутреннему, параллельному, то есть, быстрому интерфейсу), например, в счетчик
адреса, достаточно одного строба 9-го такта.
В связи с этим обстоятельством, во время перестройки направления работы вывода
"мастера", подключенного к линии SDA (а это минимум 4 машинных цикла), возникает
кратковременный электрический конфликт, выражающийся в физическом
объединении выхода защелки "мастера" и выхода открытого (то есть, работающего
“на выход”) транзистора формирователя сигнала АСК "помощника".
Этот конфликт достаточно безобиден, так как скоротечен, и на него просто можно не
обращать внимания, но учитывать это нужно, и особенно при очень больших значениях
времени машинного цикла (такое, хотя и исключительно редко, но бывает).
В основном же, работа происходит на достаточно высоких скоростях, и голову этим
конфликтом можно не забивать.
"До жизни такой" я дошел чисто аналитическим путем (плюс, некоторый опыт
электронщика), так как информации по схемотехнике 24Схх просто нет.
Я не исключаю, что разработчики как-то "подсуетились" и задержали время
формирования спада импульса АСК с таким расчетом, что этот спад "рождается" после
завершения процедуры перестройки направления работы вывода "мастера",
подключенного к линии SDA, но, на мой взгляд, вероятность этого мала по той простой

10
причине, что длительности машинных циклов могут быть разными, а "всем, как
известно, не угодишь".
На месте разработчиков, я бы не стал, ради избавления от этого конфликта, усложнять
схемотехнику м/схемы.
Если не принимать его во внимание, то "АСК-дела" на рис. 5, принципиально, ничем
не отличаются от "АСК-дел" на рис. 4.
Разница только во времени.
Что там у нас дальше "на повестке дня"?
"Рытье вглубь".
"Роем".
Вернемся к рисунку 3 (а можно и к рисунку 4).
Вспомните про "плавающую" задержку (см. "Самоучитель...").
В рассматриваемом случае, то, что на картинке закрашено зеленым цветом ("Поиск
АСК"), и есть самая натуральная "плавающая" задержка, аналогичная "плавающей"
задержке, которая организуется при опросах состояний флага BF (см. ЖКИ модуль на
основе HD44780).
И флаг, состояния которого анализируются, тоже имеется, но почему-то он никак "не
обозван", и вообще, тайна сия велика есть (как будто бы его и "в природе не
существует")
Так и хочется кого-нибудь обматерить.
Неужели не понятно, что "обозначив контуры" этого "таинственного незнакомца",
можно было бы избавить людей от большого количества понятийных проблем?
Или сами авторы об этом понятия не имеют?
Короче, хоть стой, хоть падай ...
Значит будем наводить порядок.
Для начала, "обзову" его "флагом АСК" ("привязка" к общепринятому названию
функциональности).
Флаг АСК поднимается по факту окончания в м/схеме памяти каких-то
контролируемых этим флагом процедур и программно сбрасывается "мастером" либо в
момент начала формирования бита №7, либо при стопе.
Что значит "каких-то"? Это значит, что:
1. Флаг поднимается после окончания процедуры "запуска в работу" ("срабатывания") любого
из первых трех "технологических" байтов массива байтов (см. рис. 1 или 2).
2. Флаг поднимается после окончания процедуры записи байта в любую ячейку памяти
24Схх.
3. Флаг поднимается после окончания процедуры чтения байта из любой ячейки
памяти 24Схх.
Далее следует закономерный вывод: в области, закрашенной светло-бежевым цветом
(см. рис. 3, третья эпюра сверху), сигнал АСК есть инверсное (поднят - 0) отображение
состояния флага АСК на линии SDA.
Все сопутствующие этому отображению процессы, видны на рис. 3.
Ну как? "Мути" поубавилось?
Четкие "правила игры" есть суть порядка и по-настоящему глубокого понимания. Так
всегда было и будет.
Осталось "првентиллировать" состояния транзистора АСК, то есть, внутреннего
транзистора "помощника", открытый коллектор (или сток) которого подключен к линии
SDA.
После всего сказанного, не трудно сделать вывод о том, что он открывается только при
поднятии флага АСК, а все остальное время закрыт (в том числе и при работе с
байтами).

11
Все это я "разрисовал" на картинке с названием "Состояние транзистора
формирователя сигнала АСК в случае успешной записи байта".
В принципе, самую нижнюю картинку, с названием "Последовательность действий
"мастера" на линии SDA", можно было бы и не рисовать, так как все это есть выше, но
"кашу маслом не испортишь". Пусть красуется.
Осталось "провентиллировать" последний вопрос: "Что будет в случае ошибочной
обработки байта (любой функциональности) и как с этим бороться"?
"Привяжусь" к записи.
Отсутствие подъема флага АСК означает, что процедура записи "пошла наперекосяк"
("глюк").
Конца этого "перекосяка" можно ждать долго и упорно.
В простейшем случае, выйти из этого "ступора" можно при помощи WDT, так как, после
его срабатывания, программа начинает исполняться с начала, что, по сути своей, есть
попытка повторной записи.
В более "навороченных" случаях, нужно программно организовать таймер, суть работы
которого такая же, как и суть работы WDT, но с одним "но": после переполнения
таймера, не происходит сброса на начало программы, а запускается процедура
повторной записи байта (или группы байтов) данных в "проштрафившуюся" ячейку
памяти, вплоть до "победного конца".
Не трудно догадаться, что интервал времени задержки такого таймера должна быть
более максимального, паспортного интервала времени цикла записи (миллисекунд,
эдак, 20 - 30).
И еще одно замечание: время цикла записи (и чтения), по разным причинам,
перечислять которые я не буду, может "гулять", то есть, быть нестабильным.
"Страсти" в этом никакой нет, так как команда анализа состояний флага АСК "врезана" в
группу команд "плавающей" (адаптирующейся) задержки, а она, родимая, свое дело
знает.
И последний вопрос: "Можно ли, при организации процедуры записи, обойтись без
анализа состояния линии SDA на предмет наличия нуля АСК (вообще про него
забыть)"?
Ответ: можно, если стробом 9-го такта запустить фиксированную задержку величиной
большей, чем максимальный, паспортный интервал времени цикла записи.
В этом случае, программа упростится (нет "плавающей" задержки), но нельзя будет дать
полной гарантии того, что абсолютно все байты данных записались без ошибок.
Такие "эксперименты" уже производились в "Самоучителе...", на начальной стадии
"въезда" в HD44780 (до работы с флагом BF).
Кто интересуется этим, можете перечитать. Там все детально расписано.
А теперь вдумайтесь в смысл приведенной выше аналогии (HD44780 - 24Cхх, плюс
"мастер").
Если не развивать в себе способности к систематизации (к "разложению по полочкам"),
то есть, сознательно не ставить себе целью поиск общего (базового. В данном случае,
"плавающая" задержка) в функционально обособленных массивах информации, то
"штурм" каждого такого массива обойдется ох как дорого (большие трудозатраты,
низкая эффективность и повышенный уровень бардака в мозгах).
Гораздо выгоднее, изначально, "примерить" к текущему массиву информации, который
необходимо "взломать", то, что известно (базу), и если в текущем массиве информации
идентифицирована (функционально обнаружена) база ("свои люди, друзья, знакомые,
однокашники" и т.д.), то работа с ним очень упрощается.
Это означает, что тот "кусок" массива информации, в котором идентифицирована база,

12
нужно всего-лишь "подогнать" под специфику, а это гораздо проще, чем
"перелопачивать" все "от и до".
И порядка больше.
Итак, "глухую стену протаранили" и теперь можно двигаться дальше, но это уже
следующий подраздел.

Пояснение.
Упомянутое выше, общее, классическое понятие регистр данных, было введено
исключительно с целью смысловой "привязки" к сути (но не к деталям) производимых
действий.
Если все оставить как есть, то, по здравому разумению, должен быть и еще 10-й такт: на
9-м такте происходит копирование байта в регистр данных, а на 10-м такте происходит
копирование байта из регистра данных во внутреннее исполнительное устройство.
Но 10-го такта нет. Вроде как, неувязочка получается.
А никакой принципиальной неувязки нет, нужно только понятийно, как бы, "размазать"
(рассредоточить) функцию одного, общего регистра данных по всем исполнительным
устройствам.
То есть:
1. При "запуске в работу" режимного байта, регистром данных будет режимное,
внутреннее исполнительное устройство.
2. При "запуске в работу" старшего или младшего байта адреса, регистром данных будет
старший или младший разряд счетчика адреса.
3. В пределах процедуры записи (чтения), функция регистра данных не "размазывается",
так как он реально (физически) существует в своем классическом виде (в пределах
модуля записи/чтения), и в нем, в течение всего времени процедуры записи (чтения),
для обеспечения нормального ее функционирования, хранится байт данных.
После такой понятийной "корректировки", все становится на свои места.

13
"Практикум по конструированию устройств на PIC контроллерах" http://ikarab.narod.ru E-
mail: karabea@lipetsk.ru

14