РадиоКот :: Простой тестер дисплеев на MAX7219
Например TDA7294

Эиком - электронные компоненты и радиодетали
РадиоКот >Схемы >Цифровые устройства >Измерительная техника >

Теги статьи: Добавить тег

Простой тестер дисплеев на MAX7219

Автор: ejsanyo
Опубликовано 09.10.2025
Создано при помощи КотоРед.

Приветствую любителей аппаратной логики! А любите ли вы чип под названием MAX7219? Если вы до сих пор не знаете, что это такое, то обязательно ознакомьтесь, может пригодиться. Если вкраце, это универсальный драйвер для символьных и точечных светодиодных индикаторов. Был запущен в производство, вероятно, где-то ещё в начале 2000-х, а может и раньше, корпорацией Maxim Semiconductors. За годы стал чрезвычайно популярен, выпускается до сих пор, в том числе современными китайскими компаниями! (Вероятно, за давностью лет закончились патентные сроки?) Несмотря на то, что в наше время в нише простой светодиодной индикации его немного потеснили уже чистокровные китайцы, в частности, TM1637 за счёт своей минимальной стоимости, снятие с производства в ближайшей перспективе ему явно не грозит.

 

Чем же заслужил MAX7219 такую популярность? На то есть немало причин:

  • Поддержка довольно большого числа светодиодов/разрядов индикатора (до 8 типовых светодиодных "восьмёрок", 64 светодиода);
  • Встроенная память на все 8 разрядов;
  • Наличие встроенного дешифратора для "восьмёрок", но вместе с тем сохранение возможности прямого управления светодиодами;
  • Возможность каскадного соединения чипов для увеличения числа отображаемых разрядов;
  • Встроенные, при том достаточно мощные драйверы светодиодов с возможностью как программной, так и аппаратной регулировки яркости индикации;
  • Несложный последовательный интерфейс, совместимый с популярным SPI, имеющемся в составе периферии большинства современных и не очень микроконтроллеров.

Из недостатков, как мне кажется, можно назвать отсутствие возможности чтения содержимого регистров, отсутствие возможности дополнительно подключить кнопочную клавиатуру и опрашивать её (во многих других подобных чипах такие вещи есть). Ещё в наше время, пожалуй, отсутствие возможности работать с питанием 3,3В тоже сойдёт за минус.

Ну и как следовало ожидать, рынок наводнён массой готовых модулей с участием MAX7219, на любой вкус и цвет. Есть изделия с "восьмёрочными" индикаторами, есть с точечными, причём каскадное соединение в них, как правило, предусмотрено изначально.

 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

 

И вот, допустим, купили вы такой модуль на условном Алиэкспрессе, или сделали свою плату самостоятельно. Как проверить, что всё более-менее работает? По крайней мере, что горят все светодиоды? И с этим есть нюанс: если вы просто подадите питание на плату, ничего не произойдёт. По умолчанию, без инициализации, MAX7219 остаётся в выключенном состоянии и никакой индикации выдавать не хочет. Явно нужен микроконтроллер, чтобы разбудить его...или всё же можно обойтись без него?

Попробуем разобраться. Для чего снова обратимся к даташиту. К списку регистров чипа. И видим в нём весьма интересный регистр под названием "Display test". Да, это как раз специально заложено для тестирования сборки на исправность. Если сделать запись в него, то чип зажигает все светодиоды с максимальной яркостью. Вот бы нам сделать правильную запись в этот регистр.

Видно, что последовательные данные вкачиваются в интерфейс по переднему фронту импульсов CLK, начиная со старшего бита. Всего слово данных составляет 16 бит. По переднему фронту сигнала LOAD данные, которые к тому времени успели влезть во входной буфер интерфейса, перебрасываются во внутреннюю логику чипа и выполняются им. Кстати про буфер: он представляет собой сдвиговый регистр (или FIFO, если хотите). Если до момента прихода импульса LOAD мы попытаемся залить в него более 16 бит, то лишние биты начнут вылезать с противоположной стороны через выход DOUT. Именно это используется для каскадного включения: просто закачиваем последовательно столько 16-битных слов, сколько чипов висит в цепочке, и общим сигналом LOAD одновременно отправляем код на выполнение.

Теперь посмотрим, как нам через всё это добраться до регистра Test:

Любопытное дело: из 16 бит пакета используется, по сути, только 12! 4 бита на адрес регистра, да 8 бит для данных, которые мы хотим залить в регистр. А старшие биты могут быть какими угодно, они не на что не влияют.

А если почитать повнимательнее про содержимое регистра Test:

Ну надо же, как много "иксов"! Т.е. битов, которые вообще ни для чего не используются. И лишь самый последний бит определяет, будет ли включен тестовый режим. А если ещё учесть, что адрес нашего регистра ни что иное, как F, т.е. все единицы, это недвусмысленно намекает на способ изрядно всё упростить: необязательно как-то осмысленно формировать поток данных, достаточно просто повесить линию данных на Vcc! Ещё раз подчеркнём, что таким способом мы можем, к сожалению, только включить режим "Тест". Чтобы выключить его, а также сделать ещё что-либо, придётся формировать адекватные данные.

