Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

SSD1289 трабл

Непрочитано 02.08.2011, 14:57  
DarkEN_ANGEL
Частый гость
 
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
DarkEN_ANGEL на пути к лучшему
По умолчанию SSD1289 трабл

День добрый!
Приобрёл себе такой вот дисплейчик. http://unidk.com/index.php?p=shop&ac...=tft-lcd-hy32d
Попробовал запустить - фиг, дисплей молчит.
Что имею: имею платку со станогим stm32f103 (72 мГц, 64RAM, 512 flash), дисплей и связывающий их шлейф длинной где-то 15-20 сантиметров. К плате дисплея и к плате процессора концы шлейфа подключены через IDC разъёмы.

Вот первый вариант кода управления дисплеем:
Код:
#include "ssd1289.h"
#include "mdefs.h"
#include ‹stdio.h›

void DispOneColor(uint16_t Color);
void InitSSD();
void DispClear(void);

void DelayNS(uint16_t ns)
{
  for (int i=ns; i›0; i--)
  {
    for (int j=0; j‹7200; j++) {}
  }
}

// перезагрузка контроллера
void SSDReset()
{
  cpin_m(SSDCntrlPort, RST_MASK);
  DelayNS(2000);                  
  spin_m(SSDCntrlPort, RST_MASK);
}

// переключение дата порта на вход
void SSDSetInput()
{
  pinOutZ_b(SSDDataPort, 0);
  pinOutZ_b(SSDDataPort, 1);
  pinOutZ_b(SSDDataPort, 2);
  pinOutZ_b(SSDDataPort, 3);
  pinOutZ_b(SSDDataPort, 4);
  pinOutZ_b(SSDDataPort, 5);
  pinOutZ_b(SSDDataPort, 6);
  pinOutZ_b(SSDDataPort, 7);
  pinOutZ_b(SSDDataPort, 8);
  pinOutZ_b(SSDDataPort, 9);
  pinOutZ_b(SSDDataPort, 10);
  pinOutZ_b(SSDDataPort, 11);
  pinOutZ_b(SSDDataPort, 12);
  pinOutZ_b(SSDDataPort, 13);
  pinOutZ_b(SSDDataPort, 14);
  pinOutZ_b(SSDDataPort, 15);
}

// переключение дата порта на выход
void SSDSetOutput()
{
  pinOutPP_b(SSDDataPort, 0);
  pinOutPP_b(SSDDataPort, 1);
  pinOutPP_b(SSDDataPort, 2);
  pinOutPP_b(SSDDataPort, 3);
  pinOutPP_b(SSDDataPort, 4);
  pinOutPP_b(SSDDataPort, 5);
  pinOutPP_b(SSDDataPort, 6);
  pinOutPP_b(SSDDataPort, 7);
  pinOutPP_b(SSDDataPort, 8);
  pinOutPP_b(SSDDataPort, 9);
  pinOutPP_b(SSDDataPort, 10);
  pinOutPP_b(SSDDataPort, 11);
  pinOutPP_b(SSDDataPort, 12);
  pinOutPP_b(SSDDataPort, 13);
  pinOutPP_b(SSDDataPort, 14);
  pinOutPP_b(SSDDataPort, 15);
}

// интерфейс дисплея - intel 8080
void SendComm(uint16_t comm)
{
  cpin_m(SSDCntrlPort, CS_MASK);  // подаём на CS 0
  wr_port(SSDDataPort, comm);      // пишем команду в дата порт
  cpin_m(SSDCntrlPort, WR_MASK);  // подаём на WR 0
  spin_m(SSDCntrlPort, WR_MASK);  // подаём на WR 1 (???)
  spin_m(SSDCntrlPort, CS_MASK);  // подаём на CS 1
}


void SendData(uint16_t data)
{
  cpin_m(SSDCntrlPort, CS_MASK); 
  spin_m(SSDCntrlPort, RS_MASK);
  wr_port(SSDDataPort, data);    
  cpin_m(SSDCntrlPort, WR_MASK);
  spin_m(SSDCntrlPort, WR_MASK);
  spin_m(SSDCntrlPort, CS_MASK); 
}

void SSDSendComm(uint16_t addr, uint16_t data)
{
  SendComm(addr);
  SendData(data);
}


