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