Есть у меня пару экранчиков с данным чипом. По i2c подключился без проблем. А вот с spi вышла засада. Вчера до полуночи пытался вдохнуть жизнь в экранчик (рабочий, на AVR работает без проблемм). Совсем отчаялся, вытащил stlink из usb и пошел водички перед сном попить. Пока ходил, пришла еще одна мысль, дай как еще попробую. Втыкаю программатор в юсб, а оно заработало! Криво, косо, но экран ожил. Т.е. проблема номер раз - при перепрошивке, экран не поднимается, только при полном отключении питания. Ну еще час потерянного сна и постоянное тыкание туда-сюда программатора. Картинку выводит, но только в первый раз. Если в цикле, то картинка за пару секунд приходит в непотребный вид. Дальше, все на картинках. Вот так выглядит экран, если выводить один раз, а потом просто пустой цикл без обновления экрана. Ну и программатор передернуть, естественно. СпойлерДа-да. Спер без зазрения совести А вот так, если обновлять одну и ту же картинку в цикле. Спойлер
Все статьи, что нашел, прочитал, все попробовал. Но где-то у меня принципиальный косяк в понимании. Не могу понять: 1. Почему не работает сразу после прошивки и надо передергивать питание? 2. Почему в цикле портится картинка. Код прилагаю. Спойлер
//1....GND: Power ground //2....VCC: 3.3V or 5V power supply //3....D0: CLK Clock //4....D1: MOSI data //5....RST: Reset //6....DC: data / command //7....CS: Chip select signal
spi1_SendByte(0x22); spi1_SendByte(0); spi1_SendByte(7); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)!=RESET); // ждем пока данные передадутся до конца
spi1_DataMode(); for(i=0; i<128*64/8; i++) spi1_SendByte(buffer[i]); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)!=RESET); // ждем пока данные передадутся до конца
spi1_SendByte(0x22); spi1_SendByte(0); spi1_SendByte(7); while (SPI_I2S_GetFlagStatus(SPI1, (1 << 7))!=RESET); // ждем пока данные передадутся до конца
//копируем буфер на экран spi1_DataMode(); for(i=0; i<128*64/8; i++) spi1_SendByte(buffer[i]);
while (SPI_I2S_GetFlagStatus(SPI1, (1 << 7))!=RESET); // ждем пока данные передадутся до конца //for(i=0; i<100000; i++); } }
Если кто-то настолько крут, что мельком пробежавшись по коду, найдет ошибку, не сочтите за труд ткнуть носом. Спасибо.
Код не смотрел, но на подобное наткнулся на прошлой неделе со 103С8 и дисплеем 5110. Мучился, ну никак не выводит инфо, и это при том, что на ПИКе я его инициализацию вылизал по полной. Утром включаю комп, втыкаю st-link, от которого питается плата с ЖКИ и с удивлением вижу свой текст, который накануне упорно пытался вывести.
Причина в том, что после подачи питания на дисплей нужно провести его правильную инициализацию сразу. А в том случае, когда вы пару раз в процессе наладки обновляете прошивку, питание с дисплея не снимается, процедура инита проходит запоздало (от момента запитывания), вот он и молчит. Так что ставьте ключ на питание дисплея и включайте его из программы перед инициализацией. Либо, как я временно сделал (каюсь, неправильно это), подключил вывод питания на ногу МК. Т.е. он питается "единицей" с порта Но, судя по всему, это и есть причина глюков у меня: в первый раз ЖКИ что-то выводит и подвисает. Просто никак не спаяю ключ на питание.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Zhuk72, ну это решение в лоб, оно же - костыль. Хотя право на жизнь имеет. Останавливает то, что этот же экран от аврки запускается на ура. Ну и второй вопрос остается: почему портится картинка при обновлении. На лицо косяк в логике.
Я только на первый вопрос отвечал. А АВР же не питается от программатора, верно? Тут проблема в том, что схема запитывается от st-link и во время прошивки питание остается на дисплее, а время начала инициализации уже превысило какое-то паспортное. Костыль, я же не спорю. Но я был вдали от дома и лепить ключ на питание было не из чего. А сейчас некогда.
На второй не отвечу, т.к. покупка такого ОЛЕДа только в планах.
Добавлено after 3 minutes 23 seconds: Только сейчас обратил внимание на картинки. Нет времени смотреть код, но проверьте как обстоят дела с адресацией в этих дисплеях. Адрес автоматически инкрементируется, а в цикле у вас, вероятно, начальный адрес не задается. Вернее задается один раз где-то до начала цикла, потому и происходит смещение. Это просто предположение.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
не вижу 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. Впоследствии, это может запутать.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
не вижу NSS, он же CS на стороне дисплея. Как он подключен? Его настоятельно рекомендуется подключать не к GND, а именно к управляемому с микроконтроллера выводу. Иначе, пока не инициализован SPI, на дисплей могут проникать шумовые данные от шины и портить весь старт дисплея. Скопировав весь ваш код и устранив указанное замечание - добавив программное переключение CS = 0 перед началом команд, либо поставив аппаратное управление SPI1->CR2 = SPI_CR2_SSOE и назначив PA4 на выход AF, теперь всё работает без сбоев: Сбои у вас были от наводок на CS дисплея из-за висящего в воздухе вывода. Попробуйте без исправления кода пальцем ткнуть в CS - у вас все полетит к чертям.
Блин, вот это опечатка Спасибо, все заработало. Но почему-то CS не хочет работать при Mode = GPIO_Mode_AF_PP: когда подношу палец к проводу, начинаются пляски. Поэтому настроил его отдельно на выход и сразу выставил в ноль. Теперь все работает стабильно. Огромное спасибо за помощь.
//1....GND: Power ground //2....VCC: 3.3V or 5V power supply //3....D0: CLK Clock //4....D1: MOSI data //5....RST: Reset //6....DC: data / command //7....CS: Chip select signal
spi1_SendByte(0x22); spi1_SendByte(0); spi1_SendByte(7); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)!=RESET); // ждем пока данные передадутся до конца
//переключаемся на данные, больше команд не будет GPIO_SetBits(GPIOA, GPIO_Pin_0); // DC=1; //spi1_SetDataMode(); }
void display() { for(int i=0; i<128*64/8; i++) spi1_SendByte(buffer[i]); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)!=RESET); // ждем пока данные передадутся до конца }
int main(void) { init_gpio(); init_spi(); sdd_1306_init();
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения