Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32 и подключение sdd1306 по SPI

Пт июл 07, 2017 09:39:58

Добрый день всем.

Есть у меня пару экранчиков с данным чипом.
По i2c подключился без проблем.
А вот с spi вышла засада. Вчера до полуночи пытался вдохнуть жизнь в экранчик (рабочий, на AVR работает без проблемм).
Совсем отчаялся, вытащил stlink из usb и пошел водички перед сном попить.
Пока ходил, пришла еще одна мысль, дай как еще попробую. Втыкаю программатор в юсб, а оно заработало! :shock: Криво, косо, но экран ожил.
Т.е. проблема номер раз - при перепрошивке, экран не поднимается, только при полном отключении питания.
Ну еще час потерянного сна и постоянное тыкание туда-сюда программатора.
Картинку выводит, но только в первый раз. Если в цикле, то картинка за пару секунд приходит в непотребный вид.
Дальше, все на картинках.
Вот так выглядит экран, если выводить один раз, а потом просто пустой цикл без обновления экрана. Ну и программатор передернуть, естественно.

А вот так, если обновлять одну и ту же картинку в цикле.


Все статьи, что нашел, прочитал, все попробовал. Но где-то у меня принципиальный косяк в понимании.
Не могу понять:
1. Почему не работает сразу после прошивки и надо передергивать питание?
2. Почему в цикле портится картинка.
Код прилагаю.

Если кто-то настолько крут, что мельком пробежавшись по коду, найдет ошибку, не сочтите за труд ткнуть носом.
Спасибо.

Re: stm32 и подключение sdd1306 по SPI

Пт июл 07, 2017 10:36:30

Код не смотрел, но на подобное наткнулся на прошлой неделе со 103С8 и дисплеем 5110.
Мучился, ну никак не выводит инфо, и это при том, что на ПИКе я его инициализацию вылизал по полной.
Утром включаю комп, втыкаю st-link, от которого питается плата с ЖКИ и с удивлением вижу свой текст, который накануне упорно пытался вывести.

Причина в том, что после подачи питания на дисплей нужно провести его правильную инициализацию сразу. А в том случае, когда вы пару раз в процессе наладки обновляете прошивку, питание с дисплея не снимается, процедура инита проходит запоздало (от момента запитывания), вот он и молчит. Так что ставьте ключ на питание дисплея и включайте его из программы перед инициализацией. Либо, как я временно сделал (каюсь, неправильно это), подключил вывод питания на ногу МК. Т.е. он питается "единицей" с порта :) Но, судя по всему, это и есть причина глюков у меня: в первый раз ЖКИ что-то выводит и подвисает. Просто никак не спаяю ключ на питание.

Re: stm32 и подключение sdd1306 по SPI

Пт июл 07, 2017 11:21:15

Zhuk72, ну это решение в лоб, оно же - костыль. Хотя право на жизнь имеет. Останавливает то, что этот же экран от аврки запускается на ура. Ну и второй вопрос остается: почему портится картинка при обновлении. На лицо косяк в логике.

Re: stm32 и подключение sdd1306 по SPI

Пт июл 07, 2017 11:39:54

Я только на первый вопрос отвечал. А АВР же не питается от программатора, верно? Тут проблема в том, что схема запитывается от st-link и во время прошивки питание остается на дисплее, а время начала инициализации уже превысило какое-то паспортное.
Костыль, я же не спорю. Но я был вдали от дома и лепить ключ на питание было не из чего. А сейчас некогда.

На второй не отвечу, т.к. покупка такого ОЛЕДа только в планах.

Добавлено after 3 minutes 23 seconds:
Только сейчас обратил внимание на картинки.
Нет времени смотреть код, но проверьте как обстоят дела с адресацией в этих дисплеях. Адрес автоматически инкрементируется, а в цикле у вас, вероятно, начальный адрес не задается. Вернее задается один раз где-то до начала цикла, потому и происходит смещение.
Это просто предположение.

Re: stm32 и подключение sdd1306 по SPI

Пт июл 07, 2017 15:48:39

Код:
init.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_5 |

не вижу NSS, он же CS на стороне дисплея. Как он подключен? Его настоятельно рекомендуется подключать не к GND, а именно к управляемому с микроконтроллера выводу. Иначе, пока не инициализован SPI, на дисплей могут проникать шумовые данные от шины и портить весь старт дисплея.

Скопировав весь ваш код и устранив указанное замечание - добавив программное переключение CS = 0 перед началом команд, либо поставив аппаратное управление SPI1->CR2 = SPI_CR2_SSOE и назначив PA4 на выход AF, теперь всё работает без сбоев:
(у меня сине-желтый дисплей с двумя областями, поэтому видна ступенька)

Изображение

Сбои у вас были от наводок на CS дисплея из-за висящего в воздухе вывода. Попробуйте без исправления кода пальцем ткнуть в CS - у вас все полетит к чертям.

ЗЫ. RESET дисплея у меня подключен к общему сбросу отладочной платы и отдельная команда сброса дисплея не используется

ЗЫ-2. Каждый раз задавать начальные и конечные координаты окна вывода в этом конкретном случае - НЕ нужно. Дисплей работает по кругу, после последнего столбца последней страницы он автоматом переходит на первый.

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

ЗЫ-4. Рекомендовано выдерживать некоторые задержки, в частности, после включения DC/DC-конвертера. В документации об этом сказано. 100 мс написано. Но на деле работает и с гораздо меньшей.
After VCC become stable, send command AFh for display ON. SEG/COM will be ON after 100ms
(tAF).


ЗЫ-5. Чисто формально, буфер должен определяться не как [64 * 128 / 8], а как [128 * 64 / 8]. Хотя это чистая формальность, но смысл диаметрально противоположный - страниц в дисплее 64/8, а не 128/8. Впоследствии, это может запутать.

Re: stm32 и подключение sdd1306 по SPI

Сб июл 08, 2017 05:41:51

Код:
init.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_5 |

не вижу NSS, он же CS на стороне дисплея. Как он подключен? Его настоятельно рекомендуется подключать не к GND, а именно к управляемому с микроконтроллера выводу. Иначе, пока не инициализован SPI, на дисплей могут проникать шумовые данные от шины и портить весь старт дисплея.
Скопировав весь ваш код и устранив указанное замечание - добавив программное переключение CS = 0 перед началом команд, либо поставив аппаратное управление SPI1->CR2 = SPI_CR2_SSOE и назначив PA4 на выход AF, теперь всё работает без сбоев:
Сбои у вас были от наводок на CS дисплея из-за висящего в воздухе вывода. Попробуйте без исправления кода пальцем ткнуть в CS - у вас все полетит к чертям.


Блин, вот это опечатка :oops:
Спасибо, все заработало. Но почему-то CS не хочет работать при Mode = GPIO_Mode_AF_PP: когда подношу палец к проводу, начинаются пляски. Поэтому настроил его отдельно на выход и сразу выставил в ноль.
Теперь все работает стабильно. Огромное спасибо за помощь.

Полностью рабочий код, если кому надо:
Ответить