ПОДКЛЮЧЕНИЕ ДИСПЛЕЯ NOKIA 1616 НА ПРИМЕРЕ LPC1343
Дисплей с подсветкой, имеет разрешение 128х160 пикселей и глубину цвета 18 бит. Размеры примерно 28х36мм. шлейф имеет 12 контактных площадок (1-я и 12-я не подключены) с шагом 0.5мм. Логика вся работает от 3.3В и лучше не завышать. От 5В скорее всего сгорит. На подсветку надо около 7В.
UPD: По правильному на питание цифровой схемы надо подать 1.8В и на аналоговую 2.7В, но всё прекрасно работает и от одного источника 3.3В (уже пол года не сгорело ничего), по даташитам это напряжение в пределах допустимого. Так же в комментариях отмечено что появились дисплеи с 3В подсветкой, мне на днях похоже такой же попался, имейте это ввиду.
Работа с дисплеем аналогична работе с Nokia 6100 (статей на эту тему предостаточно) по тому глубоко вдваться не стану, а сконцентрируюсь на различиях.
Отмечу что мне попадалось 2 разновидности дисплеев, но оба работают с данным кодом. Различить их можно по форме шлейфа. Шлейф в форме буквы T — хороший дисплей, верх будет со стороны шлейфа. Если же шлейф просто прямоугольный выходит, то со стороны шлейфа у вас будет низ и ужасно тусклая подстветка. Не знаю, то ли мне бракованный дисплей попался, толи они все такие. На счет подсветки и качества соврал. Промывал от канифоли плату спиртом, в итоге просто слои рассеивателей и поляризаторов разошлись. Не давайте спиртного дисплею, он спивается быстро! :)
В моём варианте работает следующая схема включения:
Важно! на данной схеме учтены только «подключенные» выводы, крайние в счет не берутся. Таким образом 1-й вывод на схеме соответствует 2-му на дисплее. 10 вывод схемы — 11-му на дисплее.
Данный дисплей, как и большенство других цветных Nokia, для взаимодействия использует интерфейс SPI 9 бит. Возможно взаимодействие в режимах 0 и 3 (если память не изменяет). Успешно работает на скоростях 4Мб/с и 9Мб/с, больше проверять не стал. Линия данных на самом деле у дисплея двунаправленная и по ней можно считать такую информацию как ID контроллера в дисплее, но мы её быдем использовать только для записи.
Старший бит является признаком данных: для команды он равен 0, для данных 1. младшие 8 бит содержат либо сами данные, либо код команды.
Ну и естественно перед работой с дисплеем его надо сбросить. делаеся это выбором дисплея и подачей на вывод Reset низкого уровня в моём случае на 100мс. После снятия сброса надо так же выдержать паузу, что бы дисплей успел инициализироваться.
Перечислять команды дисплея не буду, поскольку сам их не знаю. Но большенство команд едины для разных моделей дисплеев и при желании сможете разобраться сами.
И так, получается следующий набор функций (для LPC1343)
// Reset SSP (пункт 4)
LPC_SYSCON->PRESETCTRL |= (1<<0); // 1 в бит RST_SSP_0
// Enable AHB clock to the SSP domain. (пункт 2)
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<11);
// Divide by 1 (SSPCLKDIV also enables to SSP CLK) (пункт 3)
LPC_SSP->CPSR = 0; // отключим тактирование (а то мало ли)
// Set P0.9 to SSP MOSI
LPC_IOCON->PIO0_9 |= (1<<0); // использовать как вывод MOSI
LPC_IOCON->PIO0_9 |= IOCON_COMMON_MODE_PULLUP;
// Set 2.11 to SSP SCK (0.6 and 0.10 can also be used)
LPC_IOCON->SCKLOC = 1; // SCK на вывод 2.11
(7<<0); // сброс текущей функции порта ввода-вывода
LPC_IOCON->PIO2_11 |= (1<<0); // использовать как вывод SCK
LPC_IOCON->PIO2_11 |= IOCON_COMMON_MODE_PULLUP;
// Set P0.2/SSEL to GPIO output and high
(7<<0); // сброс текущей функции порта ввода-вывода
LPC_IOCON->PIO0_2 |= (1<<0); // использовать как вывод SSEL (можно обычным GPIO как 0)
LPC_IOCON->PIO0_2 |= IOCON_COMMON_MODE_PULLUP;
// If SSP0CLKDIV = DIV1 -- (PCLK / (CPSDVSR X [SCR+1])) = (72,000,000 / (2 x [3 + 1])) = 9.0 MHz
LPC_SSP->CR0 = ( (8<<0) // Размер данных 1000 - 9 бит
| (0<<4) // Формат фрейма 00 - SPI
| (0<<6) // Полярность 0 - низкий уровень между фреймами
| (0<<7) // Фаза 0 - по нарастанию
| (3<<8) // Делитель частоты шины на бит
// Clock prescale register must be even and at least 2 in master mode
LPC_SSP->CPSR = 2; // пердделитель 2-254 (кратно 2)
// Enable device and set it to master mode, no loopback (разрешаем работу)
LPC_SSP->CR1 = ( (0<<0) // 0 - Loop Back Mode Normal
| (1<<1) // Разрешение работы 1 - разрешено
| (0<<2) // Режим ведущий-ведомый 0 - мастер
void SPI_send(uint16_t value)