uint16_t read_reg(uint16_t addr)
{
  uint16_t ret;    
  cpin_m(SSDCntrlPort, CS_MASK); // подаём на CS 0
  
  cpin_m(SSDCntrlPort, RS_MASK); // подаём на RS 0
  wr_port(SSDDataPort, addr);    // пишем адрес в порт данных
  cpin_m(SSDCntrlPort, WR_MASK); // подаём на WR 0
  spin_m(SSDCntrlPort, WR_MASK); // подаём на WR 1
  
  SSDSetInput(); // переключаем дата порт на вход

  cpin_m(SSDCntrlPort, RD_MASK); // подаём на RD 0
  asm("nop");   
  ret = rd_port(SSDDataPort);    // читаем значение из дата порта

  spin_m(SSDCntrlPort, RD_MASK); // подаём на RD 1
  spin_m(SSDCntrlPort, CS_MASK); // подаём на CS 1
  
  SSDSetOutput(); // переключаем дата порт на выход
 
  return ret;     
}

uint16_t CheckID()
{
  uint16_t deviceid = read_reg(0x00);
  return deviceid;
}

void InitSSD(void)
{
  // настраиваем порты
  RCC-›APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPEEN;
  // настройка пинов RD, RS, WR, CS на push-pull выходы
  pinOutPP_b(SSDCntrlPort, RD);
  pinOutPP_b(SSDCntrlPort, RS);
  pinOutPP_b(SSDCntrlPort, WR);
  pinOutPP_b(SSDCntrlPort, CS);
  pinOutPP_b(SSDCntrlPort, RST);
  // подаём на пины управления высокий уровень
  spin_m(SSDCntrlPort, RS_MASK);
  spin_m(SSDCntrlPort, CS_MASK);
  spin_m(SSDCntrlPort, WR_MASK);
  spin_m(SSDCntrlPort, RD_MASK);
  spin_m(SSDCntrlPort, RST_MASK);
  
  SSDReset();
  
  uint16_t dID = CheckID();
  if (dID == 0x8989)
  { 
    SSDSendComm(0x0000,0x0001);    DelayNS(1000); 
    SSDSendComm(0x0003,0xA8A4);    DelayNS(1000); 
    SSDSendComm(0x000C,0x0000);    DelayNS(1000);   
    SSDSendComm(0x000D,0x080C);    DelayNS(1000);   
    SSDSendComm(0x000E,0x2B00);    DelayNS(1000);   
    SSDSendComm(0x001E,0x00B0);    DelayNS(1000);   
    SSDSendComm(0x0001,0x2B3F);    DelayNS(1000);
    SSDSendComm(0x0002,0x0600);    DelayNS(1000);
    SSDSendComm(0x0010,0x0000);    DelayNS(1000);
    SSDSendComm(0x0011,0x6070);    DelayNS(1000);    
    SSDSendComm(0x0005,0x0000);    DelayNS(1000);
    SSDSendComm(0x0006,0x0000);    DelayNS(1000);
    SSDSendComm(0x0016,0xEF1C);    DelayNS(1000);
    SSDSendComm(0x0017,0x0003);    DelayNS(1000);
    SSDSendComm(0x0007,0x0233);    DelayNS(1000);          
    SSDSendComm(0x000B,0x0000);    DelayNS(1000);
    SSDSendComm(0x000F,0x0000);    DelayNS(1000);        
    SSDSendComm(0x0041,0x0000);    DelayNS(1000);
    SSDSendComm(0x0042,0x0000);    DelayNS(1000);
    SSDSendComm(0x0048,0x0000);    DelayNS(1000);
    SSDSendComm(0x0049,0x013F);    DelayNS(1000);
    SSDSendComm(0x004A,0x0000);    DelayNS(1000);
    SSDSendComm(0x004B,0x0000);    DelayNS(1000);
    SSDSendComm(0x0044,0xEF00);    DelayNS(1000);
    SSDSendComm(0x0045,0x0000);    DelayNS(1000);
    SSDSendComm(0x0046,0x013F);    DelayNS(1000);
    SSDSendComm(0x0030,0x0707);    DelayNS(1000);
    SSDSendComm(0x0031,0x0204);    DelayNS(1000);
    SSDSendComm(0x0032,0x0204);    DelayNS(1000);
    SSDSendComm(0x0033,0x0502);    DelayNS(1000);
    SSDSendComm(0x0034,0x0507);    DelayNS(1000);
    SSDSendComm(0x0035,0x0204);    DelayNS(1000);
    SSDSendComm(0x0036,0x0204);    DelayNS(1000);
    SSDSendComm(0x0037,0x0502);    DelayNS(1000);
    SSDSendComm(0x003A,0x0302);    DelayNS(1000);
    SSDSendComm(0x003B,0x0302);    DelayNS(1000);
    SSDSendComm(0x0023,0x0000);    DelayNS(1000);
    SSDSendComm(0x0024,0x0000);    DelayNS(1000);
    SSDSendComm(0x0025,0x8000);    DelayNS(1000);
    SSDSendComm(0x004f,0);
    SSDSendComm(0x004e,0);
  }
  else
  {
    printf("Wrong device ID! Device code is %d", dID);
  }
}

