|
ILI9320 и ILI9325 - есть ли разница в подключении и низкоуровневом общении ? |
|
|
|
Jan 24 2016, 07:37
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
(1 - 10)
|
Jan 24 2016, 14:21
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 24 2016, 15:20
|
Знающий
   
Группа: Свой
Сообщений: 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)  почитайте пост внимательней, проблема уже при записи... Обязательно бы это сделал, если бы вы не отредактировали исходное сообщение.
|
|
|
|
|
Jan 24 2016, 16:22
|
Гуру
     
Группа: Участник
Сообщений: 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 к минусу - не помогло((
|
|
|
|
|
Jan 25 2016, 17:08
|
Гуру
     
Группа: Участник
Сообщений: 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; }
|
|
|
|
|
Feb 10 2016, 18:22
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Так я и не понял, как все-таки эти дисплеи заводить.... Два новых дисплея, запаяны на плату, на которой до этого и после этого прекрасно работает ILI9320. Про код я вообще молчу, ибо, учитывая, что регистр чтения располагается по адресу 0x0000, можно даже не обращать внимания на то проходит ли сигнал по линиям данных или нет - нужно опустить CS, дернуть вниз RS и WR, поднять их вверх и опустить RD. Затем осциллографом прямо с контактов дисплея поискать единички. Их нет...
P.S. 3 года назад, как я вспомнил, я тоже приобретал дисплей и мне подсунули 9325. Не заработало. Я счел его неисправным и забыл. А сейчас история повторилась.... У всех 3-х дисплеев разные продавцы...
Есть у кого-нибудь возможность проверить на одной и той же плате с одним и тем же кодом оба дисплейных контроллера?
Сообщение отредактировал zheka - Feb 10 2016, 18:22
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|