Кстати, а что будет, если линию данных повесить на землю и закачать всё это в чип? Если аналогично проанализировать то мы получим запись нуля в регистр "No-op", который делает...ничего! И не важно, что конкретно при этом мы в него записываем. Это имеет смысл для ситуации каскадного включения чипов, когда мы хотим что-то изменить, скажем, в последнем чипе цепочки, не затрагивая регистры предыдущих.

Вот так получается, что по минимуму нам остаётся всего лишь сформировать тактовые импульсы, да вставить через нужное их количество импульс LOAD. Данное количество в минимальном варианте составляет 16, но мы же помним про возможность соединять чипы "паровозиком"? Так что сделаем, пожалуй, 64 импульса, чтобы прокачать командами Test хотя бы 4 объединённых индикатора, вряд ли на практике потребуется больше.

Достанем из кладовки кучку пыльных микросхем стандартной логики и попробуем синтезировать нужные сигналы.

Всё начинается с тактового генератора, собранного по более-менее классической схеме на такой же классической 74LS00 К555ЛА3. При указанных номиналах элементов частота составляет порядка 140 кГц. Далее она делится на 2 и на 4 триггерами DD2, попутно выравнивая форму импульсов до меандра.

Далее в дело вступает счётчик 74LS393 К555ИЕ19, первый выход которого, с частотой, суммарно поделенной на 8, и используется в качестве источника сигнала CLK. Если проследить последовательность счёта, видно, что на последнем выходе счётчика единица появится только когда на первом выходе пройдёт 64 импульса, что и требуется. Теперь пора сформировать импульс LOAD. Используем JK-триггер 74LS112 К555ТВ9. Не самый популярный и понятный для многих элемент логики, но в данном случае весьма удобный для этого. Разрешаем ему выставиться в 1 (входом J) по сигналу последнего выхода счётчика, т.е. после 64 импульса CLK. Сам же переход в 1 произойдёт по импульсу от первого делителя тактовой частоты (выход DD2A), что соответствует первой четверти от длительности нуля в сигнале CLK. Триггер выставляется, выдаёт передний фронт LOAD...и этим же сигналом сбрасывает счётчик. Таким образом, для следующего такта разрешение по входу J снимается. Вход K также соединён с выходом LOAD, благодаря чему следующим тактом автоматически разрешается сброс триггера. Что и происходит в третьей четверти длительности нуля в сигнале CLK. Счётчик снова запускает счёт, и процесс повторяется.

Супервизор питания PST159D КР1171СП42 задаёт начальное состояние схемы после включения питания, сбрасывая все триггеры и счётчик. В отличие от триггеров, счётчик для сброса требует сигнал единицы, поэтому используем DD1C для инвертирования, а также добавления к сбросу сигнала LOAD.

Оставшийся триггер DD3B слегка расширяет функционал устройства, позволяя выбирать, будем мы гнать в MAX-ы команды TEST, или команды NOP. Для выбора к XP1 подключается перекидная кнопка, замыкающая на землю либо контакт 1, либо 3. Если бы мы подобную кнопку подключили непосредственно на вход данных, то при переключении её в случайный момент времени по отношению к импульсам CLK в MAX-ы загрузится неведомо что. Триггер же синхронизирован с сигналом LOAD и фиксирует последнее состояние кнопки на весь период пачки импульсов.

Как известно, уровень логической единицы в классической ТТЛ(Ш) логике ниже, чем в её КМОП потомках (в документации, как правило, скромно пишут "не ниже 2,5...3,5В"). В даташите MAX7219 нижний порог единицы для входов указан 3,5В, хоть и сам я имел массу примеров, когда чип устойчиво принимал сигнал от контроллеров в 3,3В логикой! Тем не менее, снизим риск и установим R12, R14, R16, создающие дополнительную подтяжку для единицы. R13, R15, R17 установлены для защиты выходов от короткого замыкания и некоторого ограничения тока разряда, когда выходных контактов будут касаться шаловливые ручонки, заряженные статическим электричеством! ТТЛ логика не слишком к нему чувствительна, но тем не менее. Для целей буферизации также служит элемент DD1D.

Полученная схема на первый взгляд кажется весьма сложной, но если вспомнить, что прячется в недрах любого контроллера...то да, всё становится очень просто. Поскольку сегодня мы использовали не самую первую ТТЛ, а ТТЛШ логику, собственное (без учёта платы с MAX-ом) потребление тока устройством получилось умеренное, в районе 20 мА. Потенциально его можно снизить до считанных долей миллиампера, если перевести схему на КМОП логику, например, серии 74HC.

Взглянем теперь на полученные сигналы CLK и LOAD:

Как видно, всё соответствует ожиданиям. Не совсем ровная форма импульсов CLK, вероятно, связана с особенностями внутренней схемотехники счётчика. Количество импульсов попробуйте посчитать самостоятельно. :)

Как обычно, полный проект в Altium Designer выложен в конце. Плата, насколько возможно, оптимизирована под грубый односторонний ЛУТ, в результате количество внешних перемычек получилось довольно большим. Причём впоследствии пришлось её немного понадкусать, чтобы уместить в типовой корпус G203 (Gainta).


Файлы:
Файлы проекта


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

6 4 0