Использование USART stm32 для управления LCD Nokia 1202

В магазине кончились дисплеи от nokia 3310. Проба дисплея nokia 1100 была неудачной. Как потом прочитал на сайте ziblog, напряжение питания ему можно подавать 2,8 вольт. От 3,3 вольт он портится. На дисплей 1202 выбор пал по нескольким причинам
1. Телефон с этим дисплеем до сих пор производится и продается (Nokia 1280)
2. Известен протокол и распиновка
3. Имеет шлейф, к контактам которого можно подпаяться (шаг 0,6 мм)
Дисплей имеет контроллер STE2007. Предусматривает 9 битный последовательный интерфейс. В старшем бите передается признак, что последующие 8 бит — это данные (или команда).
Если включать дисплей с командами инициализации, приведенными на сайте велика вероятность, что он сгорит при питании от 3,3 вольт. Дело в том, что максимальное напряжение LCD для него — 14 вольт. Умножение 3,3 вольт на 5 дает более 15 вольт == возможно сгоревший дисплей. Но контроллер позволяет устанавливать коэффициент умножения. При коэффициенте 4 все выглядит гораздо лучше (13,2 вольта) и дисплей можно использовать. При коэффициенте умножения 4 мною он был проверен при питании 3 и 3,3 вольта на stm32vldiscovery.
Вот код инициализации дисплея

  LcdSend( 0xE2 , 0 );  // Soft reset
  LcdSend( 0x3D , 0 );  // Charge pump
  LcdSend( 0x01 , 0 );  // Charge pump = 4 (default 5 is too hight for 3.0 volt)
  LcdSend( 0xE1 , 0 );  // Additional VOP for contrast increase
  LcdSend( 0x16 , 0 );  // from -127 to +127
  LcdSend( 0xA4, 0 );  // Power save OFF
  LcdSend( 0x2F, 0 );  // Booster ON Voltage regulator ON Voltage follover ON
  LcdSend( 0xAF, 0 );  // LCD on

Здесь следует обратить внимание на команды установки множителя (помечены charge pump)и установки напряжения LCD. Эти команды состоят из двух посылок (собственно команда и значение). Исследуя их я обнаружил, что они не работают на включенном дисплее. Их нужно подавать только в процессе инициализации до включения дисплея.
Первая команда устанавливает умножение напряжения зарядовым насосом на переключаемых конденсаторах на 4. Вторая команда несколько увеличивает напряжение на LCD (на 16 единиц). Дисплей имеет возможность изменять напряжение +-127 единиц при инициализации и на +-16 единиц оперативно (команда Volume). Вообще то регулировки +-16 единиц было вполне достаточно для получения нормального контраста. Но при выставлении регулировки в -16 дисплей был полностью погашен, а при +16 создавалось впечатление, что контраст еще может быть увеличен. Это оказалось не так. При дальнейшем увеличении напряжения контраст стал уменьшаться — погашенные сегменты начали темнеть тоже. Но сдвиг в 16 единиц я оставил, непосредственно после инициализации дисплей имеет максимальную контрастность.
Первые эксперименты я проводил переключением пинов ввода-вывода. Для этого использовались 4 линии:Reset, cristal enable, data, clock. При этих экспериментах оказалось, что вполне можно использовать и 3 проводное подключение, без Reset. Интерфейс имеет команду сброса.
В дальнейшем мне очень хотелось подключить его с аппаратному SPI. Но для stm32 это оказалось неосуществимо. Spi имеет фиксированный размер пакета в 8 или 16 бит. Зато USART может работать в синхронном режиме с 9 битовым пакетом данных. Таким образом идея была использовать 9 битовый режим. Передатчик подключить к выводу DATA LCD, а синхроимпульсы подавать соответственно на CLOCK. CE можно было дергать перед началом всей посылки.
USART передает первым младший бит. Поэтому непосредственно перед посылкой порядок бит должен быть изменен на противоположный. Делается это инструкцией Cortex-M3 rbit.
Таким образом посылка данных может выглядеть вот так

  if ( IsData & 1 ) /* If data */
  {
    TmpData |= 0x100;   
  }
  TmpData = __RBIT(TmpData) >> 23;
  while ( (USART1->SR & USART_SR_TXE) == 0 ) /* Transmitter registar is not empty */
    ; /* BLANK */
  USART1->DR = TmpData;

Перед записью в USART здесь проверяется, что входной буфер передатчика пуст. С сигналом CE тоже есть нюансы: он может быть поднят только после передачи последнего бита данных или команды. Поэтому перед тем как поднять CE проверяется отправка данных:

  while ( (USART1->SR & USART_SR_TC) == 0) 
  /* BLANK */; 
LCD_PORT->BSRR = 1<<LCD_CE_PIN

Инициализация USART выглядит следующим образом:

  USART1->BRR = 0x0010; /* MAX speed */
  USART1->CR2 = USART_CR2_STOP_0|USART_CR2_CLKEN|USART_CR2_CPOL|USART_CR2_CPHA|USART_CR2_LBCL; /* 0.5 stop bit, pib CLK ena, polatity and phaze, clock fpr last bit */
  USART1->CR1 = USART_CR1_OVER8|USART_CR1_M|USART_CR1_TE|USART_CR1_UE; /* oversampling 8, 9 bit, transmitter ena, usart ena */

