Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ILI9320 и ILI9325 - есть ли разница в подключении и низкоуровневом общении ?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
zheka
Господа, у меня на столе две платы с STM32F103 и по 2 дисплея ILI9320 и ILI9325.
25 дисплеи не работают, хотя код написан под оба.
Ковыряние показало, что регистры прочесть не получается. Детальное ковыряние выявило странную вещь - когда пишешь данные в порт и включаешь RS=1, напряжение на выходах около 1.5 вольт, ощущение, что дисплей пытается притянуть линию к земле, при CS=1 такого явления не наблюдается.

Дисплеи китайские с ебая. Можеттак быть, чтобы у них была разная распиновка? По тачскрину, питанию дисплея и питанию подсветки вроде бы очевидно, что одинаково все.

Но факт остается фактом - выставить единицы на шине данных при RS=1 не получается.

Что я делаю не так?
psL
Могли перепутать половины порта. При чтении порт находится в высокоимпедансном состоянии, возможно по шине данных требуются pull-up резисторы на питание или GPIO_Mode_IPD
В оригинале между LCD_WR = 0; и LCD_WR = 1; не было задержки? И для RD тоже?

UPD: И код вообще решили убрать из темы?
zheka
Цитата(psL @ Jan 24 2016, 16:29) *
Могли перепутать половины порта. При чтении порт находится в высокоимпедансном состоянии, возможно по шине данных требуются pull-up резисторы на питание или GPIO_Mode_IPD


UPD: И код вообще решили убрать из темы?


Я код убрал потому что не в нем была проблема. Я просто не сказал, что дисплеи разные были - на китайской плате ili9320, на моем готовом устройстве ili9325. ПОвторюсь, код универсален, в самом начале идет проверка что за дисплей.
Я припаял дисплей ili9325, то есть проблемынй на китайскую плату и запустил старый (двухпортовый код) - проблема та же.

Цитата
В оригинале между LCD_WR = 0; и LCD_WR = 1; не было задержки? И для RD тоже?

Не было. Сейчас попробую ради интереса добавить

Нет, задержка не помогает

ЧТо касается кода, то вот, для сведения
Код
void Write_Dat(uint16_t LCD_Dat)
{
    LCD_CS = 0;
    GPIOC->ODR=0x0001; // ДОБАВИЛ СПЕЦИАЛЬНО, ЧТОБЫ УБЕДИТЬСЯ ЧТО ДО ВКЛЮЧЕНИЯ RS ВСЕ НОРМАЛЬНО. И действительно, 3.3 вольт
    LCD_RS = 1; // а после выполнения этой строки падает до  1.5 вольт
    LCD_Dat=0x0001;
    GPIOC->ODR = (GPIOC->ODR&0xff00)|(LCD_Dat&0x00ff);
    GPIOB->ODR = (GPIOB->ODR&0x00ff)|(LCD_Dat&0xff00);
    //GPIOB->ODR = LCD_Dat;
    
    //GPIOB->ODR = (GPIOB->ODR&0xff00)|(LCD_Dat&0x00ff);
    //GPIOB->ODR = (GPIOB->ODR&0x00ff)|(LCD_Dat&0xff00);
    LCD_WR = 0;
    LCD_Delay(1);
    LCD_WR = 1;    
    LCD_Delay(1);
    LCD_CS = 1;
}


Повторюсь - плата рабочая, код рабочий, у меня съемная дисплейная плата, стоит поставить ILI9320 - все нормально. А проблемы возникают еще ДО инициализации дисплея.

Цитата
При чтении порт находится
почитайте пост внимательней, проблема уже при записи. Как только RS=1, дисплей как будто сопротивляется выставлению на шине данных единиц. Дисплея два, оба новые.

Еще одно интересное наблюдение - чем больше единиц в порт пишется, тем ближе напряжение к 3.3. вольт
То есть GPIOC->ODR=0x0001 - напряжение 1.5 вольт, GPIOC->ODR=0xFFFF - на всех выходах полноченные единицы
Описанная ситауция наблюдается на всех пинах
psL
Цитата(zheka @ Jan 24 2016, 17:21) *
Еще одно интересное наблюдение - чем больше единиц в порт пишется, тем ближе напряжение к 3.3. вольт
То есть GPIOC->ODR=0x0001 - напряжение 1.5 вольт, GPIOC->ODR=0xFFFF - на всех выходах полноченные единицы
Описанная ситауция наблюдается на всех пинах

такое обычно бывает, когда питание отсутствует или два выходных буфера пытаются друг друга пересилить.

Сразу после подачи питания, еще до старта программы нужно убедиться, что все напряжения соответствуют.
По умолчанию нужно устанавливать все управляющие сигналы в 1. Кстати, что делает LCD_RS = 1; после LCD_CS = 0; ? Д.б. CS,RS,WD,RD = 1. После старта программы и начала инициализации убеждаемся, что это так.
Потом осцилографом убеждаемся, что прошел RESET.
По идее CS=0 должен увеличивать потребление тока устройством, это тоже можно проверить, задав точку останова в соответствующем месте.
Далее можно проверить шину, выдывая в нее попеременно 0xFFFF 0x0000 и убедиться, что сигналы с мк доходят до модуля. ,А лучше значение инкрементируемой переменной, чтобы точно убедиться в соответствии адреса при последовательной проверке сигналов шины осцилографом.
Если все в порядке, можно пробовать обмениваться через мультиплексную шину, т.е. устанавливать требуемые уровни на данных, RS,WD,RD. В принципе, этот обмен тоже можно проверить при помощи осцилографа, если синхронизироваться по CS,RS,WD,RD и смотреть состояние шины данных.

Цитата(zheka @ Jan 24 2016, 17:21) *
почитайте пост внимательней, проблема уже при записи...

Обязательно бы это сделал, если бы вы не отредактировали исходное сообщение.
khach
А как у ILI9325 выводы IM3,IM2,IM1,IM0/ID выбора типа интерфейса запаяны? Встречался модуль где распайка с фабрики была под последовательный интерфейс.
zheka
Цитата
Далее можно проверить шину, выдывая в нее попеременно 0xFFFF 0x0000 и убедиться, что сигналы с мк доходят до модуля.

Делал я это,все доходит.

Цитата(khach @ Jan 24 2016, 18:32) *
А как у ILI9325 выводы IM3,IM2,IM1,IM0/ID выбора типа интерфейса запаяны? Встречался модуль где распайка с фабрики была под последовательный интерфейс.


Выведены только IM0 и IM3. IM3 висит в воздухе.
IM0 на китайской плате к земле притянут, на моей (по ошибке при копировании) - к плюсу. Спасибо за наводку, сейчас проверю.

подсоединил IM0 IM3 к минусу - не помогло((
zheka
Причина странного поведения линий выявлена - у меня во время записи RD был подтянут к нулю. Он нигде не инициализировался. Китаезный код, чтоб его.
Непонятно только две вещи:
1. Как с этим кривым кодом работает ILI9320
2. Почему регистры и после исправления этой ситуации не читаются...
khach
Цитата(zheka @ Jan 25 2016, 19:20) *
2. Почему регистры и после исправления этой ситуации не читаются...

Регистры не читаются, т.к у ILI9325 и прочих очень слабые драйверы шины. Если читать методом "дрыгоножества" с задержкой между стробом чтения и собственно считыванием шины- то обычно все читается, а если через FSMC - то надо увеличивать задержки на шине значительно. Надо осциллом сесть на шину, пустить считывание в цикле и посмотреть на задержки, когда уровни 0 и 1 устаканятся.
zheka
ставил задержки аж в 10 мсек - бестолку
CODE
void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_Dat)
{

LCD_RD = 1;
LCD_CS = 0;
LCD_RS = 0;
GPIOC->ODR = (GPIOC->ODR&0xff00)|(LCD_Reg&0x00ff);
GPIOB->ODR = (GPIOB->ODR&0x00ff)|(LCD_Reg&0xff00);
LCD_WR = 0;

LCD_WR = 1;

LCD_RS = 1;
GPIOC->ODR = (GPIOC->ODR&0xff00)|(LCD_Dat&0x00ff);
GPIOB->ODR = (GPIOB->ODR&0x00ff)|(LCD_Dat&0xff00);
LCD_WR = 0;

LCD_WR = 1;

LCD_CS = 1;

}

uint16_t LCD_ReadReg(uint16_t LCD_Reg)
{
uint16_t temp;
LCD_RD = 1;
LCD_CS = 0;
LCD_RS = 0;

GPIOC->ODR = (GPIOC->ODR&0xff00)|(LCD_Reg&0x00ff);
GPIOB->ODR = (GPIOB->ODR&0x00ff)|(LCD_Reg&0xff00);
LCD_WR = 0;

LCD_WR = 1;

LCD_RS = 1;

GPIOB->CRH = (GPIOB->CRH & 0x00000000) | 0x44444444; //½«¶Ë¿Ú¸ß8λÅäÖóÉÊäÈë
GPIOC->CRL = (GPIOC->CRL & 0x00000000) | 0x44444444; //½«¶Ë¿ÚµÍ8λÅäÖóÉÊäÈë
LCD_RD = 0;
LCD_Delay(1);
temp = ((GPIOB->IDR&0xff00)|(GPIOC->IDR&0x00ff)); //¶ÁÈ¡Êý¾Ý(¶Á¼Ä´æÆ÷ʱ,²¢²»ÐèÒª¶Á2´Î)
LCD_CS = 1;
GPIOB->CRH = (GPIOB->CRH & 0x00000000) | 0x33333333; //ÊͷŶ˿ڸß8λΪÊä³ö
GPIOC->CRL = (GPIOC->CRL & 0x00000000) | 0x33333333; //ÊͷŶ˿ڵÍ8λΪÊä³ö
LCD_RD = 1;
return temp;
}


Инициализация
Код
void LCD_Configuration()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC,ENABLE);

    /* ÅäÖÃÊý¾ÝIO Á¬½Óµ½GPIOB *********************/    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
                                | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // ÍÆÍìÊä³ö·½Ê½
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // Êä³öIO¿Ú×î´ó×îËÙΪ50MHZ
      GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    /* ÅäÖÿØÖÆIO Á¬½Óµ½PD12.PD13.PD14.PD15 *********************/    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
                                | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // ÍÆÍìÊä³ö·½Ê½
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // Êä³öIO¿Ú×î´ó×îËÙΪ50MHZ
      GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // ÍÆÍìÊä³ö·½Ê½
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // Êä³öIO¿Ú×î´ó×îËÙΪ50MHZ
      GPIO_Init(GPIOC, &GPIO_InitStructure);
        
        LCD_CS=1;
        LCD_RD=1;
        LCD_RS=1;
        LCD_WR=1;
        
}
zheka
Так я и не понял, как все-таки эти дисплеи заводить....
Два новых дисплея, запаяны на плату, на которой до этого и после этого прекрасно работает ILI9320.
Про код я вообще молчу, ибо, учитывая, что регистр чтения располагается по адресу 0x0000, можно даже не обращать внимания на то проходит ли сигнал по линиям данных или нет - нужно опустить CS, дернуть вниз RS и WR, поднять их вверх и опустить RD. Затем осциллографом прямо с контактов дисплея поискать единички. Их нет...

P.S. 3 года назад, как я вспомнил, я тоже приобретал дисплей и мне подсунули 9325. Не заработало. Я счел его неисправным и забыл. А сейчас история повторилась....
У всех 3-х дисплеев разные продавцы...

Есть у кого-нибудь возможность проверить на одной и той же плате с одним и тем же кодом оба дисплейных контроллера?
jcxz
Цитата(khach @ Jan 25 2016, 22:29) *
Регистры не читаются, т.к у ILI9325 и прочих очень слабые драйверы шины. Если читать методом "дрыгоножества" с задержкой между стробом чтения и собственно считыванием шины- то обычно все читается, а если через FSMC - то надо увеличивать задержки на шине значительно. Надо осциллом сесть на шину, пустить считывание в цикле и посмотреть на задержки, когда уровни 0 и 1 устаканятся.

Хм... интересно.... Тоже столкнулся с тем, что ничего не могу считать - ни идентификатор ни пр. Только я читаю по SPI. Может тут та же проблема?
Хотя понизил SCLK для операций чтения до 6МГц. Похоже - надо ещё ниже. Надо будет глянуть как осцилл вернут...
В остальном всё работает на SCLK до 20МГц - все операции записи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.