| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
SSD1289 трабл
02.08.2011, 14:57
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
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
|
|
|
02.08.2011, 17:54
|
|
|
Временная регистрация
Регистрация: 18.04.2011
Адрес: Russia
Сообщений: 51
Сказал спасибо: 7
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: SSD1289 трабл.
|
|
|
|
Сказали "Спасибо" BigallS
|
|
|
02.08.2011, 21:38
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: SSD1289 трабл.
Поиском пользовались, тему читали. Но окончательного диагноза так и не поняли. Посему и написали.
|
|
|
|
Сказали "Спасибо" DarkEN_ANGEL
|
|
|
02.08.2011, 22:41
|
|
|
Прохожий
Регистрация: 24.09.2008
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: SSD1289 трабл
в SendData вы устанавливаете сигнал RS, а в SendComm забыли сбрасывать.
Поправьте, если не заработает будем общаться дальше
|
|
|
|
Сказали "Спасибо" tomatniy
|
|
|
02.08.2011, 22:59
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: SSD1289 трабл
Сообщение от tomatniy
|
в SendData вы устанавливаете сигнал RS, а в SendComm забыли сбрасывать.
Поправьте, если не заработает будем общаться дальше
|
Спасибо, сейчас устраню пару ошибок в настройке FSMC, если не заработает - сделаю по-старому и справлю. Спасибо!
UPD.
Нашёл багу в настройке FSMC, теперь дисплей отдаёт свой ID.
Но его инициализация ни к чему не приводит... Экран пуст.
Какой из инитов посоветуете пользовать?
Последний раз редактировалось DarkEN_ANGEL; 02.08.2011 в 23:13.
|
|
|
|
Сказали "Спасибо" DarkEN_ANGEL
|
|
|
03.08.2011, 00:24
|
|
|
Прописка
Регистрация: 11.07.2007
Сообщений: 127
Сказал спасибо: 8
Сказали Спасибо 24 раз(а) в 18 сообщении(ях)
|
Re: SSD1289 трабл
Сообщение от DarkEN_ANGEL
|
Спасибо, сейчас устраню пару ошибок в настройке FSMC, если не заработает - сделаю по-старому и справлю. Спасибо!
UPD.
Нашёл багу в настройке FSMC, теперь дисплей отдаёт свой ID.
Но его инициализация ни к чему не приводит... Экран пуст.
Какой из инитов посоветуете пользовать?
|
Инит с вашего кода однозначно работает, где-то не правильно дергаются ноги.
|
|
|
|
03.08.2011, 00:40
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: SSD1289 трабл
Тут такая ситуация.. Он(дисплей), сволочь, откликается числом 0x8989 как-то раз через раз... То 0x8989, то 0x0000...
Кстати такая подробность есть. Контроллер дисплея и подсветка питаются от сетевого импульсного БП 5 вольт 2А от роутера (ессно для контроллера в дисплее стабилизатор 3v3), а платка с stm32 от ноутбука...
Так вот разница в землях контроллера и дисплея аж 0,58 Вольта. Это может быть причиной такого спонтанного поведения? По идее скорость передачи данных достаточно высокая и такая разница может наделать много помех, я прав?
|
|
|
|
Сказали "Спасибо" DarkEN_ANGEL
|
|
|
03.08.2011, 19:46
|
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: SSD1289 трабл
|
Цитата:
|
|
Так вот разница в землях контроллера и дисплея аж 0,58 Вольта. Это может быть причиной такого спонтанного поведения?
|
Максимально допустимое напряжение уровня лог."0" для SSD1289 0,2xVDDIO, т.е. при 3В напряжения питания лог."0" должен быть не более 0,6В. При Вашей разнице между землями в 0,58В Вы уже на грани фола. Замерьте логические уровни на разъеме ЖКИ и все станет ясно.
|
|
|
|
Сказали "Спасибо" Solomiichuk
|
|
|
03.08.2011, 19:46
|
|
|
Прохожий
Регистрация: 24.09.2008
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: SSD1289 трабл
в вашем случае не помешает вставить задержу между строками
|
Код:
|
cpin_m(SSDCntrlPort, WR_MASK); // подаём на WR 0
spin_m(SSDCntrlPort, WR_MASK); // подаём на WR 1 (???) |
|
|
|
|
Сказали "Спасибо" tomatniy
|
|
|
03.08.2011, 20:10
|
|
|
Прохожий
Регистрация: 16.09.2009
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: SSD1289 трабл
Попытайтесь понизить уровень оптимизации компилятора.
Иногда оптимизатор не понимает, зачем нужно устанавливать некий бит
чтобы тут же его сбросить и "оптимизирует" код, исключая эту ненужную операцию.
Проверяется просмотром полученного кода, осциллографом, либо отключением оптимизации.
|
|
|
|
Сказали "Спасибо" Mickael_W
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Библиотека SSD1289
|
Uragan90 |
Микроконтроллеры, АЦП, память и т.д |
199 |
22.09.2014 20:17 |
Часовой пояс GMT +4, время: 15:53.
|
|