В этом тексте я представил обзор контроллера графических монохромных экранов SSD1306 в исполнении экранного модуля с диагональю 0,96 дюймов (24,38 мм). Я напишу с какой стороны следует подходить к этому ASIC.
Аппаратная часть
Вариантов конструктива для модулей SSD1306 я видел как минимум 4 варианта. Вот так выглядит экранчик с ssd1306 снаружи. Обычно это маленькие платочки расширения.
Габариты PCB модуля
Есть еще такой вариант исполнения 27x27.5мм
Есть еще квадратные SSD1306 модули в чёрном исполнении 26x26. У них габариты и монтажные отверстия другие.
Это блок-схема контроллера SSD1306 экранчика. Видно, что у него внутри есть свое тактирование, RAM память 1kByte, Декодер команд, контроллер дисплея, четыре интерфейса на выбор (SPI/I2C/6800/8080) и драйвер светодиодной матрицы 64x128 пикселей.
Распиновка самого чипа SSD1306 тут.
https://docs.google.com/spreadsheets/d/1LhDzoYykJnV6U96ambYs4EOCVWZcaruhf0pKGoBLOnc/edit#gid=0
У чипа SSD1306 очень много пинов: 281 штук.
Интерфейс связи с Host MCU выбирается пинами BS[2...0]. I2C адрес можно варьировать между двумя адресами, если подать нужное напряжение на пин SA0 (D/C#). Поэтому на одной I2C шине может быть только 2 экрана SSD1306.
Размер пикселя можно вычислить прибегнув к теореме Пифагора, решив уравнение (1)
Получается x=0.17 мм. И в каждом пикселе реализована вот такая электрическая цепь. В сущности, светодиод. Светодиодная матрица это 8192 LED(ов).
Терминология
Чтобы работать с этим контроллером надо освоить эти определения
Ниббл (nibble) - 4х битое число
Страница- кусок SRAM памяти экрана размером 128 байт или 127 сегментов.
Сегмент - вертикальная полоска 8 пикселей. В каждой странице 128 сегментов. Всего в памяти дисплея 1024 сегментов
Колонка (Column)- вертикальный массив пикселей. Всего 128 колонок. Счет от нуля до 127. В каждой колонке 8 сегментов.
Программная часть
Чип может работать по 5ти интерфейсам. Выбор интерфейса выбирается тремя пинами с префиксом BS.
В случае с I2C. На шине I2C ASIC ssd1306 отображается c I2C адресом 0x3C
То же сканирование только на NRF5340. Появился какой-то непонятный 0xBC.
Вот I2C адреса ssd1306
В этот модуль можно посылать либо команды либо данные. Биты передаются старшим битом вперед. Минимальная команда состоит из 3 байт в шине I2C. Вот бинарная структура пакета.
Можно заметить, что в протоколе экранчика в control byte всегда впустую посылается 6 бит.
Можно также посылать несколько команд в одном I2C пакете.
Можно проинициализировать весь экран одним I2C пакетом.
Вся память 1024 байт поделена на 8 страниц. Каждая страница получается 128 байт. Это как раз равно разрешению по ширине. Каждая страница захватывает полоску шириной 8 пикселей по высоте.
Какие есть конфиги внутри SSD1306?
У чипа SSD1306 аж 25 параметров, которые надо конфигурировать по I2C. Поэтому для чипа нужен отдельный драйвер. Это выбор интерфейса, выбор режима отрисовки пикселей, контрастности, прокрутки, настройки тактирования.
Разрешение экрана 64x128 пикселей. Начало координат обычно делают в верхнем правом углу. X - вправо Y - вниз
Для отладки сложной графики типа меню или экранная клавиатура вам точно понадобится PC утилита имитатор экранчика для отрисовки графики на конве 64x128. Это поможет сократить количество итераций пере прошивки микроконтроллера. Причем эту утилиту надо писать на том же языке, что и прошивку микроконтроллера чтобы бесшовно переносить софт на разные платформы.
Вся система команд это 26 команд
Экран не работает сразу как только на него подать напряжение. Чтобы включить экран надо выполнить последовательность из 12ти команд.
Сам по себе экран бесполезный, если нет программного компонента шрифтов. Каждая буква закодирована массивом. Вот например кодировка цифры девять.
{0x1C, 0x00, 0x22, 0xC0, 0x22, 0x40, 0x22, 0x40, 0x1F, 0x80, 0x00, 0x00}, /*"9", 25*/
Каждый бит соответствует пикселю. В кодировке по 2 байта на каждую вертикальную линию шрифта.
Стоит замерить, что в кодировках каждого символа по 4 избыточных бита.
или
Как покрыть тестами драйвер графического дисплея?
Отобразить на дисплее QR код или DataMatrix Code и прочитать его модулем считывания qr кодов c UART интерфейсом, типа этого. https://aliexpress.ru/item/1005004518238188.html?spm=a2g2w.orderdetail.0.0.73094aa6DXpXiK&sku_id=12000029447005809
Если установленный код на графическом дисплее совпал с прочитанным из UART модуля GM67, значит драйвер графического дисплея работает корректно.
Достоинства контроллера SSD1306
++1 Легко подключать. Всего 2 провода в I2C режиме.
++2 Можно отображать графику: круги, линии, прямоугольники.
++3 угол обзора пикселей - 160+ градусов
++4 Светятся сами пиксели а не подсветка экрана. Подсветки экрана тут вообще нет.
Недостатки SSD1306
--1 Отсутствует пин Reset. Когда I2C шина зависает, то единственный способ восстановить link с экраном это пере сброс питания.
--2 Невозможно читать память дисплея в режиме I2C/SPI
--3 Отсутствует встроенный аппаратный генератор шрифтов
--4 На этом контроллере SSD1306 только экраны с малой диагональю 1 и 2 дюйма.
--5 OLED пиксели выгорают за год непрерывной работы.
--6 Можно подключить всего только 2 экрана на одну I2C шину.
Приложения графических OLED экранов
1--Отладка прошивок. Показывать на экране основные параметры.
2--Электронная линейка. Можно отображать шкалу в миллиметрах или дюймах учитывая что габариты пикселя 0,17 мм.
3-- Одним своим видом экран излучает максимум 1 килобайт данных. Поэтому на экране можно сделать генератор QR кодов для QR сканеров.
Тем самым можно передавать на смартфон конфиги, серийный номер для регистрации устройства в мобильном приложении, код Pairing(a) для BLE или просто автоматические протестировать драйвер экрана.
4--Экран наручных часов. Показывать время.
5--Отладка файловых систем. Каждый бит это пиксель. Можно визуально смотреть на состояние памяти. Можно буквально смотреть на память под микроскопом. Скроллингом проматывать вперед-назад.
6--Мигать куском экрана и тем самым передавать бинарные данные в фотодиод наклеенный на экран.
7--Организация древовидных меню. Однако для этого надо хотя бы 4 кнопки.
8--Если оснастить MEMS акселерометром, то можно сделать электронный уровень горизонтали, вертикали или 45 градусов. А на экране показывать "пузырек" в перекрестии.
9--В режиме интерфейса 6800/8080 чип SSD1306 можно использовать как внешнюю SRAM память на 1kByte.
Вывод
SSD1306 это простой монохромный графический дисплей. Его внешний вид, конечно, так себе, зато подойдет для прототипирования и отладки прошивок. Можно встраивать его в измерительные и тестировочные приборы. На основе дисплея можно отрисовывать приборную панель состояния прошивки, запустить древовидное меню или просто отображать курсор консоли.
Если вам нужен драйвер SSD1306 и шрифты написанные на С, то пишите в личку.
Словарь
Для понимания datasheet(а) SSD1306 вам понадобится распознавать эти акронимы:
Акроним | Расшифровка |
RAM | random-access memory |
SDA | Serial DAta |
SCL | Serial CLock |
GDDRAM | Graphic Display Data RAM |
OLED | organic light-emitting diode |
VSS | пин заземления |
NC | No Connect |
CMOS | Complementary metal–oxide–semiconductor |
AC | Alternation Current |
SRAM | static RAM |
IC | integrated circuit |
VCC | voltage collector collector |
VDD | voltage drain drain |
PLED | Polymer OLEDs |
DC | direct current |
I2C | Inter-Integrated Circuit |
SPI | Serial Peripheral Interface |
NOP | No Operation |
MCU | microcontroller unit |
SSD | SOLOMON SYSTECH Driver |
Links
https://cxem.net/arduino/arduino227.php
https://habr.com/ru/articles/313490/
http://microsin.net/adminstuff/hardware/ssd1306-oled-controller.html