Форум РадиоКот https://radiokot.ru/forum/ |
|
STM32F103C8T6 и LCD 2.8" 320х240 https://radiokot.ru/forum/viewtopic.php?f=59&t=152851 |
Страница 1 из 1 |
Автор: | Andrey27 [ Пт фев 23, 2018 01:19:24 ] |
Заголовок сообщения: | STM32F103C8T6 и LCD 2.8" 320х240 |
Доброго времени суток. Решил разобраться с подключением и работой LCD дисплея https://voron.ua/catalog/023243 Подключил к модулю STM32F103C8T6, написал код, читаю ID дисплея ответ: 0x9393(такого вообще не существует) должно быть 0x9325 или 0x9331. Ножку Reset дисплея пробовал соединять с Reset мк и на порт мк цеплять программно сбрасывать, без разницы. Питание Дисплея от батареи 4.1в ток потребления при 100% подсветки 63мА. Соединение проводами 10см каждый прозванивал, общую землю сделал. Тайминги задержек менял ответ меняется 0x9300, 0x0093, 0x9393. Третий день сижу думаю что может быть не так. Кто работал с дисплеями такого типа, подскажите в чем проблема. Код: Код: #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #define CS GPIO_Pin_3 // LCD chip select: "0" - LCD активен, "1" - LCD не активен #define RS GPIO_Pin_4 // LCD register select: "0" - index reg, "1" - control reg #define RD GPIO_Pin_5 // RD - "1" WR - "0" - запись #define WR GPIO_Pin_6 // RD - "0" WR - "1" - чтение #define RE GPIO_Pin_7 // Reset: "0" - сброс, "1" - норм работа #define D10 GPIO_Pin_8 // 8 бит данных (R/W) #define D11 GPIO_Pin_9 #define D12 GPIO_Pin_10 #define D13 GPIO_Pin_11 #define D14 GPIO_Pin_12 #define D15 GPIO_Pin_13 #define D16 GPIO_Pin_14 #define D17 GPIO_Pin_15 #define CS_LOW GPIO_ResetBits(GPIOA, CS); // CS - "0" #define RS_LOW GPIO_ResetBits(GPIOA, RS); // RS - "0" #define RD_LOW GPIO_ResetBits(GPIOA, RD); // RD - "0" #define WR_LOW GPIO_ResetBits(GPIOA, WR); // WR - "0" #define RE_LOW GPIO_ResetBits(GPIOA, RE); // RE - "0" #define CS_HIGH GPIO_SetBits(GPIOA, CS); // CS - "1" #define RS_HIGH GPIO_SetBits(GPIOA, RS); // RS - "1" #define RD_HIGH GPIO_SetBits(GPIOA, RD); // RD - "1" #define WR_HIGH GPIO_SetBits(GPIOA, WR); // WR - "1" #define RE_HIGH GPIO_SetBits(GPIOA, RE); // RE - "1" GPIO_InitTypeDef PORT; // Структура порта static __IO uint32_t TimingDelay; // Таймер, счетчик //---------- Системный таймер ---------- void SysTick_Handler() { if (TimingDelay != 0) {TimingDelay--;} // Инкремент } //---------- Задержка(милисек) ---------- void Delay_ms(uint32_t mSecs) { SysTick_Config(SystemCoreClock / (1000 - 1)); // Настроим сис. таймер на 1кГц. TimingDelay = mSecs+1; // Установим чтетчик мс. while (TimingDelay != 0); // Ждем пока досчитаем до 0. } //---------- Задержка(микросек) ---------- void Delay_us(uint32_t uSecs) { SysTick_Config(SystemCoreClock / (1000000 - 1)); // Настроим сис. таймер на 1МГц. TimingDelay = uSecs+1; // Установим чтетчик мкс. while (TimingDelay != 0); // Ждем пока досчитаем до 0. } //---------- Инициализация портов и сброс LCD ---------- void PORT_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // Вкл. тактирование PORT.GPIO_Pin = D10|D11|D12|D13|D14|D15|D16|D17; // линии данных PORT.GPIO_Mode = GPIO_Mode_Out_PP; PORT.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &PORT); PORT.GPIO_Pin = CS|RS|RD|WR|RE; // линии управления PORT.GPIO_Mode = GPIO_Mode_Out_PP; PORT.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &PORT); CS_HIGH; // Все линии управления высокий уровень RS_HIGH; RD_HIGH; WR_HIGH; RE_LOW; // Сброс Delay_ms(50); // По даташиту не меньше 10мс. RE_HIGH; Delay_ms(100); } //---------- Установка линий данных на вход ---------- void Data_Pin_Input(void) { PORT.GPIO_Pin = D10|D11|D12|D13|D14|D15|D16|D17; PORT.GPIO_Mode = GPIO_Mode_IPD; PORT.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &PORT); } //---------- Установка линий данных на выход ---------- void Data_Pin_Output(void) { PORT.GPIO_Pin = D10|D11|D12|D13|D14|D15|D16|D17; PORT.GPIO_Mode = GPIO_Mode_Out_PP; PORT.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &PORT); } //---------- Установка 8-ми бит данных на вых. порта ---------- void SetData(uint8_t data) { GPIOB->ODR = (int)((int)data << 8); } //---------- Считываем 8 бит с порта ---------- uint8_t GetData(void) { uint8_t data = 0; data = (GPIOB->IDR >> 8); return data; } //---------- Чтение регистров LCD ---------- uint16_t ReadRegisterLCD(uint16_t reg) { uint16_t data=0; Delay_us(50); CS_LOW; // 0 - LCD активен RS_LOW; // 0 - передаем данные RD_HIGH; // 1 - запись Data_Pin_Output(); // Порт данных на выход Delay_us(50); // __ WR_LOW; // 0 - запись \__ Delay_us(50); SetData(reg>>8); // запись reg (15-8)бит __ WR_HIGH; // 1 - запись __/ Delay_us(50); // __ WR_LOW; // 0 - запись \__ Delay_us(50); SetData(reg); // запись reg (7-0)бит __ WR_HIGH; // 1 - запись __/ Data_Pin_Input(); // Порт данных на вход RS_HIGH; // 1 - принимаем данные Delay_us(50); // __ RD_LOW; // 0 - чтение \__ Delay_us(50); data = (int)GetData()<<8; // чтение (15-8)бит __ RD_HIGH; // 1 - чтение __/ Delay_us(50); // __ RD_LOW; // 0 - чтение \__ Delay_us(50); data |= GetData(); // чтение (7-0)бит __ RD_HIGH; // 1 - чтение __/ CS_HIGH; // 1 - LCD не активен return data; // Результат } int main(void) { uint16_t ID_LCD = 0; // id экрана 9325 или 9331 или 9341 или др. SystemInit(); // Стандартная настройка тактирования 72мГц. PORT_Init(); // Инициализация while(!ID_LCD) // Цикл пока ID_LCD = 0. { ID_LCD = ReadRegisterLCD(0x0000); // Читаем нулевой регистр LCD. В нем хранится id экрана 16 бит. } while(1) { } } Что происходит на управляющих ножках: |
Автор: | Fusion [ Пт фев 23, 2018 16:00:41 ] |
Заголовок сообщения: | Re: STM32F103C8T6 и LCD 2.8" 320х240 |
Сначала лучше данные выставить на линиях, а потом уже ВР дергать: SetData(reg); // запись reg (7-0)бит _ WR_LOW; // 0 - запись \__ WR_HIGH; // 1 - запись __/ |
Автор: | Andrey27 [ Пт фев 23, 2018 17:52:16 ] |
Заголовок сообщения: | Re: STM32F103C8T6 и LCD 2.8" 320х240 |
Перепаял. Та же ошибка 0х0093 или 0х9393 выдает. Так пробовал: SetData(reg); // запись reg (7-0)бит WR_LOW; // 0 - запись WR_HIGH; // 1 - запись У меня еще есть STM32F4Discovery попробую на ней запустить экранчик. |
Автор: | Andrey27 [ Вт мар 13, 2018 18:53:15 ] | ||
Заголовок сообщения: | Re: STM32F103C8T6 и LCD 2.8" 320х240 | ||
Разобрался. Вообщем дисплей работает только в 16-и битном режиме и перемычка на это не влияет. Сделал инициализацию, заливку разными цветами дисплея, а потом добавил массив с фоткой и отобразил. Код и фото приложил может кому понадобится. Контроллер дисплея ili9325.
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |