Как оказалось, проблема была в используемыми китайцами компонентах: все-таки, чтобы оно заработало правильно, необходимо было входные уровни увеличить до 5В. Исходники на гитхабе. Начало пайки:
Учитывая предыдущие проблемы с отображением, решил спаять пятивольтовые буферы, благо, элементная база у меня дома вполне-таки позволяет это сделать. Взял два CD4050, но т.к. они шестиканальные, тринадцатый канал реализовал на мосфете (2N7000). Сначала хотел какой-нибудь мелкий SMD'шный запаять, но оказалось, что у всех них слишком паршивые временные характеристики (чем меньше Rdson, тем выше емкость затвора, в итоге получилось, что самый паршивый с энергетической точки зрения полевик обладает наименьшим временем перехода — 10нс). Мосфет запаял на nOE, сделав его таким образом просто OE. Сделал бы все вечером на работе, но сижу в состоянии непонятного то ли гриппа, то ли простуды. Врач мне рекомендовал на работу еще пару-тройку дней все же не ходить. Так что, вместо изготовления печатной платы, спаял все на макетке (в принципе, по времени вышло, наверное, даже быстрей: на кикад ушло бы минимум часа полтора, да еще часа два-три на изготовление платы и пайку; хотя, конечно, паять на готовую печатную плату приятней, чем проводочки припаивать на макетке). Вот такая штукенция получилась:
Что интересно: опять с первой попытки пайки у меня 2N7000 не заработал! С SMD'шными мосфетами у меня такое было очень редко, чтобы после пайки полевик не работал. С этими же чуть ли не в 50% случаев! Откусил старый, припаял новый — завелось. Думал было добавить в качестве примера разноцветные летающие пиксели, но как представил объем кода (добавить аппаратный random, учитывать взаимодействие между пикселями и т.д., и т.п.), просто добавил "псевдорадугу". Цвета у меня формируются в восьмибитном формате RRRGGGBB. Таким образом, чтобы отобразить экран один раз, его надо перерисовать семь раз (с учетом восьмиградационных цветов). Для работы используется таймер TIM3: строб он генерирует в режиме ШИМ с 50% заполнением, а по событию UEV пинает DMA, которое и передает на экран очередные две строки (т.к. формат HUB75 подразумевает одновременный вывод двух строк: одна в верхней половине экрана и одна в нижней). Номер строки, OE и LAT выводятся ногодрыгом в прерывании по окончанию передачи DMA (чтобы дождаться окончания последнего строба пришлось добавить в прерывание while(!(TIM3->SR & TIM_SR_UIF)), а отключение таймера гарантируется TIM3->CR1 |= TIM_CR1_OPM в том же прерывании ранее). Надо бы когда-нибудь под этот экранчик простые классические игрульки реализовать: тетрис, змейку и т.п.
Видео-демонстрация работы. UPD: поменял алгоритм отображения. Уж очень экран мерцает, если цвет изображать последовательностью из семи кадров. Сделал построчный "ШИМ": каждая строка отображается 7 раз, а уж пиксели в ней — в зависимости от уровня цвета.