реклама на сайте
подробности

 
 
> ILI9320 и ILI9325 - есть ли разница в подключении и низкоуровневом общении ?
zheka
сообщение Jan 24 2016, 07:37
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Господа, у меня на столе две платы с STM32F103 и по 2 дисплея ILI9320 и ILI9325.
25 дисплеи не работают, хотя код написан под оба.
Ковыряние показало, что регистры прочесть не получается. Детальное ковыряние выявило странную вещь - когда пишешь данные в порт и включаешь RS=1, напряжение на выходах около 1.5 вольт, ощущение, что дисплей пытается притянуть линию к земле, при CS=1 такого явления не наблюдается.

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

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

Что я делаю не так?

Сообщение отредактировал zheka - Jan 24 2016, 13:19
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
psL
сообщение Jan 24 2016, 13:29
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



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

UPD: И код вообще решили убрать из темы?
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 24 2016, 14:21
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Цитата(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 - на всех выходах полноченные единицы
Описанная ситауция наблюдается на всех пинах

Сообщение отредактировал zheka - Jan 24 2016, 14:28
Go to the top of the page
 
+Quote Post
psL
сообщение Jan 24 2016, 15:20
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Цитата(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) *
почитайте пост внимательней, проблема уже при записи...

Обязательно бы это сделал, если бы вы не отредактировали исходное сообщение.
Go to the top of the page
 
+Quote Post
khach
сообщение Jan 24 2016, 15:32
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 439
Регистрация: 29-12-04
Пользователь №: 1 741



А как у ILI9325 выводы IM3,IM2,IM1,IM0/ID выбора типа интерфейса запаяны? Встречался модуль где распайка с фабрики была под последовательный интерфейс.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 24 2016, 16:22
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Цитата
Далее можно проверить шину, выдывая в нее попеременно 0xFFFF 0x0000 и убедиться, что сигналы с мк доходят до модуля.

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

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


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

подсоединил IM0 IM3 к минусу - не помогло((
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 25 2016, 16:20
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Причина странного поведения линий выявлена - у меня во время записи RD был подтянут к нулю. Он нигде не инициализировался. Китаезный код, чтоб его.
Непонятно только две вещи:
1. Как с этим кривым кодом работает ILI9320
2. Почему регистры и после исправления этой ситуации не читаются...
Go to the top of the page
 
+Quote Post
khach
сообщение Jan 25 2016, 16:29
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 439
Регистрация: 29-12-04
Пользователь №: 1 741



Цитата(zheka @ Jan 25 2016, 19:20) *
2. Почему регистры и после исправления этой ситуации не читаются...

Регистры не читаются, т.к у ILI9325 и прочих очень слабые драйверы шины. Если читать методом "дрыгоножества" с задержкой между стробом чтения и собственно считыванием шины- то обычно все читается, а если через FSMC - то надо увеличивать задержки на шине значительно. Надо осциллом сесть на шину, пустить считывание в цикле и посмотреть на задержки, когда уровни 0 и 1 устаканятся.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 25 2016, 17:08
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



ставил задержки аж в 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;
        
}
Go to the top of the page
 
+Quote Post
zheka
сообщение Feb 10 2016, 18:22
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Так я и не понял, как все-таки эти дисплеи заводить....
Два новых дисплея, запаяны на плату, на которой до этого и после этого прекрасно работает ILI9320.
Про код я вообще молчу, ибо, учитывая, что регистр чтения располагается по адресу 0x0000, можно даже не обращать внимания на то проходит ли сигнал по линиям данных или нет - нужно опустить CS, дернуть вниз RS и WR, поднять их вверх и опустить RD. Затем осциллографом прямо с контактов дисплея поискать единички. Их нет...

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

Есть у кого-нибудь возможность проверить на одной и той же плате с одним и тем же кодом оба дисплейных контроллера?

Сообщение отредактировал zheka - Feb 10 2016, 18:22
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 11 2016, 06:28
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Хм... интересно.... Тоже столкнулся с тем, что ничего не могу считать - ни идентификатор ни пр. Только я читаю по SPI. Может тут та же проблема?
Хотя понизил SCLK для операций чтения до 6МГц. Похоже - надо ещё ниже. Надо будет глянуть как осцилл вернут...
В остальном всё работает на SCLK до 20МГц - все операции записи.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 11:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.03499 секунд с 7
ELECTRONIX ©2004-2016