void DispOneColor(uint16_t Color)
{
  uint16_t i,j;
  SSDSendComm(0x004f,0);        //?????·0
  SSDSendComm(0x004e,0);        //?????·0
  SendComm(0x22);
  for(j=0;j‹320;j++)
    for(i=0;i‹240;i++)
      SendData(Color);
}

void DispClear(void)
{
  DispOneColor(BLUE);
}
Функция CheckID выдавала что попало, но не заветные 0х8989. Причём, каждый раз разное... Дисплей, естественно, не работает. Очень странно.

На следующий день решил заюзать FSMC (Flexible Static Memory Controller), что присутствует на борту моего камня, для управления дисплеем. (FSMC это контроллер памяти, который может рулить SRAM, NAND и ещё каким-то типом памяти).
Подключил, написал драйвер (FSMC настраивал на работу с NOR Flash)... Включил - опять нифига. Прочитал нулевой регистр - вообще по нулям...
Даже вот не знаю что думать... Неужели контроллер дохлый? ((
Может кто сталкивался с подобной ситуацией?

PS: могу выложить код для работы с FSMC...
Реклама:
DarkEN_ANGEL вне форума  
Сказали "Спасибо" DarkEN_ANGEL
warel (28.06.2019)
Непрочитано 02.08.2011, 17:54  
BigallS
Временная регистрация
 
Регистрация: 18.04.2011
Адрес: Russia
Сообщений: 51
Сказал спасибо: 7
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
BigallS на пути к лучшему
По умолчанию Re: SSD1289 трабл.

Поиском пользовались эту тему читали https://kazus.run/forums/showthread....hlight=SSD1289
BigallS вне форума  
Сказали "Спасибо" BigallS
warel (28.06.2019)
Непрочитано 02.08.2011, 21:38  
DarkEN_ANGEL
Частый гость
 
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
DarkEN_ANGEL на пути к лучшему
По умолчанию Re: SSD1289 трабл.

Сообщение от BigallS Посмотреть сообщение
Поиском пользовались эту тему читали https://kazus.run/forums/showthread....hlight=SSD1289
Поиском пользовались, тему читали. Но окончательного диагноза так и не поняли. Посему и написали.
DarkEN_ANGEL вне форума  
Сказали "Спасибо" DarkEN_ANGEL
warel (28.06.2019)
Непрочитано 02.08.2011, 22:41  
tomatniy
Прохожий
 
Регистрация: 24.09.2008
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
tomatniy на пути к лучшему
По умолчанию Re: SSD1289 трабл

в SendData вы устанавливаете сигнал RS, а в SendComm забыли сбрасывать.
Поправьте, если не заработает будем общаться дальше
tomatniy вне форума  
Сказали "Спасибо" tomatniy
warel (28.06.2019)
Непрочитано 02.08.2011, 22:59  
DarkEN_ANGEL
Частый гость
 
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
DarkEN_ANGEL на пути к лучшему
По умолчанию Re: SSD1289 трабл

Сообщение от tomatniy Посмотреть сообщение
в SendData вы устанавливаете сигнал RS, а в SendComm забыли сбрасывать.
Поправьте, если не заработает будем общаться дальше
Спасибо, сейчас устраню пару ошибок в настройке FSMC, если не заработает - сделаю по-старому и справлю. Спасибо!

UPD.
Нашёл багу в настройке FSMC, теперь дисплей отдаёт свой ID.
Но его инициализация ни к чему не приводит... Экран пуст.
Какой из инитов посоветуете пользовать?

Последний раз редактировалось DarkEN_ANGEL; 02.08.2011 в 23:13.
DarkEN_ANGEL вне форума  
Сказали "Спасибо" DarkEN_ANGEL
warel (28.06.2019)
Непрочитано 03.08.2011, 00:24  
yarunt
Прописка
 
Регистрация: 11.07.2007
Сообщений: 127
Сказал спасибо: 8
Сказали Спасибо 24 раз(а) в 18 сообщении(ях)
yarunt на пути к лучшему
По умолчанию Re: SSD1289 трабл

Сообщение от DarkEN_ANGEL Посмотреть сообщение
Спасибо, сейчас устраню пару ошибок в настройке FSMC, если не заработает - сделаю по-старому и справлю. Спасибо!

UPD.
Нашёл багу в настройке FSMC, теперь дисплей отдаёт свой ID.
Но его инициализация ни к чему не приводит... Экран пуст.
Какой из инитов посоветуете пользовать?
Инит с вашего кода однозначно работает, где-то не правильно дергаются ноги.
yarunt вне форума  
Сказали "Спасибо" yarunt
warel (28.06.2019)
Непрочитано 03.08.2011, 00:40  
DarkEN_ANGEL
Частый гость
 
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
DarkEN_ANGEL на пути к лучшему
По умолчанию Re: SSD1289 трабл

Тут такая ситуация.. Он(дисплей), сволочь, откликается числом 0x8989 как-то раз через раз... То 0x8989, то 0x0000...

Кстати такая подробность есть. Контроллер дисплея и подсветка питаются от сетевого импульсного БП 5 вольт 2А от роутера (ессно для контроллера в дисплее стабилизатор 3v3), а платка с stm32 от ноутбука...
Так вот разница в землях контроллера и дисплея аж 0,58 Вольта. Это может быть причиной такого спонтанного поведения? По идее скорость передачи данных достаточно высокая и такая разница может наделать много помех, я прав?
DarkEN_ANGEL вне форума  
Сказали "Спасибо" DarkEN_ANGEL
warel (28.06.2019)
Непрочитано 03.08.2011, 19:46  
Solomiichuk
Временная регистрация
 
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
Solomiichuk на пути к лучшему
По умолчанию Re: SSD1289 трабл

Цитата:
Так вот разница в землях контроллера и дисплея аж 0,58 Вольта. Это может быть причиной такого спонтанного поведения?
Максимально допустимое напряжение уровня лог."0" для SSD1289 0,2xVDDIO, т.е. при 3В напряжения питания лог."0" должен быть не более 0,6В. При Вашей разнице между землями в 0,58В Вы уже на грани фола. Замерьте логические уровни на разъеме ЖКИ и все станет ясно.
Solomiichuk вне форума  
Сказали "Спасибо" Solomiichuk
warel (28.06.2019)
Непрочитано 03.08.2011, 19:46  
tomatniy
Прохожий
 
Регистрация: 24.09.2008
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
tomatniy на пути к лучшему
По умолчанию Re: SSD1289 трабл

в вашем случае не помешает вставить задержу между строками
Код:
cpin_m(SSDCntrlPort, WR_MASK);  // подаём на WR 0
spin_m(SSDCntrlPort, WR_MASK);  // подаём на WR 1 (???)
tomatniy вне форума  
Сказали "Спасибо" tomatniy
warel (28.06.2019)
Непрочитано 03.08.2011, 20:10  
Mickael_W
Прохожий
 
Регистрация: 16.09.2009
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Mickael_W на пути к лучшему
По умолчанию Re: SSD1289 трабл

Попытайтесь понизить уровень оптимизации компилятора.
Иногда оптимизатор не понимает, зачем нужно устанавливать некий бит
чтобы тут же его сбросить и "оптимизирует" код, исключая эту ненужную операцию.
Проверяется просмотром полученного кода, осциллографом, либо отключением оптимизации.
Mickael_W вне форума  
Сказали "Спасибо" Mickael_W
warel (28.06.2019)
 

Метки
ssd1289
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Библиотека SSD1289 Uragan90 Микроконтроллеры, АЦП, память и т.д 199 22.09.2014 20:17


Часовой пояс GMT +4, время: 15:53.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.