По субъективным ощущениям передача через UART идет несколько медленнее прямого ногодрыгания. Но при высоких тактовых частотах все равно приходится ждать, что бы не превысить максимальную частоту интерфейса LCD. Кроме того, во время вывода байта процессор может заниматься чем то, полезным. Так что в конечном счете использование USART может несколько повысить производительность. Разница в величине кода составляет примерно 120 байт.
  • 0
  • 13 ноября 2011, 20:34
  • OlegG

Комментарии (23)

RSS свернуть / развернуть
Дело в том, что максимальное напряжение LCD для него — 14 вольт. Умножение 3,3 вольт на 5 дает более 15 вольт == возможно сгоревший дисплей
… вообще странно что разработчики допускают саму возможность, что при определенных коэффициентах LCD может сгореть. Тогда надо было б организовать какое нибудь ограничение или вместо коэффициента умножения задавать коэффициент уменьшения (по умолчанию — макс. допустимое). Хотя с другой стороны Nokia эти дисплеи делает для себя и программируют их свои же ребята, а значит у них должны быть свои внутренние стандарты инициализации
PS а вообще Nokia продает дисплеи как отдельные модули? или все такие дисплеи выковыренны из мобильников?
0
Ничего странного. Контроллер не конкретно для этой стекляхи проектировался и не конкретно для 3.3В питания. И это далеко не единственная железка, которую можно угробить неправильной настройкой. Одна из микросхем FM-трансмиттера например сгорает, если ее включить по схеме с повышенной мощностью и не активировать бит повышенной мощности в течении скольки-то там миллисекунд после подачи питания. Либо если включить по обычной схеме и поставить бит повышения мощности.
0
Одна из микросхем FM-трансмиттера например сгорает, если ее включить по схеме с повышенной мощностью и не активировать бит повышенной мощности в течении скольки-то там миллисекунд после подачи питания. Либо если включить по обычной схеме и поставить бит повышения мощности.
… суровые ребята однако проектировщики таких девайсов :)
0
Куплен в магазине отдельно от телефона за 35 руб штука
0
Уточните пожалуйста, вы подавали одинаковое напряжение 3.3 вольта на оба входа (VDDI и VDD)?
0
Да. То что я написал о инициализации — это лажа. Мне почудилось, что эти команды работают. По крайней мере такую же команду VOP мне не удалось заставить работать. Так что ее можно убрать. А так народ говорит что дисплей работает и так от 3,3 вольт. Здесь на сайте можете посискать. Делали на пиках.
0
Спасибо!
0
Ещё вопросик. При трёхпроводном управлении — куда был подключен Reset? Можно ли оставить его неподключённым?
Кстати, команда VOP Set имеет код 0xE1, а не 0x1E, как в приведённом коде инициализации.
0
+3.3
Не подключать не пробовал.
0
А у Вас работает 0xE1? У меня не ее действия не видно.
0
У меня пока вообще не работает:)
Про недействиие у вас 1E я уже прочитал по ссылке выше. Если что-то получится — отпишусь.
0
Уф, заработало:) RESET оставлять в воздухе нельзя.
Что касаемо 1E, то обнаружилась интересная вещь.
Похоже, что эта команда воспринимает параметр только в диапазоне 128..159 (128 — минимальная контрастность, 159 — максимальная). Другие значения параметра воспринимаются как другие команды. Я сначала подумал, что открыл америку, обнаружив, что при значениях параметра от 64 до 127 происходит циклический сдвиг экрана по вертикали вверх на 0..63 строки. Но это оказались команды «Display start line address set».
0
Попробовал на stm32f103rbt6 эту методу. Результаты приятственные. Гнать через USART получается примерно в полтора раза быстрее, чем битбангом.
Столкнулся с одной проблемой. Видимо в сотках эту багу исправили, но в 103м проце, нельзя использовать дробные стопбиты для синхронного режима. Фаза начинает плавать.
+1
Nokia 1100 от 3.3V не горит. Но по даташиту да, максимум 2.9…
Если хотите, могу устроить стресс-тест, включив его на длительное время.
0
Коллеги, а на подсветку он сколько вольт требует?
0
Где-то 3 вольта. Белый светодиод (даже резюка вроде нет ограничительного). Резюк подобрать по желаемой яркости можно. у меня в макетке от 3.3В через 300 Ом вроде вот кнут.
0
Чатимся с вами в разных топиках )))
Спасибо за инфу. У меня как раз девайс от 3.3 питаться будет и на подсветку ой как не хочется дополнительный преобразователь делать. Заскочу на днях на радиорынок. В митино живу — замкадье, полная жопа, но есть 1 плюс — радиорынок под боком :D
0
У вас там есть довольно интересные по цене дисплеи монохромные о 5р/штука. В профи гляньте. При такой то цене не грех купить — поковырять :)
0
Это какие? На сайте профи поиск выдал по 15 руб минимум и то какие-то диковинные.
0
Хы, закончились. там были ещё более диковенные. где-то сантиметр на три. и интерфейс похожий на параллельный.
0
От 3,3 работает напрямую. Потребляет тока миллиампер 5 по моему.
0
www.sugarsync.com/pf/D8201521_67427081_6580404
Фото (Чуть отличается от конечного варианта)

Вот заводил дисплей от 1202, может кому понадобится платка-переходник 8х36 мм. В архиве фото и лэйаут файл. Два варианта — под гребенку 0.1 д и под шлейф 0.05 д. Предусмотрены резюки под резет и подсветку, конденсатор питания. Если будете использовать, смотрите, окончательная конфигурация достигается перерезанием дорог.
www.sugarsync.com/pf/D8201521_67427081_6580494 Архив
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.