Форум РадиоКот https://radiokot.ru/forum/ |
|
Подключение LCD к микроконтроллеру STM32 https://radiokot.ru/forum/viewtopic.php?f=2&t=141982 |
Страница 1 из 1 |
Автор: | isx [ Вт фев 14, 2017 18:20:28 ] |
Заголовок сообщения: | Подключение LCD к микроконтроллеру STM32 |
Приветствую форумчан! Столкнулся с необходимостью подключить LCD с тачскрином к STM32. Как всегда, попытки завести устройство через сторонние библиотеки ни к чему не привели. Нашел ветку на форуме viewtopic.php?p=2564754 . Дисплей точно такой же, попробовал библиотеку, которую предложил там Mikele_P, но кроме подсветки ничего так и не увидел. Один только нюанс - я подавал вместо 3.3 вольт 3 вольта, но думаю это не столь существенно. Интересует следующие вопросы. 1. Снег на экране должен появиться сразу после инициализации? 2. Как происходит эта самая инициализация? Дисплей инициализируется сразу после ногодрыга с RST пином, или потом нужно еще досылать какие-то команды? 3. Если нужны команды, то какие там должны быть и в каком порядке (или хотябы где это посмотреть можно, так как в даташите на контроллер моего дисплея hx8347g я такой инфы не нашел)? Хочу хоть снег увидеть, а то так и не понятно то ли в коде проблема, то ли дисплей дохлый.... ![]() Даташит на контроллер LCD hx8347g http://datasheet4u.com/datasheet/H/X/8/ ... x.pdf.html |
Автор: | JustRom [ Ср фев 15, 2017 18:05:13 ] |
Заголовок сообщения: | Re: Подключение LCD к микроконтроллеру STM32 |
Проинициализировать таймер SysTick не забыли (вместе с переменной SysTimer)? Обратите внимание на функцию delay_ms. |
Автор: | isx [ Ср фев 15, 2017 19:33:12 ] |
Заголовок сообщения: | Re: Подключение LCD к микроконтроллеру STM32 |
Я delay_ms сделал через delay_us. Код: void delay_ms(uint32_t N) { uint16_t d = 0; while (d < N) { delay_us(750); d++; } } Именно с 750 мкс. отладчик показывал задержку чуть больше 1 мс. |
Автор: | isx [ Пт фев 17, 2017 00:00:04 ] |
Заголовок сообщения: | Re: Подключение LCD к микроконтроллеру STM32 |
Как обычно, угробил уйму времени запихиванием сторонних библиотек, но толку никакого нет. Только белый свет в тоннеле ![]() Для начала посмотрел как все устроено в других. Порядок получился такой: 1) Подключение. 2) Ресет. 3) Чтение ID (опционально, но мне надо знать, как мое чудовище определяется). Собственно здесь все и повисло. Разные модели контроллеров требуют различного подхода как к ресету, так и к чтению ID. Предполагаю, что мой hx8347G аналог ILI9325 (в ветке, которую я указывал, человек именно с его настройками запустил это чудо). Полазал по даташиту, действительно, регистр чтения ID у них одинаковый - 0x00 (у ILI9341, к примеру, 0xD3). Вопросы: Какой должен быть правильный порядок ресета? Каков порядок получения ID? Сейчас у меня такое понаписано (ОСТОРОЖНО 18+): Код: void hx8347G_Init (void) { hx8347G_PINs_Command_Init(); hx8347G_PINs_Data_Out(); hx8347G_Reset(); LCD_ID = hx8347G_Get_LCD_ID(0x00); } void hx8347G_PINs_Command_Init(void) { GPIOA->CRH &= ~( GPIO_CRH_MODE8 // rd |GPIO_CRH_MODE9 // wr |GPIO_CRH_MODE10 // rs |GPIO_CRH_MODE11 // cs |GPIO_CRH_MODE12 // rst ); GPIOA->CRH |= ( GPIO_CRH_MODE8 // rd |GPIO_CRH_MODE9 // wr |GPIO_CRH_MODE10 // rs |GPIO_CRH_MODE11 // cs |GPIO_CRH_MODE12 // rst ); GPIOA->CRH &= ~( GPIO_CRH_CNF8 |GPIO_CRH_CNF9 |GPIO_CRH_CNF10 |GPIO_CRH_CNF11 |GPIO_CRH_CNF12 ); } void hx8347G_PINs_Data_Out(void) { GPIOA->CRL &= ~( GPIO_CRL_MODE0 // D0 |GPIO_CRL_MODE1 // D1 |GPIO_CRL_MODE2 // D2 |GPIO_CRL_MODE3 // D3 |GPIO_CRL_MODE4 // D4 |GPIO_CRL_MODE5 // D5 |GPIO_CRL_MODE6 // D6 |GPIO_CRL_MODE7 // D7 ); GPIOA->CRL |= ( GPIO_CRL_MODE0 // D0 |GPIO_CRL_MODE1 // D1 |GPIO_CRL_MODE2 // D2 |GPIO_CRL_MODE3 // D3 |GPIO_CRL_MODE4 // D4 |GPIO_CRL_MODE5 // D5 |GPIO_CRL_MODE6 // D6 |GPIO_CRL_MODE7 // D7 ); GPIOA->CRL &= ~( GPIO_CRL_CNF0 |GPIO_CRL_CNF1 |GPIO_CRL_CNF2 |GPIO_CRL_CNF3 |GPIO_CRL_CNF4 |GPIO_CRL_CNF5 |GPIO_CRL_CNF6 |GPIO_CRL_CNF7 ); GPIOA->ODR &= 0xFF00; } void hx8347G_PINs_Data_In(void) { GPIOA->CRL &= ~( GPIO_CRL_MODE0 // D0 |GPIO_CRL_MODE1 // D1 |GPIO_CRL_MODE2 // D2 |GPIO_CRL_MODE3 // D3 |GPIO_CRL_MODE4 // D4 |GPIO_CRL_MODE5 // D5 |GPIO_CRL_MODE6 // D6 |GPIO_CRL_MODE7 // D7 ); GPIOA->CRL &= ~( GPIO_CRL_CNF0 |GPIO_CRL_CNF1 |GPIO_CRL_CNF2 |GPIO_CRL_CNF3 |GPIO_CRL_CNF4 |GPIO_CRL_CNF5 |GPIO_CRL_CNF6 |GPIO_CRL_CNF7 ); GPIOA->CRL |= ( GPIO_CRL_CNF0_0 |GPIO_CRL_CNF1_0 |GPIO_CRL_CNF2_0 |GPIO_CRL_CNF3_0 |GPIO_CRL_CNF4_0 |GPIO_CRL_CNF5_0 |GPIO_CRL_CNF6_0 |GPIO_CRL_CNF7_0 ); } void hx8347G_Reset (void) { HX8347G_LCD_RESET_DISABLE; HX8347G_LCD_CS_DISABLE; HX8347G_LCD_CD_DATA; HX8347G_LCD_WR_DISABLE; HX8347G_LCD_RD_DISABLE; hx8347G_Send_Command(0xFF); _hx8347G_Delay_ms(50); HX8347G_LCD_RESET_ENABLE; _hx8347G_Delay_ms(100); HX8347G_LCD_RESET_DISABLE; _hx8347G_Delay_ms(1000); } /////////////////////////////ОСОБО ОПАСНЫЙ КОД!!!///////////////////////////////////// Здесь полное безобразие, так как я пытался всеми способами получить нужные данные. uint32_t hx8347G_Get_LCD_ID (uint8_t r) { uint32_t ID = 0; uint32_t x = 0; //HX8347G_LCD_CS_ENABLE; //HX8347G_LCD_CD_COMMAND; //HX8347G_LCD_RD_DISABLE; //HX8347G_LCD_WR_ENABLE; HX8347G_LCD_CS_ENABLE; HX8347G_LCD_CD_COMMAND; hx8347G_PINs_Data_Out(); _hx8347G_Delay_ms(50); hx8347G_Send_8bit (0x00); _hx8347G_Delay_ms(50); HX8347G_LCD_CS_DISABLE; HX8347G_LCD_CS_ENABLE; HX8347G_LCD_CD_DATA; hx8347G_PINs_Data_Out(); _hx8347G_Delay_ms(50); hx8347G_Send_8bit (0x01); _hx8347G_Delay_ms(50); HX8347G_LCD_CS_DISABLE; HX8347G_LCD_CS_ENABLE; HX8347G_LCD_CD_COMMAND; hx8347G_PINs_Data_Out(); _hx8347G_Delay_ms(50); hx8347G_Send_8bit (0x00); _hx8347G_Delay_ms(50); HX8347G_LCD_CS_DISABLE; /* hx8347G_PINs_Data_In(); _hx8347G_Delay_ms(50); //1 HX8347G_LCD_CS_ENABLE; HX8347G_LCD_CD_DATA; HX8347G_LCD_RD_ENABLE; _hx8347G_Delay_ms(50); ID = HX8347G_READ_DATA; ID<<=8; HX8347G_LCD_RD_DISABLE; HX8347G_LCD_CS_DISABLE; _hx8347G_Delay_ms(50); //2 HX8347G_LCD_CS_ENABLE; HX8347G_LCD_CD_DATA; HX8347G_LCD_RD_ENABLE; _hx8347G_Delay_ms(50); ID += HX8347G_READ_DATA; HX8347G_LCD_RD_DISABLE; HX8347G_LCD_CS_DISABLE; _hx8347G_Delay_ms(50); hx8347G_PINs_Data_Out(); */ /* HX8347G_LCD_CS_ENABLE; HX8347G_LCD_CD_COMMAND; HX8347G_LCD_RD_DISABLE; hx8347G_PINs_Data_Out(); HX8347G_WR_STROBE; */ /* hx8347G_Send_8bit(r); _hx8347G_Delay_us(100); hx8347G_Send_8bit(r); _hx8347G_Delay_us(100); */ hx8347G_PINs_Data_In(); HX8347G_LCD_CD_DATA; _hx8347G_Delay_us(50); HX8347G_LCD_RD_ENABLE; _hx8347G_Delay_us(5); x = HX8347G_READ_DATA; HX8347G_LCD_RD_DISABLE; ID = x; ID<<=8; HX8347G_LCD_RD_ENABLE; _hx8347G_Delay_us(5); x = HX8347G_READ_DATA; HX8347G_LCD_RD_DISABLE; ID |= x; ID<<=8; HX8347G_LCD_RD_ENABLE; _hx8347G_Delay_us(5); x = HX8347G_READ_DATA; HX8347G_LCD_RD_DISABLE; ID |= x; ID<<=8; HX8347G_LCD_RD_ENABLE; _hx8347G_Delay_us(5); x = HX8347G_READ_DATA; HX8347G_LCD_RD_DISABLE; ID |= x; if (r == 0xEF) { ID<<=8; HX8347G_LCD_RD_ENABLE; _hx8347G_Delay_us(5); x = HX8347G_READ_DATA; HX8347G_LCD_RD_DISABLE; ID |= x; } HX8347G_LCD_CS_DISABLE; hx8347G_PINs_Data_Out(); _hx8347G_Delay_us(150); // Stabilization return ID; } Дефайны: Код: #define HX8347G_LCD_RD_ENABLE (GPIOA->BSRR |= GPIO_BSRR_BR8)// #define HX8347G_LCD_RD_DISABLE (GPIOA->BSRR |= GPIO_BSRR_BS8) // #define HX8347G_LCD_WR_ENABLE (GPIOA->BSRR |= GPIO_BSRR_BR9) // #define HX8347G_LCD_WR_DISABLE (GPIOA->BSRR |= GPIO_BSRR_BS9) // #define HX8347G_LCD_CD_COMMAND (GPIOA->BSRR |= GPIO_BSRR_BR10) // #define HX8347G_LCD_CD_DATA (GPIOA->BSRR |= GPIO_BSRR_BS10) // #define HX8347G_LCD_CS_ENABLE (GPIOA->BSRR |= GPIO_BSRR_BR11) // #define HX8347G_LCD_CS_DISABLE (GPIOA->BSRR |= GPIO_BSRR_BS11) // #define HX8347G_LCD_RESET_ENABLE (GPIOA->BSRR |= GPIO_BSRR_BR12) // #define HX8347G_LCD_RESET_DISABLE (GPIOA->BSRR |= GPIO_BSRR_BS12) // #define HX8347G_SET_DATA (GPIOA->ODR &= 0xFF00); (GPIOA->BSRR) #define HX8347G_READ_DATA (GPIOA->IDR & 0xFF) #define HX8347G_WR_STROBE {HX8347G_LCD_WR_ENABLE; HX8347G_LCD_WR_DISABLE;} При любом способе получения ID, в ответ мне приходят 0x75757575 либо 0x7D7D7D7D (даже если закомментировать ресет). Нужна помощь спецов, так как мой мозг уже не тянет такой груз самостоятельно ![]() ![]() ![]() P.S. Даташит читаю, но для меня такая систематизация - это нечто новое. Не могу я там ни порядок инициализации найти, ни порядок запроса, ни вообще порядок общения с какими либо регистрами. Буду очень благодарен за какие-либо наводки в этом направлении... ![]() |
Автор: | isx [ Сб фев 18, 2017 19:15:43 ] |
Заголовок сообщения: | Re: Подключение LCD к микроконтроллеру STM32 |
Ни у кого нет никаких мыслей по этому поводу? Совсем а то запарился - не движется процесс никак ![]() |
Автор: | JustRom [ Пн фев 20, 2017 22:28:47 ] |
Заголовок сообщения: | Re: Подключение LCD к микроконтроллеру STM32 |
Киньте схему подключения, может гляну свежим взглядом. Я бы на Вашем месте попытался сначала запустить хоть с какой-нибудь библиотекой, чтобы убедиться, что он вообще живой. Эту ссылку смотрели? |
Автор: | isx [ Пн фев 20, 2017 23:30:42 ] | ||
Заголовок сообщения: | Re: Подключение LCD к микроконтроллеру STM32 | ||
Подключение проще простого (основано на ногодрыге): Код: #define HX8347G_LCD_RD_ENABLE (GPIOA->BSRR |= GPIO_BSRR_BR8)// #define HX8347G_LCD_RD_DISABLE (GPIOA->BSRR |= GPIO_BSRR_BS8) // #define HX8347G_LCD_WR_ENABLE (GPIOA->BSRR |= GPIO_BSRR_BR9) // #define HX8347G_LCD_WR_DISABLE (GPIOA->BSRR |= GPIO_BSRR_BS9) // #define HX8347G_LCD_CD_COMMAND (GPIOA->BSRR |= GPIO_BSRR_BR10) // #define HX8347G_LCD_CD_DATA (GPIOA->BSRR |= GPIO_BSRR_BS10) // #define HX8347G_LCD_CS_ENABLE (GPIOA->BSRR |= GPIO_BSRR_BR11) // #define HX8347G_LCD_CS_DISABLE (GPIOA->BSRR |= GPIO_BSRR_BS11) // #define HX8347G_LCD_RESET_ENABLE (GPIOA->BSRR |= GPIO_BSRR_BR12) // #define HX8347G_LCD_RESET_DISABLE (GPIOA->BSRR |= GPIO_BSRR_BS12) // ///////////////////////////////////////////////////////////////////////////////////////////////////// GPIOA->CRL |= ( GPIO_CRL_MODE0 // D0 |GPIO_CRL_MODE1 // D1 |GPIO_CRL_MODE2 // D2 |GPIO_CRL_MODE3 // D3 |GPIO_CRL_MODE4 // D4 |GPIO_CRL_MODE5 // D5 |GPIO_CRL_MODE6 // D6 |GPIO_CRL_MODE7 // D7 ); Проверить то неначем. Все библиотеки для ардуинок, а у меня только платы STM32 в распоряжении. Пробовал портировать, но ничего не вышло, в итоге не знаю, толи портировал неправильно, толи дисплей дохляк... ![]() ![]() Добавлено after 6 minutes 33 seconds: Последняя надежда на вот эту библиотеку (уже и не помню где скачал). Здесь на FSMC переделано под мой контроллер (HX8347G). Завтра проверять буду, седня уже от этого дисплея голова кипит ![]()
|
Автор: | JustRom [ Пн фев 20, 2017 23:58:25 ] |
Заголовок сообщения: | Re: Подключение LCD к микроконтроллеру STM32 |
А чем у Вас enable_bit от disable_bit отличается? Вы и там и там бит устанавливаете. upd: с телефона не заметил, но я бы вместо BSRR дергал бы через ODR |
Автор: | isx [ Вт фев 21, 2017 00:15:18 ] |
Заголовок сообщения: | Re: Подключение LCD к микроконтроллеру STM32 |
BSRR выполняется за один такт. Это как bit-banding. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |