Администрирование Железо SSD1306: контроллер/драйвер для дисплеев OLED/PLED Tue, October 08 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

SSD1306: контроллер/драйвер для дисплеев OLED/PLED Печать
Добавил(а) microsin   

SSD1306 это однокристальный CMOS драйвер матричных индикаторов OLED/PLED, совмещенный с графическим контроллером. Он обрабатывает матрицу из 128 сегментов и 64 общих сигналов. Эта микросхема разработана для OLED-панелей с общим катодом (Common Cathode type OLED). На основе SSD1306 наибольшее распространение получили монохромные индикаторы 96x16, 128x32 и 128x64 точек. Такие индикаторы можно купить на AliExpress и Ebay в виде готового модуля, снабженного интерфейсом I2C или SPI.

SSD1306 имеет встроенное управление контрастностью, ОЗУ экрана и генератор. Все это уменьшает количество необходимых внешних компонентов и общее энергопотребление. Управление яркостью имеет 256 градаций. Данные и команды отправляются от MCU через аппаратно выбираемый интерфейс. Это может быть параллельный интерфейс, совместимый 6800/8080 MCU, I2C или SPI. Контроллер SSD1306 подходит для многих приложений портативных устройств, такие как дополнительный индикатор для телефона, MP3 плеер, калькулятор и т. п.

Примечание: этот перевод даташита [1] был сделан для уточнения доступа к индикатору через последовательный интерфейс I2C. Поэтому некоторые разделы даташита, не представляющие интерес, не переведены. Это касается таблиц 10-1 (пример установки смещения экрана и начальной строки экрана без Remap), 10-2 (пример установки смещения экрана и начальной строки экрана с функцией Remap), 12-1 (DC-характеристики) и другие таблицы и рисунки, которые интересны только разработчикам OLED-модулей. Информацию по этим моментам см. в оригинальном даташите.

Основные функции:

• Матричная панель 128 x 64 точек
• Питание:
   - VDD = 1.65V .. 3.3V для логики микросхемы
   - VCC = 7V .. 15V для питания сегментов панели
• Параметры матричного дисплея:
   - Управляющее выходное напряжение для OLED 15V максимум
   - Максимальный ток сегмента 100 мкА
   - Общий вытекающий ток 15 мА
   - 256 ступеней управления током контрастности и яркости
• Встроенная буферная память (SRAM) экрана 128 x 64 бит
• Выбираемый уровнями ножек интерфейс подключения к MCU:
   - 8-битный 6800/8080 параллельный интерфейс
   - 3/4 проводный SPI
   - I2C
• Непрерывная функция прокрутки графики экрана в горизонтальном и вертикальном направлениях, которая может использоваться для равномерного износа сегментов
• Сигнал синхронизации записи в RAM
• Программируемая частота фреймов (Frame Rate) и коэффициент мультиплексирования (Multiplexing Ratio)
• Переназначение строк (Row Re-mapping) и столбцов (Column Re-mapping)
• Встроенный генератор
• Разводка чипа для COG (Chip On Glass, чип на стекле) и COF (Chip On Film, чип на гибком шлейфе).
• Широкий диапазон рабочих температур: -40 .. 85°C

SSD1306 Block Diagram fig4 1

Рис. 4-1. Блок-схема SSD1306.

Таблица 6-1. Описание выводов.

Система обозначений типа выводов для таблицы 6-1 (колонка "Тип"):

I вход
O выход
IO двунаправленный сигнал (input/output)
P вывод для питания
NC не подключено

Мнем. Тип Описание
VDD P Вывод питания для функционирования логики ядра.
VCC P Вывод питания (вход) для силовой логики панели. Это самое высокое положительное напряжение, которое подается на контроллер.
VSS P Общий провод (земля, GND).
VLSS P Общий провод аналоговых схем. Должен быть внешней цепью накоротко соединен с VSS.
VCOMH O Уровень напряжения для не выбранного состояния COM. Между VCOMH и VSS должен быть подключен развязывающий конденсатор.
VBAT P Зарезервированный вывод, должен быть подключен к VDD.
BGGND P Зарезервированный вывод, должен быть соединен с общим проводом.
C1P/C1N C2P/C2N I Зарезервировано для будущего использования. Эти выводы не должны быть подключены.
VBREF P Зарезервированный вывод, не должен быть никуда подключен.
BS[2:0] I Выводы для выбора режима работы интерфейса с микроконтроллером, подробнее см. таблицу 7.1.
IREF I Этот вывод задает опорный ток для выходного тока SEG. Между IREF и VSS должен быть подключен резистор (см. рис. 8-15), через который течет ток порядка 12.5µA. Для вычисления номинала резистора см. формулу в разделе "Блок управления SEG/COM".
FR O Это выход сигнала синхронизации фрейма. Выбор правильного момента записи MCU данных в RAM относительно этого сигнала позволит избежать искажения изображения при выводе. Если этот сигнал не используется, то он должен оставаться не подключенным. Подробнее про использование сигнала FR см. секцию "Синхронизация FR".
CL I Вывод для подачи сигнала внешнего тактирования. Когда разрешено тактирование от внутреннего генератора (CLS = лог. 1), этот вывод не используется и должен быть подключен к VSS. Когда внутреннее тактирование запрещено (CLS = лог. 0), вывод CL работает как вход для подачи внешнего сигнала тактирования.
CLS I Вывод для разрешения внутреннего тактирования. Когда на этот вывод подан уровень лог. 1 (CLS соединен с VDD), разрешена работа внутреннего генератора тактов. Когда на вывод CLS подан лог. 0 (CLS соединен с VSS), работа внутреннего генератора запрещена и на вход CL должен быть сигнал внешнего тактирования.
CS# I Это вывод для выборки внешнего интерфейса (chip select), который подключается к микроконтроллеру. Обмен данными с микроконтроллером возможен только тогда, когда на CS# подан лог. 0.
RES# I Вывод для сигнала сброса. Когда на него подан лог. 0, то выполняется инициализация контроллера. Во время нормальной работы на вводе RES# должен удерживаться уровень лог. 1.
D/C# I Это вывод для управления подачей данных (когда лог. 1) или команды (когда лог. 0). В режиме интерфейса I2C этот вывод работает как SA0 для выбора адреса подчиненного устройства I2C. Когда выбран 3-проводный интерфейс SPI, этот вывод должен быть подключен к VSS. Для подробной информации по взаимодействию с MCU см. временные диаграммы на рисунках от 13-1 до 13-5.
E (RD#) I Когда выбран параллельный интерфейс стиля 6800, этот вывод будет использоваться как сигнал разрешения (Enable, E). Операция чтения/записи инициируется, когда этот вывод подтянут к лог. 1, и чип контроллера выбран сигналом CS#. Когда выбран параллельный интерфейс стиля 8080, этот вывод принимает сигнал чтения (Read, RD#). Операция чтения инициируется, когда этот вывод подтянут к лог. 0, и чип контроллера выбран сигналом CS#. Когда выбран последовательный интерфейс I2C или SPI, этот вывод должен быть соединен с VSS.
R/W# (WR#) I Это вход для управления чтением/записью интерфейса с микроконтроллером.
Когда выбран режим интерфейса 6800, этот вывод работает как выбор режима чтения или записи (R/W#). Режим чтения выбран, когда на этом входе лог. 1, и режим записи, когда лог. 0.
В режиме интерфейса 8080 этот вход работает как сигнал разрешения записи (WR#). Режим записи данных инициируется, когда этот вход переводится в лог. 0 и работа интерфейса разрешена (CS# также в лог. 0).
В режиме последовательного интерфейса I2C или SPI этот вывод не используется, и должен быть подключен к VSS.
D7..D0 IO В режиме 8-разрядных шин это двунаправленная шина данных для связи с микроконтроллером. Когда выбран последовательный интерфейс SPI, D0 используется как сигнал тактов, D1 как сигнал данных, D2 должен оставаться не подключенным. Когда выбран режим I2C, сигналы D2, D1 должны быть соединены друг с другом для обслуживания функции SDA, и D0 используется как вход сигнала тактов SCL.
TR0-TR6 - Зарезервированные выводы, используемые для тестирования. Не должны быть никуда подключены.
SEG127..SEG0 O Эти выводы предназначены для управления сегментами панели OLED. Когда панель выключена, то на этих выводах уровень VSS.
COM63..COM0 O Эти выводы предназначены для управления общими сигналами панели OLED. Когда панель выключена, то эти выводы находятся в состоянии высокого сопротивления.
NC - Пустой вывод, который не должен никуда быть подключенным. Не группируйте друг с другом и не соединяйте другие выводы NC.

[Функциональное описание]

Интерфейс с внешним микроконтроллером (MCU) контроллера SSD1306 состоит из 8 выводов для сигналов данных и 5 выводов для сигналов управления. Назначение выводов в различных режимах интерфейса показана в таблице 8-1. Различные режимы интерфейса MCU может быть установлены уровнями на выводах BS[2:0] (см. таблицу 7-1).

Таблица 7-1. Выводы для выбора типа интерфейса с MCU.

BS[2:0] Тип выбранного интерфейса
000 4-проводный SPI
001 3-проводный SPI
010 I2C
011 Зарезервировано
100 8-бит параллельная шина 6800
101 Зарезервировано
110 8-бит параллельная шина 8080
111 Зарезервировано

Примечание: 0 означает подключение к VSS, 1 подключение к VDD.

Таблица 8-1. Назначение выводов интерфейса MCU в различных режимах.

SSD1306 MCU interface assignment table8 1

Примечание: "Лог. 0" означает подключение к земле (VSS), NC означает "никуда не подключено". Символ # обозначает сигнал с активным нулем, например D/C# означает, что данные передаются при D/C# = лог. 1, а команда передается при D/C# = лог. 0.

Параллельный интерфейс шины MCU 6800. Этот параллельный интерфейс состоит из 8 двунаправленных сигналов данных (выводы D[7:0]) и сигналов управления R/W#, D/C#, E и CS#.

Лог. 0 на выводе R/W# указывает операцию записи (WRITE), и лог. 1 операцию чтения (READ). Лог. 0 на выводе D/C# показывает чтение или запись команды (COMMAND read/write), и лог. 1 показывает чтение или запись данных (DATA read/write). Вход E обслуживает функцию сигнала защелки, когда сигнал выборки CS# находится в лог. 0. Данные защелкиваются по спаду уровня E.

Таблица 8-2. Выводы управления интерфейса 6800.

Функция E R/W# CS# D/C#
Запись команды L L L
Чтение статуса H L L
Запись данных L L H
Чтение данных H L H

Примечание: ↓ означает спад уровня. H обозначает лог. 1 сигнала, L означает лог. 0.

Чтобы рабочая частота RAM экрана подходила к микроконтроллеру, внутри SSD1306 делается некоторая конвейерная обработка, которая требует вставки пустого чтения (dummy read) перед первым реальным чтением данных дисплея. Это показано на рис. 8-1.

SSD1306 Data read back 6800 fig8 1

Рис. 8-1. Процедура обратного вычитывания данных из памяти дисплея - вставка dummy read.

Параллельный интерфейс MCU стиля 8080. Этот параллельный интерфейс состоит из 8 выводов двунаправленных данных (D[7:0]) и сигналов управления RD#, WR#, D/C# и CS#.

Лог. 0 сигнала D/C# показывает чтение/запись команды (COMMAND read/write), и лог. 1 показывает чтение/запись данных (DATA read/write). Фронт нарастания на входе RD# служит сигналом захвата данных операции чтения, когда сигнал выборки CS# удерживается в лог. 0. Фронт нарастания на входе WR# служит сигналом захвата записи, когда выборка CS# удерживается в лог. 0.

SSD1306 Write 8080 fig8 2

Рис. 8-2. Пример процедуры записи в режиме параллельного интерфейса 8080.

SSD1306 Read 8080 fig8 3

Рис. 8-3. Пример процедуры чтения в режиме параллельного интерфейса 8080.

Таблица 8-3. Выводы управления интерфейса 8080.

Функция RD# WR# CS# D/C#
Запись команды H L L
Чтение статуса H L L
Запись данных H L H
Чтение данных H L H

Примечание: ↑ означает фронт нарастания сигнала. H обозначает лог. 1, L обозначает лог. 0.

Чтобы рабочая частота RAM экрана подходила к микроконтроллеру, внутри SSD1306 делается некоторая конвейерная обработка, которая требует вставки пустого чтения (dummy read) перед первым реальным чтением данных дисплея. Это показано на рис. 8-4.

SSD1306 Data read back 8080 fig8 4

Рис. 8-4. Процедура обратного вычитывания данных из памяти дисплея - вставка dummy read.

4-проводный SPI. Этот последовательный интерфейс состоит из сигналов SCLK (такты), SDIN (входные данные), D/C#, CS#. В 4-проводном режиме SPI ножка D0 действует как SCLK, D1 как SDIN. Для не используемых выводов данных D2 должна оставаться не подключенной, ножки D3..D7, E и R/W# (WR#) можно подключить к земле.

Таблица 8-4. Выводы управления 4-проводного SPI.

Функция E(RD#) R/W#(WR#) CS# D/C# D0
Запись команды Замкнуто на VSS L L
Запись данных Замкнуто на VSS L H

Примечание: H означает лог. 1, L означает лог. 0. "Замкнуто на VSS" означает постоянную подачу лог. 0.

Данные на SDIN вдвигаются в 8-битный регистр сдвига по каждому фронту нарастания SCLK, в следующем порядке: D7, D6, ... D0. Сигнал D/C# анализируется на каждом восьмом такте, и байт данных, накопленный в регистре сдвига, записывается либо в буфер Graphic Display Data RAM (GDDRAM) контроллера, либо в регистр команд на том же самом такте.

В последовательном режиме разрешены только операции записи.

SSD1306 Write 4 SPI fig8 5

Рис. 8-5. Процедура записи в режиме 4-проводного последовательного интерфейса (4-wire Serial interface mode).

3-проводный SPI. Этот последовательный интерфейс состоит из сигнала SCLK (такты последовательных данных), SDIN (последовательные данные) и CS#. В 3-проводном режиме SPI, ножка D0 функционирует как SCLK, D1 как SDIN. Для не используемых ножек данных D2 должна оставаться не подключенной, выводы D3 .. D7, R/W# (WR#)#, E и D/C# можно подключить к земле.

Функционирование 3-проводного режима SPI подобно 4-проводному SPI с тем лишь отличием, что ножка D/C# не используется. В регистр сдвига вдвигаются 9-бит в следующей последовательности: бит D/C#, биты D7 .. D0. Бит D/C# первый бит в последовательных данных будет определять назначение следующих 8 бит (байт данных) - он должен быть записан в буфер экрана Display Data RAM (D/C# = 1) или в регистр команд (D/C# = 0).

В последовательном режиме разрешены только операции записи.

Таблица 8-5. Выводы управления 3-проводного последовательного интерфейса.

Функция E(RD#) R/W#(WR#) CS# D/C# D0
Запись команды Замкнуто на VSS L Замкнуто на VSS
Запись данных Замкнуто на VSS L Замкнуто на VSS

Примечание: L означает лог. 0. "Замкнуто на VSS" означает постоянную подачу лог. 0.

SSD1306 Write 3 SPI fig8 6

Рис. 8-6. Процедура записи в 3-проводном режиме SPI.

[I2C]

Коммуникационный интерфейс I2C состоит из ножки установки адреса подчиненного устройства SA0, сигнала данных SDA (SDAOUT/D2 для выхода и SDAIN/D1 для входа) и сигнала тактов SCL (D0). Сигналы SDAOUT и SDAIN обычно соединяются параллельно для получения одного сигнала SDA. Оба сигнала SDA и SCL должны быть подтянуты к лог. 1 с помощью внешних резисторов (pull-up) типичным номиналом от 4.7 кОм до 10 кОм. Сигнал RES# используется для инициализации устройства (в реальности его использование не обязательно, достаточно RES# подтянуть резистором к лог. 1).

Ножка бита адреса подчиненного устройства SA0. SSD1306 распознает адрес подчиненного устройства перед передачей или приемом какой-либо информации по шине I2C. Устройство будет отвечать на адрес подчиненного устройства (slave address), где присутствует бит SA0 и бит выбора операции чтение/запись (read/write, бит R/W#). Этот адрес имеет следующий формат:

b7  b6  b5  b4  b3  b2  b1  b0
0   1   1   1   1   0   SA0 R/W#

SA0 предоставляет возможность расширения slave-адреса. Таким образом, для коммуникации с SSD1306 можно выбрать адрес 0111100 (0x3C) или 0111101 (0x3D), позволяя тем самым к одной шине I2C параллельно подключить два контроллера SSD1306. Ножка D/C# работает как бит SA0. Бит R/W# в slave-адресе используется для определения рабочего режима шины I2C. Если R/W#=1, то это режим чтения (read mode). Если R/W#=0, то это режим записи (write mode).

Сигнал данных SDA. SDA функционирует как канал обмена данными между передатчиком и приемником. Данные и сигнал подтверждения (acknowledgement, ACK) посылается через SDA.

Следует отметить, что сопротивление дорожки ITO (Indium tin oxide, материал анода) и сопротивление подтяжки SDA становятся делителем потенциала напряжения. В результате подтверждение было бы невозможным для достижения допустимого уровня лог. 0 на SDA.

Сигналы SDAIN и SDAOUT соединяются вместе, создавая один двунаправленный сигнал SDA. Ножка SDAIN должна быть подключена к SDA обязательно, а ножку SDAOUT можно не подключать. Когда ножка SDAOUT отключена, то сигнал подтверждения будет игнорироваться шиной I2C.

Сигнал тактов SCL. Передача информации по шине I2C осуществляется по сигналу тактов SCL. Каждая передача бита данных происходит за один период тактов SCL.

Запись данных по шине I2C. Интерфейс I2C дает доступ к записи данных и команд в устройство. На рис. 8-7 показан режим записи (write mode) в хронометрическом порядке.

SSD1306 I2C data format fig8 7

Рис. 8-7. Формат данных шины I2C.

Легенда мнемоник рисунка 8-7:

Co Continuation, бит продолжения.
D/C# Data / Command Selection, бит выбора данные или команда.
ACK Acknowledgement, бит сигнала подтверждения протокола I2C.
SA0 Slave address, бит 0 адреса подчиненного устройства протокола I2C.
R/W# Read / Write Selection, бит выбора операции чтение / запись протокола I2C.
S START condition, сигнал старта протокола I2C.
P STOP condition, сигнал останова протокола I2C.

Запись работает следующим образом:

1) Master-устройство (управляющий микроконтроллер, MCU) инициирует коммуникацию посылкой сигнала START (start condition). Определение START показано диаграммой рисунка 8-8. START устанавливается переводом SDA от лог. 1 к лог. 0 при постоянном лог. 1 на SCL.

2) За START передается slave-адрес, чтобы на него отреагировало подчиненное устройство. В нашем случае это SSD1306, для которого допустимым адресом может быть b0111100 или b0111101, что определяется уровнем на SA0 (ножка D/C# работает как SA0).

3) Режим записи устанавливается передачей лог. 0 в бите R/W# этого адреса.

4) Сигнал подтверждения ACK будет генерироваться каждый раз после приема одного байта данных, включая slave-адрес и бит R/W#. На рис. 8-9 показаны диаграммы сигнала подтверждения ACK. ACK определяется как подтяжка SDA к лог. 0 во время уровня лог. 1 импульса SCL, связанного с выдачей подтверждения.

5) После передачи slave-адреса передается либо байт управления, либо байт данных SDA. Байт управления состоит главным образом из бит Co и D/C#, за которыми идут шесть нулевых бит.

a. Если бит Co установлен в лог. 0, то следующие передачи будут содержать только байты данных.
b. Бит D/C# определяет, чем будет следующий байт данных - командой или данными. Если бит D/C# установлен в лог. 0, то следующий байт это команда. Если бит D/C# установлен в лог. 1, то следующий байт это байт данных, который должен быть сохранен в графический буфер GDDRAM. Указатель адреса столбца GDDRAM будет увеличиваться автоматически на 1 с каждым записанным байтом.

6) Бит подтверждения ACK будет генерироваться после каждого приема байта управления или байта данных.

7) Режим записи завершается, когда выдается сигнал STOP (stop condition). Сигнал STOP также показан на рис. 8-8. STOP устанавливается путем перевода SDA из лог. 0 в лог. 1, когда сигнал SCL находится на уровне лог. 1.

SSD1306 I2C START STOP fig8 8

Рис. 8-8. Определение событий сигналов START и STOP (START condition, STOP condition).

SSD1306 I2C ACK NACK fig8 9

Рис. 8-9. Определение ACK (подтверждение, acknowledgement condition).

Обратите внимание на некоторые важные особенности протокола шины I2C:

1. Бит данных, передаваемый с каждым импульсом SCL, должен оставаться в стабильном уровне, пока SCL находится в лог. 1. Это показано диаграммами на рис. 8-10. Кроме передачи сигналов START или STOP, сигнал SDA должен переключаться только тогда, когда SCL находится в лог. 0.

2. Оба сигнала, SDA и SCL, должны получать верхнюю подтяжку к лог. 1 с помощью внешних резисторов.

SSD1306 I2C data transfer fig8 10

Рис. 8-10. Как передаются биты данных.

Декодер команды. Этот блок определяет, как интерпретировать входные данные - либо как данные графики, либо как команду. Данные интерпретируются на основе бита D/C# (либо передаваемого через интерфейс, либо с помощью отдельного вывода D/C#).

Если D/C# в лог. 1, то D[7:0] интерпретируются как данные графики, записываемые в буфер Graphic Display Data RAM (GDDRAM). Если D/C# в лог. 0, то данные D[7:0] интерпретируются как команда. После поступления команды данные будут декодироваться, и записываться в соответствующий регистр команд.

Схема генератора и генератор интервалов времени (Oscillator Circuit и Display Time Generator). Этот блок содержит внутренний RC-генератор с малым энергопотреблением. Рабочая частота тактов (CLK) может генерироваться либо от внутреннего генератора, либо подаваться на вход CL от внешнего источника. Выбор источника тактирования делается ножкой CLS. Если на CLS лог. 1, то выбирается внутренний генератор, тогда ножка CL должна оставаться не подключенной. Если на CLS лог. 0, то внутренний генератор запрещается, и внешний тактовый сигнал должен быть подан на вывод CL. Когда выбран внутренний генератор, его выходная частота может быть изменена битами A[7:4] команды 0xD5.

SSD1306 clock fig8 11

Рис. 8-11. Oscillator Circuit и Display Time Generator.

Такты экрана (display clock, DCLK) для Display Timing Generator получаются из сигнала CLK. Команда 0xD5 программирует коэффициент деления D значением от 1 до 16:

DCLK = FOSC / D

Частота кадров экрана определяется по следующей формуле:

FFRM = FOSC / (D · K · NoOfMux)

Здесь:

• D обозначает коэффициент деления тактов. Он устанавливается битами A[3:0] команды 0xD5. Коэффициент деления должен быть в диапазоне 1 .. 16.

• K это количество тактов на строку экрана. Значение K вычисляется по формуле:

K = Phase 1 period + Phase 2 period + BANK0 pulse width, и после включения питания или сброса K = 2 + 2 + 50 = 54.

Подробнее см. секцию "Segment Drivers / Common Drivers", где дано определение для Phase (фаза сигнала управления сегментами).

• NoOfMux (Number of multiplex ratio, коэффициент умножения) устанавливается командой 0xA8. Значение по умолчанию 63 (т. е. 64MUX).

• FOSC это частота генератора. Её можно поменять битами A[7:4] команды 0xD5. Чем больше значение, тем выше частота.

Синхронизация FR. Сигнал синхронизации фрейма (кадра) FR может использоваться для предотвращения эффекта разрыва изображения (tearing effect).

SSD1306 FR synchronization

Время момента начала записи нового изображения в драйвер OLED зависит от скорости записи управляющего MCU. Если MCU может завершить запись образа экрана за один период фрейма, то это классифицируется как быстро записывающий MCU (fast write MCU). Для MCU, которому нужно больше времени для завершения записи (больше, чем один фрейм, но в пределах двух фреймов), это классифицируется как медленно записывающий MCU (slow write MCU).

Для fast write MCU: MCU должен запустить запись данных нового фрейма сразу после нарастания уровня импульса FR, и он должен завершить запись перед следующим нарастанием уровня импульса FR.

Для slow write MCU: MCU должен запустить запись данных нового фрейма после спада уровня первого импульса FR и должен завершить запись данных перед фронтом нарастания уровня третьего импульса FR.

Схема сброса (Reset Circuit). Когда на вход RES# подан лог. 0, то SSD1306 инициирует следующее состояние:

1. Экран выключается.
2. Активируется режим отображения 128 x 64.
3. Активируется обычное отображение данных дисплея на сегменты и строки (SEG0 отображается на адрес 0x00 и COM0 отображается на адрес 0x00).
4. Очищается регистр сдвига в последовательном интерфейсе.
5. Начальная строка экрана устанавливается на адрес 0 буфера экрана RAM.
6. Счетчик адреса столбца устанавливается в 0.
7. Устанавливается нормальное направление сканирование выходов COM.
8. Регистр управление контрастностью устанавливается в 0x7F.
9. Устанавливается нормальный режим отображения (эквивалентный команде 0xA4).

Segment Drivers / Common Drivers (SEGx/COMx). Драйверы сегмента SEG поставляют 128 источников тока для управления матрицей панели OLED. Управляющий ток может быть настроен в диапазоне от 0 до 100 мкА, всего 256 уровней настройки тока. Драйверы COM генерируют импульсы сканирования напряжения.

Процесс генерации сигнала управления сегментом делится на три фазы:

1. На phase 1, точка OLED, получившая заряд от предыдущего изображения, разряжается, чтобы подготовиться к отображению следующего содержимого экрана.

2. На phase 2, точка OLED устанавливается на целевое напряжение. На точку подается импульс тока, чтобы она достигла соответствующего уровня от напряжения VSS. Длительность периода phase 2 можно запрограммировать в значениями длины в диапазоне от 1 до 15 интервалов тактов DCLK. Если значение емкости точки панели OLED больше, то требуется больший период времени для заряда конденсатора точки, чтобы она достигла желаемого напряжения.

3. На phase 3, драйвер OLED переключается на использование источника тока для питания точек OLED, поэтому такая фаза называется фазой управляющего тока.

SSD1306 Segment Output Waveform fig8 12

Рис. 8-12. Форма сигнала выхода управления сегмента (SEG), состоящего из 3 фаз.

После завершения phase 3 драйвер микросхемы SSD1306 переходит обратно к phase 1, чтобы отобразить следующую строку данных изображения. Этот трехфазный цикл непрерывно работает для обновления изображения на панели OLED.

На phase 3 если ширина длительности импульса тока установлена на 50, то после завершения 50 периодов DCLK в фазе управляющего тока микросхема драйвера перейдет обратно к phase, чтобы отобразить следующую строку экрана.

[Graphic Display Data RAM (GDDRAM)]

GDDRAM это статическое ОЗУ (RAM), каждый бит которого соответствует точке на экране (буфер данных экрана). Размер этого RAM 128 x 64 бит, и RAM поделена на 8 страниц, от PAGE0 до PAGE7, что используется для монохромного матричного экрана 128x64 точек, как показано на рис. 8-13.

SSD1306 GDDRAM pages structure fig8 13

Рис. 8-13. Структура страниц GDDRAM контроллера SSD1306.

Примечание: "Column re-mapping" означает переназначение столбцов, "Row re-mapping" переназначение строк. PageX обозначает страницу памяти GDDRAM.

Когда один байт данных записывается в GDDRAM, то заполняются все данные на строках изображения этой страницы текущего столбца, т. е. весь столбец (8 точек), на который указывает текущий адрес столбца. Бит данных D0 записывается в верхнюю строку страницы, и так далее (бит D7 записывается в нижнюю строку страницы), как показано на рис. 8-14.

SSD1306 Enlargement GDDRAM fig8 14

Рис. 8-14. Организация GDDRAM по умолчанию, нет переназначения строк (без row re-mapping) и столбцов (без column-remapping).

Чтобы достичь гибкости в формировании изображения и разводки сигналов SEG и COM, можно программно изменить их привязку (Segment re-mapping, Common outputs re-mapping), как показано на рис. 8-13.

Для вертикального сдвига картинки на экране можно записать внутренний регистр, который хранит начальную строку экрана, что управляет порцией данных RAM, привязанных к экрану (см. команду 0xD3).

Этот блок используется для распределения поступающего питания на разные внутренние уровни напряжения и тока.

• VCC это положительное напряжение питания.
• VCOMH это уровень отмены выборки COM (Common deselected level). Генерируется внутри микросхемы контроллера.
• VLSS это путь для аналоговых токов и тока панели.
• IREF это опорный источник тока для драйверов тока сегментов ISEG. Взаимосвязь между опорным током и током сегмента следующая:

ISEG = Contrast / 256 · IREF · scalefactor

Значение Contrast (0 .. 255) устанавливается командой установки контраста (Set Contrast 0x81), и значение scalefactor по умолчанию равно 8.

Величина IREF управляется значением резистора, который подключен между ножкой IREF и VSS, как показано на рис. 8-15. Рекомендуется установить IREF в значение 12.5 ± 2 мкА, чтобы ISEG = 100 мкА был при максимальной контрастности 255.

SSD1306 IREF Current Setting fig8 15

Рис. 8-15. Настройка резистором тока IREF.

Поскольку напряжение на выводе IREF равно VCC – 2.5V, то значение резистора при условиях IREF = 12.5 мкА, VCC = 12V можно вычислить по формуле:

R1 = (Напряжение на IREF – VSS) / IREF = (12 – 2.5) / 12.5 мкА = 760 кОм

На следующих картинках показана рекомендуемая последовательность включения (power ON) и выключения (power OFF) для SSD1306.

Последовательность Power ON:

1. Подача питания на VDD.
2. После того, как напряжение VDD станет стабильным, перевод сигнала RES# в лог. 0 на время как минимум 3 мкс (t1)(4), после чего перевод RES# в лог. 1.
3. После перевода вывода RES# в лог. 0 подождать как минимум 3 мкс (t2). Затем подать питание VCC. (1)
4. После того, как VCC станет стабильным, послать команду 0xAF для включения дисплея. SEG/COM включатся через 100 мс (tAF).

SSD1306 Power ON sequence fig8 16

Рис. 8-16. Последовательность включения (Power ON).

Последовательность Power OFF:

1. Послать команду 0xAE для выключения дисплея.
2. Снять питание VCC. (1)(2)(3)
3. Снять питание VDD после tOFF (5) (типовое время tOFF = 100 мс).

SSD1306 Power OFF sequence fig8 17

Рис. 8-17. Последовательность выключения (Power OFF).

Примечания:

(1) Поскольку между VDD и VCC подключена схема защиты от ESD (статическое электричество), VCC становится ниже VDD всякий раз, когда на VDD подается питание и на VCC питания нет, что показано пунктирной линией VCC на рис. 8-16 и рис. 8-17.
(2) Уровень VCC должен удерживается плавающим (т. е. питание запрещено), когда VCC выключено.
(3) Выводы питания (VDD, VCC) никогда не должны подтягиваться к земле ни при каких условиях.
(4) Значения регистров сбрасываются после t1.
(5) Питание VDD не должно быть снято перед снятием питания VCC.

[Таблица команд SSD1306]

Таблица 9-1. Таблица команд при D/C#=0, R/W#(WR#) = 0, E(RD#=1), если не указано нечто другое.

1. Основные команды
D/C# Hex D7 D6 D5 D4 D3 D2 D1 D0 Команда Описание
0
0
81
A[7:0]
1
A7
0
A6
0
A5
0
A4
0
A3
0
A2
0
A1
1
A0
Set Contrast Control Команда из двух байт для выбора одной из 256 ступеней контрастности. Чем больше значение во втором байте, тем выше контрастность. Значение по умолчанию после сброса 0x7F.
0 A4/A5 1 0 1 0 0 1 0 X0 Entire Display ON 0xA4, X0=0: возобновить отображение содержимого RAM (состояние после сброса).
0xA5, X0=1: полное включение дисплея, вывод игнорирует содержимое RAM.
0 A6/A7 1 0 1 0 0 1 1 X0 Set Normal/Inverse Display 0xA6, X[0]=0: нормальное отображение (состояние по умолчанию после сброса). Лог. 0 бита соответствует погашенной точке, 1 светящейся точке.
A7, X[0]=1: инверсное отображение.
0 AE/AF 1 0 1 0 1 1 1 X0 Set Display ON/OFF 0xAE, X[0]=0: экран выключен (sleep mode, режим сна. Состояние после сброса).
0xAF X[0]=1: экран включен в нормальном режиме.

 

2. Команды скроллинга
D/C# Hex D7 D6 D5 D4 D3 D2 D1 D0 Команда Описание
0
0
0
0
0
0
0
26/27
A[7:0]
B[2:0]
C[2:0]
D[2:0]
E[7:0]
F[7:0]
0
0
*
*
*
0
1
0
0
*
*
*
0
1
1
0
*
*
*
0
1
0
0
*
*
*
0
1
0
0
*
*
*
0
1
1
0
B2
C2
D2
0
1
1
0
B1
C1
D1
0
1
X0
0
B0
C0
D0
0
1
Continuous Horizontal Scroll Setup 0x26, X0=0, горизонтальный сдвиг вправо,
0x27, X0=1, горизонтальный сдвиг влево (на один столбец).
A пустой байт.
B[2:0] определяет адрес начальной страницы:
000 PAGE0, .., 111 PAGE7.
C[2:0] установка интервала времени между каждым шагом в количестве кадров:
000 5 кадров, 001 - 64 кадра, 010 - 128 кадров, 011 - 256 кадров, 100 - 3 кадра, 101 - 4 кадра, 110 - 25 кадров, 111 - 2 кадра.
D[2:0] определяет адрес конечной страницы так же, как и B[2:0]. Однако значение D[2:0] должно быть больше или равно B[2:0].
E и F пустые байты.
0
0
0
0
0
0
29/2A
A[7:0]
B[2:0]
C[2:0]
D[2:0]
E[5:0]
0
0
*
*
*
*
0
0
*
*
*
*
1
0
*
*
*
E5
0
0
*
*
*
E4
1
0
*
*
*
E3
0
0
B2
C2
D2
E2
X1
0
B1
C1
D1
E1
X0
0
B0
C0
D0
E0
Continuous Vertical and Horizontal Scroll Setup 0x29, X1X0=01, вертикальный и горизонтальный сдвиг вправо,
0x2A, X1X0=10, вертикальный и горизонтальный сдвиг влево (на один столбец).
A пустой байт.
B[2:0] определяет адрес начальной страницы:
000 PAGE0, .., 111 PAGE7.
C[2:0] установка интервала времени между каждым шагом в количестве кадров:
000 5 кадров, 001 - 64 кадра, 010 - 128 кадров, 011 - 256 кадров, 100 -  3 кадра, 101 - 4 кадра, 110 - 25 кадров, 111 - 2 кадра.
D[2:0] определяет адрес конечной страницы так же, как и B[2:0]. Однако значение D[2:0] должно быть больше или равно B[2:0].
E[5:0] смещение прокрутки по вертикали. Например 0x01 означает смещение на 1 строку, 0x3F смещение на 63 строки.
Примечание: непрерывный скроллинг по вертикали недоступен.
0 2E 0 0 1 0 1 1 1 0 Deactivate scroll Останавливает прокрутку, которая была сконфигурирована командами 0x26, 0x27, 0x29, 0x2A.
Примечание: после отправки команды 0x2E данные RAM должны быть перезаписаны.
0 2F 0 0 1 0 1 1 1 1 Activate scroll Запуск прокрутки, которая была сконфигурирована командами 0x26, 0x27, 0x29, 0x2A, следующими допустимыми последовательностями команд:
0x26 0x2F
0x27 0x2F
0x29 0x2F
0x2A 0x2F
Например, если была выдана последовательность команд 0x26 0x2A 0x2F, то будет запущена прокрутка последняя настройка прокрутки для команды 0x2A. Другими словами, настройка последней команды установки прокрутки перезапишет настройки предыдущих команд установки прокрутки.
0
0
0
A3
A[5:0]
B[6:0]
1
*
*
0
*
B6
1
A5
B5
0
A4
B4
0
A3
B3
0
A2
B2
1
A1
B1
1
A0
B0
Set Vertical Scroll Area A[5:0] установит количество строк в верхней фиксированной области. Количество строк в верхней фиксированной области относится к верхней области GDDRAM (например к строке 0). Значение по умолчанию после сброса 0.
B[6:0] установит количество строк в области прокрутки. Это количество строк, которые будут использоваться в вертикальной прокрутке. Область прокрутки начинается в первой строке ниже фиксированной области. Значение по умолчанию после сброса 64.
Примечания:
1. A[5:0]+B[6:0] ≤ MUX ratio.
2. B[6:0] ≤ MUX ratio.
3. Смещение прокрутки по вертикали E[5:0] в командах 0x29h/0x2A.
4. Установка начальной строки экрана (X5..X0 от 0x40~0x7F < B[6:0]).
5. Последняя строка области прокрутки смещается в первую строку области прокрутки.
6. Для экрана с MUX=64:
A[5:0]=0, B[6:0]=64 задает прокрутку всего экрана,
A[5:0]=0, B[6:0] < 64 задает прокрутку верхней части,
A[5:0] + B[6:0] < 64 задает прокрутку средней части,
A[5:0] + B[6:0] = 64 задает прокрутку нижней части.

 

3. Команды установки адреса
D/C# Hex D7 D6 D5 D4 D3 D2 D1 D0 Команда Описание
0 00~0F 0 0 0 0 X3 X2 X1 X0 Set Lower Column Start Address for Page Addressing Mode Устанавливает младший ниббл регистра начального адреса столбца для режима адресации страниц (Page Addressing Mode) с помощью бит X[3:0]. После сброса начальное значение 0000.
Примечание: эта команда используется только для Page Addressing Mode.
0 10~1F 0 0 0 1 X3 X2 X1 X0 Set Higher Column Start Address for Page Addressing Mode Устанавливает старший ниббл регистра начального адреса столбца для режима адресации страниц (Page Addressing Mode) с помощью бит X[3:0]. После сброса начальное значение 0000.
Примечание: эта команда используется только для Page Addressing Mode.
0
0
20
A[1:0]
0
*
0
*
1
*
0
*
0
*
0
*
0
A1
0
A0
Set Memory Addressing Mode A[1:0] = 00, Horizontal Addressing Mode
A[1:0] = 01, Vertical Addressing Mode
A[1:0] = 10, Page Addressing Mode (значение по умолчанию после сброса)
A[1:0] = 11, недопустимый режим
0
0
0
21
A[6:0]
B[6:0]
0
*
*
0
A6
B6
1
A5
B5
0
A4
B4
0
A3
B3
0
A2
B2
0
A1
B1
1
A0
B0
Set Column Address Настройка адреса начального и конечного столбца.
A[6:0] адрес начального столбца в диапазоне 0..127 (значение по умолчанию после сброса 0).
B[6:0] адрес конечного столбца в диапазоне 0..127 (значение по умолчанию после сброса 127).
Примечание: эта команда применяется только для режимов горизонтальной или вертикальной адресации.
0
0
0
22
A[2:0]
B[2:0]
0
*
*
0
*
*
1
*
*
0
*
*
0
*
*
0
A2
B2
1
A1
B1
0
A0
B0
Set Page Address Настройка адреса начального и конечного столбца.
A[2:0] адрес начального столбца в диапазоне 0..7 (значение по умолчанию после сброса 0).
B[2:0] адрес конечного столбца в диапазоне 0..7 (значение по умолчанию после сброса 7). Примечание: эта команда применяется только для режимов горизонтальной или вертикальной адресации.
0 B0~B7 1 0 1 1 0 X2 X1 X0 Set Page Start Address for Page Addressing Mode Установка битами X[2:0] адреса начальной страницы GDDRAM (PAGE0~PAGE7) для Page Addressing Mode.
Примечание: эта команда применяется только для режима страничной адресации (Page Addressing Mode).

 

4. Команды аппаратной конфигурации (относятся к разрешающей способности панели и ориентации графики)
D/C# Hex D7 D6 D5 D4 D3 D2 D1 D0 Команда Описание
0 40~7F 0 1 X5 X4 X3 X2 X1 X0 Set Display Start Line Устанавливает битами X[5:0] регистр начальной строки в диапазоне 0..63. После сброса начальное значение 0.
0 A0/A1 1 0 1 0 0 0 0 X0 Set Segment Re-map 0xA0, X0=0: адрес столбца 0 отображается на SEG0 (состояние по умолчанию после сброса).
0xA1, X0=1: адрес столбца 127 отображается на SEG0.
0
0
A8
A[5:0]
1
*
0
*
1
A5
0
A4
1
A3
0
A2
0
A1
0
A0
Set Multiplex Ratio Установка коэффициента мультиплексирования (MUX ratio) для N+1 MUX.
N=A[5:0]: от 16MUX до 64MUX, значение по умолчанию после сброса равно 63, т. е. 64MUX.
Значения 0..14 недопустимы.
0 C0/C8 1 1 0 0 X3 0 0 0 Set COM Output Scan Direction 0xC0, X3=0: нормальный режим (состояние по умолчанию после сброса), сканирование от COM0 до COM[N-1].
0xC8, X3=1: remapped mode, сканирование от COM[N-1] до COM0.
Здесь N это MUX ratio (коэффициент мультиплексирования).
0
0
D3
A[5:0]
1
*
1
*
0
A5
1
A4
0
A3
0
A2
1
A1
1
A0
Set Display Offset Установка вертикального смещения COM от 0~63. Значение после сброса по умолчанию 0.
0
0
DA
A[5:4]
1
0
1
0
0
A5
1
A4
1
0
0
0
1
1
0
0
Set COM Pins Hardware Configuration A4=0, конфигурация последовательных выводов COM.
A4=1 (значение по умолчанию после сброса) альтернативная конфигурация выводов COM.
A5=0 (значение по умолчанию после сброса), Disable COM Left/Right remap.
A5]=1, Enable COM Left/Right remap.

 

5. Команды настройки интервалов времени и схемы драйверов
D/C# Hex D7 D6 D5 D4 D3 D2 D1 D0 Команда Описание
0
0
D5
A[7:0]
1
A7
1
A6
0
A5
1
A4
0
A3
1
A2
0
A1
1
A0
Set Display Clock Divide Ratio/Oscillator Frequency A[3:0] определение коэффициента деления (D) для тактов дисплея (DCLK). Коэффициент деления = A[3:0]+1. Значение по умолчанию после сброса 0, что соответствует коэффициенту деления 1.
A[7:4] установка частоты генератора FOSC. Чем больше значение A[7:4], тем выше частота генератора. Значение по умолчанию после сброса 8, допустимый диапазон 0..15.
0
0
D9
A[7:0]
1
A7
1
A6
0
A5
1
A4
1
A3
0
A2
0
A1
1
A0
Set Pre-charge Period A[3:0] установка периода Phase 1 до 15 импульсов DCLK. Значение 0 недопустимо, значение по умолчанию после сброса 2.
A[7:4] установка периода Phase 2 до 15 импульсов DCLK. Значение 0 недопустимо, значение по умолчанию после сброса 2.
0
0
DB
A[6:4]
1
0
1
A6
0
A5
1
A4
1
0
0
0
1
0
1
0
Set VCOMH Deselect Level 0x00 ~ 0.65 · VCC
0x20 ~ 0.77 · VCC
0x30 ~ 0.83 · VCC
Значение по умолчанию после сброса 0x20.
0 E3 1 1 1 0 0 0 1 1 NOP Пустая команда (нет операции).

Примечание: * означает "Don’t care", т. е. "не имеет значения".

Таблица 9-2. Команда чтения (Read Command).

Биты данных Команда Описание
D[7:0] Status Register Read D7: зарезервированный бит
D6: 1 когда дисплей выключен, 0 когда включен
D[5:0] зарезервированные биты

Примечание: данные команд, не присутствующие в таблицах, запрещены для ввода команды в чип SSD1306, иначе могут быть получены неожиданные результаты.

Чтение / запись данных. Чтобы прочитать данные из GDDRAM, установите лог. 1 для сигнала R/W# (WR#) и сигнала D/C# для режима параллельного интерфейса стиля 6800, и выберите лог. 0 для вывода E (RD#) и лог. 1 для вывода D/C# для параллельного интерфейса стиля 8080. В последовательных режимах работы интерфейса чтение данных не предоставляется.

В нормальном режиме чтения данных адрес столбца GDDRAM автоматически увеличивается при каждом чтении данных.

Также перед первым чтением требуется пустое чтение (dummy read).

Чтобы записать данные в GDDRAM, установите лог.0 на выводе R/W# (WR#) и лог. 1 на выводе D/C# для режима параллельного интерфейса стиля 6800 и стиля 8080. Последовательные режимы интерфейса всегда работают в режиме записи. Адрес столбца GDDRAM автоматически увеличивается после каждой записи данных.

Таблица 9-3. Автоматический инкремент адреса.

D/C# R/W#(WR#) Комментарий Инкремент адреса
0 0 Write Command (запись команды) Отсутствует
0 1 Read Status (чтение состояния) Отсутствует
1 0 Write Data (запись данных) Есть
1 1 Read Data (чтение данных) Есть

[Описание команд]

Основные команды

Эта команда задает младший ниббл 8-битного адреса столбца для буфера RAM экрана в режиме адресации страницы (Page Addressing Mode). Адрес столбца будет инкрементироваться при каждом доступе к данным. Обратитесь а таблице 9-1 и описанию команды Set Memory Addressing Mode (0x20).

Эта команда задает старший ниббл 8-битного адреса столбца для буфера RAM экрана в режиме адресации страницы (Page Addressing Mode). Адрес столбца будет инкрементироваться с каждым доступом к данным. Пожалуйста обратитесь к таблице 9-1 и описанию команды Set Memory Addressing Mode (0x20).

Имеется 3 разных режима адресации памяти SSD1306: page addressing mode, horizontal addressing mode и vertical addressing mode. Эта команда устанавливает способ адресации памяти в один из этих трех режимов. Здесь COL означает столбец данных RAM графического дисплея.

Page addressing mode (A[1:0] = 10)

В этом режиме адресации после того, как был осуществлен доступ к RAM (на чтение или запись), указатель адреса столбца автоматически увеличивается на 1. Если адрес столбца достигает конечного столбца, то указатель адреса столбца сбрасывается к адресу начального столбца, и адрес указателя на страницу не меняется. Пользователи должны установить адрес новой страницы и адрес нового столбца, чтобы получить доступ к содержимому другой страницы RAM. Последовательность перемещения указателя адреса PAGE и COL для page addressing mode показана на рис. 10-1.

SSD1306 Page Addressing Mode fig10 1

Рис. 10-1. Перемещение указателя адреса в Page Addressing Mode.

Для нормального чтения или записи данных RAM экрана в page addressing mode требуются следующие шаги для определения начального адреса доступа к RAM:

• Установите начальный адрес страницы целевой области дисплея командами от 0xB0 до 0xB7.
• Установите нижний начальный адрес указателя столбца командой 0x00 .. 0x0F.
• Установите верхний начальный адрес указателя столбца командой 0x10 .. 0x1F.

Например, если адрес страницы установлен на 0xB2, нижний адрес столбца 0x03 и верхний адрес столбца 0x10, то это означает начальный столбец SEG3 страницы PAGE2. Указатель доступа к RAM находится в месте, показанном на рис. 10-2. Входной байт данных будет записан в позицию RAM столбца 3.

SSD1306 example GDDRAM access fig10 2

Рис. 10-2. Пример установки указателя доступа GDDRAM в Page Addressing Mode (без переназначений строк и столбцов).

Horizontal addressing mode (A[1:0]=00)

В режиме горизонтальной адресации после каждого доступа к данным RAM экрана адрес указателя столбца автоматически увеличивается на 1. Если адрес столбца достиг последнего столбца, то адрес сбрасывается к начальному столбцу, и указатель на адрес страницы увеличивается на 1. Последовательность изменения адресов страницы и столбца в этом режиме показана на рис. 10-3. Когда оба адреса, и адрес столбца, и адрес страницы, достигают конца, то эти указатели сбрасываются в адрес начального столбца и адрес начальной страницы (пунктирная линия на рис. 10-3).

SSD1306 Horizontal Addressing Mode fig10 3

Рис. 10-3. Перемещение указателя адреса в Horizontal Addressing Mode.

Vertical addressing mode: (A[1:0]=01)

В режиме вертикальной адресации после доступа к RAM дисплея указатель адреса страницы автоматически увеличивается на 1. Если указатель адреса страницы достиг последней страницы, то адрес страницы сбрасывается в адрес начальной страницы, и адрес начального столбца увеличивается на 1. Последовательность изменения адресов страницы и столбца в этом режиме показана на рис. 10-4. Когда оба адреса, и адрес столбца, и адрес страницы, достигают конца, то эти указатели сбрасываются в адрес начального столбца и адрес начальной страницы (пунктирная линия на рис. 10-4).

SSD1306 Vertical Addressing Mode fig10 4

Рис. 10-4. Перемещение указателя адреса в Vertical Addressing Mode.

Чтобы осуществить обычный доступ к данным RAM экрана для чтения или записи в режимах адресации Horizontal / Vertical, требуются следующие шаги для определения места указателя доступа к RAM:

• Установите начальный и конечный адреса столбца места на экране командой 0x21.
• Установите адрес начальной страницы и адрес конечной страницы командой 0x22.

Пример показан на рис. 10-5 в описании команды Set Page Address (0x22).

Эта команда из трех байт задает начальный и конечный адреса данных RAM экрана. Эта команда также устанавливает указатель адреса столбца на начальный адрес столбца. Этот указатель используется для определения текущего адреса столбца для чтения/записи данных RAM экрана. Если командой 0x20 разрешен horizontal address increment mode, то после завершения чтения/записи одного столбца данных указатель автоматически инкрементируется на следующий адрес столбца. Всякий раз, когда адрес столбца завершает доступ к адресу последнего столбца, он сбрасывается обратно к начальному адресу столбца, и адрес строки увеличивается для доступа к следующей строке.

Эта команда из трех байт задает начальный адрес страницы и конечный адрес страницы данных RAM экрана. Эта команда также устанавливает указатель адреса страницы на начальный адрес страницы. Этот указатель используется для определения текущей позиции чтения/записи данных RAM экрана. Если командой 0x20 разрешен vertical address increment mode, то после завершения чтения/записи одной страницы данных адрес автоматически инкрементируется на адрес следующей страницы. Всякий раз, когда указатель адреса страницы завершает доступ к последнему адресу страницы, то он сбрасывается обратно к начальному адресу страницы.

Рис. 10-5 показывает на примере, как меняются адреса столбца и страницы: начальный адрес столбца устанавливается на 2, конечный адрес столбца устанавливается на 125, начальный адрес страницы устанавливается на 1 и конечный адрес страницы устанавливается на 6. Командой 0x20 разрешается horizontal address increment mode. В этом случае допустимый диапазон доступа к столбцам устанавливается между 2 и 125 столбцами, и допустимый диапазон доступа к страницам устанавливается между 1 и 6. Дополнительно указатель адреса столбца устанавливается на 2, и указатель адреса страницы устанавливается на 1. После завершения чтения/записи одной точки данных адрес столбца автоматически увеличивается на 1 для доступа к следующей ячейке RAM на следующей операции (сплошная линия на рис. 10-5). Всякий раз, когда указатель адреса столбца достигает конечного столбца 125, он сбрасывается обратно с столбцу 2, и адрес страницы автоматически увеличивается на 1 (сплошная линия на рис. 10-5). Когда осуществлен доступ на последней странице 6 и последнему столбцу 125, адрес страницы сбрасывается обратно к 1, и адрес столбца сбрасывается обратно к 2 (пунктирная линия на рис. 10-5).

SSD1306 Example Column and Row Address Pointer Movement fig10 5

Рис. 10-5. Пример перемещения указателя адреса столбца и строки.

Эта команда устанавливает регистр начальной строки (Display Start Line), чтобы определить начальный адрес RAM экрана, путем выбора значения от 0 до 63. Когда значение равно 0, строка 0 RAM отображается на COM0. Когда значение равно 1, строка 1 RAM отображается на COM0, и так далее.

Для дополнительной информации обратитесь к таблице 10-1 в описании команды Set Display Offset (0xD3).

Эта команда устанавливает настройку контрастности экрана. Имеется 256 шагов настройки контрастности от 0x00 до 0xFF. Выходной ток сегмента увеличивается при увеличении значения контрастности.

Эта команда меняет привязку данных адреса столбца и драйвера сегмента. Это добавляет гибкости в разработке модуля OLED. См. таблицу команд 9-1.

Эта команда влияет только на последующий ввод данных. Данные, уже сохраненные в GDDRAM, не меняются.

Команда 0xA4 разрешает отображение на экране в соответствии с содержимым GDDRAM. Если выдана команда 0xA5 и затем выдана команда 0xA4, то продолжится отображение содержимого GDDRAM. Другими словами, команда 0xA4 возобновляет отображение экрана всего экрана от стадии включения. Команда 0xA5 принудительно включает отображение, независимо от содержимого данных RAM экрана.

Эта команда устанавливает отображение данных в нормальном или инверсном виде. При нормальном отображении лог. 1 данных RAM соответствует включенному (засвеченному) пикселю экрана. В инверсном режиме все наоборот, значение бита в лог. 0 соответствует включенному пикселю экрана.

Эта команда переключает режим мультиплексирования по умолчанию 63 на любой коэффициент мультиплексирования в диапазоне от 16 до 63. Выходные выводы COM0 .. COM63 будут переключать соответствующий сигнал COM.

Эти однобайтные команды используются для включения и выключения панели экрана OLED. Когда экран включен, то выбранные командой Set Master Configuration схемы будут включены. Когда экран выключен, то эти схемы будут выключены, и выходы SEG и COM будут соответственно в состоянии VSS и высокого сопротивления. Эти команды устанавливают экран в одно из двух состояний:

0xAE: Display OFF (экран выключен)
0xAF: Display ON (экран включен)

SSD1306 transition between different modes fig10 6

Рис. 10-6. Переход между разными режимами.

Эта команда устанавливает начальный адрес страницы GDDRAM в значение от 0 до 7 в режиме Page Addressing Mode. См. таблицу 9-1 и описание команды Set Memory Addressing Mode (0x20).

Эта команда устанавливает направление сканирования выхода COM, добавляя гибкость для дизайна модуля OLED. Дополнительно на экране отобразятся изменения при выдаче этой команды. Например, если эта команда была отправлена во время нормального отображения графики на экране, то изображение немедленно будет перевернуто по вертикали. Подробности см. в таблице 10-3 из описания команды Set COM Pins Hardware Configuration (0xDA).

Это двухбайтная команда. Второй байт задает привязку начальной строки дисплея к одному из выходов драйвера COM0 .. COM63 (предполагается, что если COM0 соответствует начальной строке экрана, тогда значение регистра начальной строки экрана равно 0).

Например, чтобы переместить строку COM16 в направлении COM0 на 16 строк, то 6-битные данные во втором байте должны быть b010000. Чтобы переместить картинку в противоположном направлении на 16 строк, эти 6-битные данные должны быть равны 64 – 16, что соответствует второму байту b100000. Следующие две таблицы (таблица 10-1, таблица 10-2) показывают пример установки команд 0xC0/0xC8 и 0xD3.

Таблица 10-1. Пример Set Display Offset и Display Start Line без переназначения (no Remap).

[]

Таблица 10-2. Пример Set Display Offset и Display Start Line с переназначением (Remap).

[]

Примечание: таблицы 10-1 и 10-2 здесь не приведены из-за своего большого размера, см. оригинальный документ [1].

Эта команда состоит из двух функций:

• Display Clock Divide Ratio (установка D, биты A[3:0]). Это установит коэффициент деления для генерации DCLK (Display Clock) из CLK. Коэффициент деления может быть в диапазоне от 1 до 16, значение сброса = 1. Подробнее про соотношение между DCLK и CLK см. в секции "Схема генератора и генератор интервалов времени".
• Oscillator Frequency (биты A[7:4]). Программируют частоту Fosc, которая является источником для генерации CLK, если на выводе CLS лог. 1. Это 4-битное значение дает 16 разных значений частот, что показано ниже. Значение по умолчанию b1000.

Эта команда используется для установки длительности периода pre-charge. Устанавливаемый интервал измеряется в количестве DCLK, где RESET эквивалентен 2 периодам DCLK.

Эта команда устанавливает конфигурацию сигналов COM, чтобы она соответствовала аппаратной разводке сигналов панели OLED. Таблица ниже показывает конфигурацию выводов COM при разных условиях (для коэффициента MUX = 64):

Таблица 10-3. Аппаратная конфигурация выводов COM.

Условия Конфигурации выводов COM
1. Последовательная конфигурация выводов COM (Sequential COM), команда 0xDA со значением A4=0. Направление сканирования выходов COM от COM0 до COM63 (0xC0). Disable COM Left/Right remap, команда 0xDA со значением A5=0.
2. То же самое, что и 1, с отличием Enable COM Left/Right remap, команда 0xDA со значением A5=1.
3. То же самое, что и 1, с отличием в направлении сканирования от COM63 до COM0 (0xC8).
4. Последовательная конфигурация выводов COM (Sequential COM), команда 0xDA со значением A4=0. Направление сканирования выходов COM от COM63 до COM0 (0xC8). Enable COM Left/Right remap, команда 0xDA со значением A5=1.
5. Альтернативная конфигурация выводов COM (Alternative COM), команда 0xDA со значением A4=1. Направление сканирования выходов COM от COM0 до COM63 (0xC0). Disable COM Left/Right remap, команда 0xDA со значением A5=0.
6. То же самое, что и 5, с отличием Enable COM Left/Right remap, команда 0xDA со значением A5=1.
7. То же самое, что и 5, с отличием в направлении сканирования от COM63 до COM0 (0xC8).
8. Альтернативная конфигурация выводов COM (Alternative COM), команда 0xDA со значением A4=1. Направление сканирования выходов COM от COM63 до COM0 (0xC8). Enable COM Left/Right remap, команда 0xDA со значением A5=1.

Примечание: строки на картинках, помеченные желтыми пунктирными линиями, расширяют размеры экрана.

Эта команда настраивает выход регулятора напряжения VCOMH.

No Operation Command, команда пустой операции.

Чтение регистра состояния (Status register Read). Эта команда выдается путем установки D/C# в лог. 0 на время чтения данных (см. рис. 13-1 и рис. 13-2, где показаны сигналы параллельного интерфейса). Это позволяет MCU мониторить внутреннее состояние чипа SSD1306. В режиме последовательных интерфейсов чтение состояния не предоставляется.

Команды управления графикой (Graphic Acceleration Command)

Эта команда состоит из последующих байт для установки параметров горизонтального скроллинга (прокрутки изображения), и определяет начальную страницу скроллинга, конечную страницу скроллинга и скорость скроллинга.

Перед выдачей этой команды горизонтальный скроллинг должен быть деактивирован (командой 0x2E). Иначе содержимое RAM может быть повреждено.

Горизонтальный скроллинг SSD1306 разработан для прокрутки 128 столбцов. Рисунки 10-7, 10-8, 10-9 даташита [1] показывают примеры использования горизонтального скроллинга.

Эта команда состоит из 6 последующих байт, предназначенных для установки параметров вертикального скроллинга (прокрутки изображения). Параметры определяют начальную, конечную страницу скроллинга, скорость скроллинга и смещение вертикального скроллинга.

Байты B[2:0], C[2:0] и D[2:0] команд 0x29/0x2A предназначены для установки непрерывного горизонтального скроллинга. Байт E[5:0] предназначен для установки смещения непрерывного вертикального скроллинга. Все эти байты вместе используются для установки непрерывного диагонального (прокрутка по горизонтали + прокрутка по вертикали) скроллинга. Если байт смещения вертикального скроллинга E[5:0] установлен в 0, то выполняется только горизонтальный скроллинг (наподобие действия команд 0x26/0x27).

Перед выдачей этой команды скроллинг должен быть деактивирован (0x2E). Иначе содержимое RAM может быть повреждено. Рис. 10-10 даташита [1] показывает пример использования вертикальной и горизонтальной прокрутки.

Эта команда останавливает прокрутку. После того, как отправка команды 0x2E деактивирует действие прокрутки, данные RAM должны быть перезаписаны.

Эта команда запускает движение скроллинга, и она должна выдаваться только после того, как настроены параметры прокрутки командами 0x26/0x27/0x29/0x2A. Установка последней команды настройки скроллинга перезаписывает установки предыдущих команд настройки скроллинга.

После активации скроллинга запрещены следующие действия:

1. Доступ к RAM (на чтение и запись).
2. Изменение параметров горизонтальной прокрутки.

Эта команда состоит из 3 последующих байт, предназначенных для настройки области вертикальной прокрутки. Для функции непрерывной прокрутки по вертикали (команда 0x29/0x2A), количество строк прокрутки по вертикали может быть меньше или равно коэффициенту MUX.

[Предельные параметры]

Таблица 11-1. Предельно допустимые параметры (напряжения измерены относительно VSS).

Символ Параметр Значение Ед.
VDD Питание ядра логики контроллера -0.3 .. +4 V
VCC Питание сегментов экрана 0 .. 16 V
VSEG Выходное напряжение SEG 0 .. VCC V
VCOM Выходное напряжение COM 0 .. 0.9VCC V
Vin Входное напряжение VSS-0.3 .. VDD+0.3 V
TA Рабочая температура окружающего воздуха -40 .. +85 °C
Tstg Температура хранения -65 .. +150 °C

Предельные параметры это значения, эксплуатация изделия возле которых может его повредить. Функционирование должно быть ограничено пределами, указанными в таблицах электрических характеристик или в секции описания выводов.

Это устройство может быть чувствительно к действию света. Следует избегать облучение устройства источниками света во время его нормальной работы. Это устройство не защищено от радиации.

[Характеристики постоянного тока]

Даны параметры для следующих условий (если не указано что-то другое): напряжения измерены относительно VSS, VDD = 1.65V .. 3.3V, TA = 25°C.

Таблица 12-1. DC-характеристики (постоянный ток).

[]

Примечание: таблицу 12-1 см. в даташите [1].

[Характеристики переменного тока]

Даны параметры для следующих условий: напряжения измерены относительно VSS, VDD = 1.65V .. 3.3V, TA = 25°C.

Таблица 13-1. AC-характеристики (переменный ток).

Символ Параметр MIN typ MAX Ед.
FOSC(1)
Частота генератора для формирования интервалов времени управления экраном. Приведены значения для VDD = 2.8V. 333 370 407 кГц
FFRM Частота кадров для режима 64MUX. Режим отображения 128x64 точки, экран включен, разрешен внутренний генератор. - FOSC / (D·K·64)(2) - Гц
RES# Длительность лог. 0 импульса сброса 3 - - мкс

Примечания:

(1) FOSC означает значение частоты внутреннего генератора, и это значение было измерено, когда командой 0xD5 (биты A[7:4]) установлено значение по умолчанию.
(2) D: коэффициент деления (значение по умолчанию = 1). K: количество тактов дисплея (значение по умолчанию = 54).

Обратитесь к таблице 9-1 (описание команды Set Display Clock Divide Ratio / Oscillator Frequency, 0xD5) для получения подробного описания.

Значения интервалов времени и временные диаграммы для параллельного интерфейса стиля 6800 см. в таблице 13-2 и на рис. 13-1 даташита [1]. Значения интервалов времени и временные диаграммы для параллельного интерфейса стиля 8080 см. в таблице 13-3 и на рис. 13-2 даташита [1].

Значения интервалов времени и временные диаграммы для 4-проводного SPI см. в таблице 13-4 и на рис. 13-3. Значения интервалов времени и временные диаграммы для 3-проводного SPI см. в таблице 13-5 и на рис. 13-4.

Таблица 13-6. Характеристики интервалов времени интерфейса I2C.

Символ Параметр MIN typ MAX Ед.
tcycle Время периода тактов данных. 2.5 - - мкс
tHSTART Время удержания для START condition. 0.6 - - мкс
tHD Время удержания данных для вывода SDAOUT 0 - - нс
Время удержания данных для вывода SDAIN 300 - - нс
tSD Время установки данных 100 - - нс
tSSTART Время установки для START condition (параметр актуален только для повторяющихся сигналов START condition) 0.6 - - мкс
tSSTOP Время установки для STOP condition 0.6 - - мкс
tR Время нарастания лог. уровня сигналов SDA и SCK - - 300 нс
tF Время спада лог. уровня сигналов SDA и SCK - - 300 нс
tIDLE Время ожидания перед тем, как может начаться новая передача 1.3 - - мкс

SSD1306 I2C timing fig13 5

Рис. 13-5. Характеристики интервалов времени интерфейса I2C.

[Программное конфигурирование]

У контроллера SSD1306 имеется внутренние регистры команд, которые используются для конфигурирования работы узлов драйвера OLED. После сброса или включения питания эти регистры должны быть установлены в нужные параметры, чтобы дисплей OLED функционировал правильно. К регистрам можно получить доступ через один из вариантов интерфейса MCU (типа 6800, 8080, SPI с выводом D/C#, подтянутым к лог. 0, или через интерфейс I2C). Ниже дан пример алгоритма инициализации SSD1306. Значения регистров зависят от разных условий и требований приложения.

SSD1306 Software Initialization Flow Chart fig2

Рис. 2. Последовательность программной инициализации SSD1306.

[Ссылки]

1. 128 x 64 Dot Matrix OLED/PLED Segment/Common Driver with Controller.
2. SSD1322: контроллер/драйвер для дисплеев OLED/PLED.

 

Комментарии  

 
0 #11 Alex 12.06.2023 00:51
Как читать память ssd1306?
Цитировать
 
 
+1 #10 Антон 24.10.2022 11:23
Команда 0x22 похоже неправильное описание, должна быть страница.
Цитировать
 
 
0 #9 Vadya_ME 24.01.2022 07:20
Цитирую w5277c:


Задолбали фанатики Си и копипастеры.

Не слушайте их, нарабатывайте библиотеки для асма и вперед. Будете хорошо понимать как оно все работает, и откроется Вам огромный мир сишного быдлокода.


Подписываюсь под каждым словом!
Цитировать
 
 
+6 #8 w5277c 17.06.2021 08:38
Цитата:
microsin: то, что Вы пишете на ассемблере, несколько затрудняет адаптацию индикатора, потому что не дает легко воспользоваться готовым кодом. ...


Конечно затрудняет адаптацию, когда мозг работает только в режиме взять глючное чужое, прикрутить пару команд и выдать за свое. Смотри мама, я инженер. Не инженер ты, ты техник, а возможно даже ардуинщик.

Задолбали фанатики Си и копипастеры.

Не слушайте их, нарабатывайте библиотеки для асма и вперед. Будете хорошо понимать как оно все работает, и откроется Вам огромный мир сишного быдлокода.
Цитировать
 
 
0 #7 Viacheslav 01.12.2020 21:49
Цитирую Viacheslav:
Возможно ли изменить скорость передачи данных по I2C с 400 кГц до 100 кГц. Если да, то как?

microsin: скорость I2C зависит не от SSD1306, а исключительно от внешнего микроконтроллер а, мастера шины I2C. Таким образом, какую скорость у мастера запрограммирует е, такая и будет. 400 кГц, 200 кГц, 100 кГц, 10 кГц, не имеет никакого значения, все будет работать одинаково. Иногда можно и 800 кГц настроить, все зависит от заявленных предельных минимальных таймингов участников обмена, длины шины, её нагруженности и т. д.


При установке частоты ниже 134 кГц - на дисплее вижу "мусор", "снег". На частотах 134 кГц - 1,3 МГц - всё работает как часики. Какая причина пока так и не понял. Данные не укладываются что ли? Контроллер STM32F103C8T6, OLED SSD1306 128x32, STM32CubeIDE 1.4.2.
Цитировать
 
 
0 #6 Viacheslav 01.12.2020 15:56
Возможно ли изменить скорость передачи данных по I2C с 400 кГц до 100 кГц. Если да, то как?

microsin: скорость I2C зависит не от SSD1306, а исключительно от внешнего микроконтроллер а, мастера шины I2C. Таким образом, какую скорость у мастера запрограммирует е, такая и будет. 400 кГц, 200 кГц, 100 кГц, 10 кГц, не имеет никакого значения, все будет работать одинаково. Иногда можно и 800 кГц настроить, все зависит от заявленных предельных минимальных таймингов участников обмена, длины шины, её нагруженности и т. д.
Цитировать
 
 
0 #5 Дмитрий Иванов 16.06.2020 23:54
Доброго времени суток. Изучил вашу статью вдоль и поперек, лучший материал пожалуй. 3 дня не могу дать ладу дисплею OLED 128x32 I2C, интерфейс софтовый. Перечитал уже весь инет, но из-за ардуинщиков ничего годного из примеров не найти. Проблема в чем, дисплей инициализируетс я все настраивается, но каждый байт в строке отображает только 4 младших бита. Все остальное отображает как помехи. Даже дисплей не очистить, остаются полоски на все строки по половине. Что бы это могло быть? Дисплей рабочий, проверял на другой не моей программе. Пишу на ASM, нужна своя библиотека. Помогите пожалуйста, уже нервы сдают :sad:

microsin: то, что Вы пишете на ассемблере, несколько затрудняет адаптацию индикатора, потому что не дает легко воспользоваться готовым кодом. Я бы посоветовал следующее: скачайте готовую библиотеку для этого индикатора (например от AdaFruit). Дальше у Вас 2 варианта - либо по коду разобраться в алгоритме обмена, либо тупо скомпилировать библиотеку и вызывать её функции из кода ассемблера. Обычно низкоуровневый код работы с индикатором простой. Либо можно микшировать в одном проекте C-код с кодом ассемблера. Что для Вас проще - выбирайте сами.
Цитировать
 
 
0 #4 Zhuk72 30.03.2020 22:09
Цитирую Ebjik:
Вожусь с этим дисплеем, скурил не один десяток мануалов, но ни в одном не нашел схему инициализации дисплея (а он у местных умельцев есть).

Если протокол передачи I2C или SPI (мой случай), и микроконтроллер настроен правильно (частота до 10 МГц, в простое дата и такты на нуле), то после 3-5 мкс ресета достаточно одну за другой подать команды: 0xD5,0x80,0x8D, 0x14,0xAF. Теперь можно отправлять данные. Для проверки инициализации можете отправить команду 0xA5, в этом случае дисплей должен зажечь все пиксели. Командой 0xA4 возвращаетесь к работе с ОЗУ дисплея.
Для проверки правильности работы протокола рекомендую приобрести логический анализатор, иначе будете брести в потемках. Вещь дешевая, но незаменимая.
Цитировать
 
 
0 #3 Max 01.03.2020 15:54
Цитирую Max:
После замены AMS1117-3.3 на экране, изображение зеркально отображается. И заводится он только с OLED_I2C, с фруктовыми и другими библиотеками вообще ни в какую. Куда копать? На команды с переворотами не реагирует :cry:

microsin: странная ситуация. Попробуйте передавать данные строки в обратном порядке.


Все тоже самое :/ Если допустим нарисовать пиксель myOLED.setPixel(0, 0); он рисуется в левом нижнем углу. Хотя должен в верхнем.

microsin: посмотрите код функций высокоуровневых библиотек рисования графики, и подправьте в них координаты следующим образом: Y = height - Y, и X = width - X. Возможно, в библиотеках уже изначально предусмотрены опции времени компиляции (#define), которые поддерживают инверсию сторон экрана.
Цитировать
 
 
0 #2 Max 16.02.2020 23:44
После замены AMS1117-3.3 на экране, изображение зеркально отображается. И заводится он только с OLED_I2C, с фруктовыми и другими библиотеками вообще ни в какую. Куда копать? На команды с переворотами не реагирует :cry:

microsin: странная ситуация. Попробуйте передавать данные строки в обратном порядке.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page