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

STM32F103C8T6 и LCD 2.8" 320х240

Пт фев 23, 2018 01:19:24

Доброго времени суток. Решил разобраться с подключением и работой 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)
 {
 }
}

Что происходит на управляющих ножках:
Изображение

Re: STM32F103C8T6 и LCD 2.8" 320х240

Пт фев 23, 2018 15:33:11

Думаю нашел виновника)
Изображение
Сейчас перепаяю R1 с положения 16bit на 8bit. По этому и получал только старшие 8бит 0х93 а младшие терялись. Надеюсь 99% только в этом проблема.

Re: STM32F103C8T6 и LCD 2.8" 320х240

Пт фев 23, 2018 16:00:41

Сначала лучше данные выставить на линиях, а потом уже ВР дергать:


SetData(reg); // запись reg (7-0)бит _

WR_LOW; // 0 - запись \__
WR_HIGH; // 1 - запись __/

Re: STM32F103C8T6 и LCD 2.8" 320х240

Пт фев 23, 2018 17:52:16

Перепаял. Та же ошибка 0х0093 или 0х9393 выдает.

Так пробовал:
SetData(reg); // запись reg (7-0)бит
WR_LOW; // 0 - запись
WR_HIGH; // 1 - запись

У меня еще есть STM32F4Discovery попробую на ней запустить экранчик.

Re: STM32F103C8T6 и LCD 2.8" 320х240

Вт мар 13, 2018 18:53:15

Разобрался. Вообщем дисплей работает только в 16-и битном режиме и перемычка на это не влияет. Сделал инициализацию, заливку разными цветами дисплея, а потом добавил массив с фоткой и отобразил. Код и фото приложил может кому понадобится. Контроллер дисплея ili9325.

Изображение Изображение
Вложения
STM32F4LCD.rar
(531.38 KiB) Скачиваний: 284
Ответить