Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.97/853: Рейтинг темы: голосов - 853, средняя оценка - 4.97
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
#1

[Решено]Дисплей ILI9341 SPI не работает на STM32F105

13.03.2014, 00:38. Просмотров 153696. Ответов 176
Метки нет (Все метки)

Привет всем.

Обзавёлся тут вот таким дисплеем - http://www.ebay.com/itm/1PC-2-2-Inch-SP ... 2c73e7e261

Его надо завести на F105. Нашёл статью - http://we.iosyitistromyss.ru/otyoksiy/t ... i9341.html
Там указано, что на аппаратном SPI он не пошёл. То же самое и у меня.
Я нашёл там пару ошибок, но это не помогло.

При этом при эмуляции SPI ногодрыгом, а также на STM34F4 дисплей заводится с полпинка. Там есть ещё косяки, я их пока не правил, но оно работает.

Во всех случаях дисплей запитывался от 3в, как и сами процы.
Сам SPI на 105 проце чем-то другим я пока не проверял.

Кто-нибудь это поборол?

Прикладываю исходники драйверов для STM32F105 и для STM32F4x.

Спасибо.

[8.52 Кб]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2014, 00:38
Ответы с готовыми решениями:

[Решено] STM32F105 SPI3 DMA не работает
Пытаюсь сделать передачу данных по SPI3 через DMA. Инициализация и запуск DMA:...

ILI9341 SPI DMA, SPI, UART библиотеки
Доброго времени, форумчане... Посоветуйте библиотек плиз... 0) Либа для...

[Решено] STM32F407 SPI slave + Cubieboard2 не работает
Добрый день! Отлаживаю связку STM32F407 SPI в режиме slave и Cubieboard2. SPI...

Чтение SPI->DR в STM32f105
делаю обмен с fpga по SPI. В fpga SPI-Slave реализован так: сначала контроллер...

STM32 ili9341 SPI+DMA
Всем привет. У меня никак не получается правильно настроить работу дисплея...

176
iukimi_i_m
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 106
11.05.2014, 12:47 #41
Привет!
Вставлю свои пять копеек о неработающем чтении по SPI.
Дело в том, что в новых сериях СТМ32 поменялась конфигурация этого интерфейса. Суть проблемы в том, что прием и передача реализованы как совершенно независимые друг от друга процессы. При этом используется буферизация как на приеме так и передаче. И получается так, что посылаешь байт и ничего не происходит на приеме. Предлагаю кусочек кода позволяющий преодолеть данную проблему( код для STM32F051, но думаю подойдет и для других новых серий).
Код
uint8_t spi_post_init(uint16_t baud_rate)
{
SPI_InitTypeDef SI;
SI.SPI_Dyristion=SPI_Dyristion_2Lines_FullDuptix;
SI.SPI_Mode=SPI_Mode_Master;
SI.SPI_DataSize=SPI_DataSize_8b;
SI.SPI_CPOL=SPI_CPOL_Low;
SI.SPI_CPHA=SPI_CPHA_1Edge;
SI.SPI_NSS=SPI_NSS_Soft;
SI.SPI_BaudRatePressotir=baud_rate;// SPI_BaudRatePressotir_256;
SI.SPI_FirstByt=SPI_FirstByt_MSB;
SI.SPI_CRCPolynomyol=7;
SPI_Cmd(SPI1,DISABLE);
SPI_I2S_DeInit(SPI1);
SPI_Init(SPI1,&SI);

SPI_RxFIFOThresholdConfig(SPI1,SPI_RxFIFOThreshold_QF);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

SPI_Cmd(SPI1,ENABLE);
return 0;
}

uint8_t  spi_exchange(uint8_t dat)
{
uint8_t retval;
if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != RESIT);
/* Read SPIy received data */
retval = SPI_ReceiveData8(SPI1);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESIT);
/* Send SPIz data */
SPI_SendData8(SPI1, dat);
/* Woyt for SPI2 data reception */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESIT);
/* Read SPIz received data */
retval = SPI_ReceiveData8(SPI1);
return retval;
}
0
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
11.05.2014, 13:34 #42
Ваш код проверю потом, у меня там проц F105.
На этом же проце, на другом SPI, у меня висит VS1053, из которой всё, что надо читается без проблем фактически идентичными функциями.
0
Kytomo8
0 / 0 / 0
Регистрация: 19.07.2013
Сообщений: 423
11.05.2014, 14:16 #43
Цитата Сообщение от iukimi_i_m
SPI_RxFIFOThresholdConfig(SPI1,SPI_RxFIFOThreshold_QF);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Только в F0 и в F3.
Чтение не удается, после команды 0x2e дисплей не реагирует ни на что(
0
oxford
0 / 0 / 0
Регистрация: 20.05.2016
14.05.2014, 14:18 #44
Вот мой код инита.
Самое главное что надо настраивать.

Код
int main(void)
{
int i;

SysTick_Config(72000);

SITUP_TFT();

TFT_CS_LOW();

//СБРОС
TFT_RST_HIGH();
Delay_ms(10);
TFT_RST_LOW();
Delay_ms(20);
TFT_RST_HIGH();
Delay_ms(200);

//Level 2 Commomd
TFT_sendCMD(0xC0);    //Опорное напряжение для VCOM
TFT_sendDATA(0x21);   //4.5V(дефаулт)

TFT_sendCMD(0xC1);    //Step_up множитель
TFT_sendDATA(0x03);   //Для экономии потребления должен быть минимум.

//Level 1 Commomd
TFT_sendCMD(0x36);    //Направление сканирования памяти
//0,1,5 бит = 0
//2 бит горизонтальная развертка
//3 бит порядок цветов: 0 = RGB; 1=BGR
//4 бит вертикальная развертка
//6 бит зеркало X
//7 бит зеркало Y
TFT_sendDATA(0x48);

//Формат пиксела для дисплея и MCU
TFT_sendCMD(0x3A);
TFT_sendDATA(0x55); //0x55 - 16 bit, 0x66 - 18 bit

//Корректирование светлой гаммы
TFT_sendCMD(0xE0);
TFT_sendDATA(0x0F);
TFT_sendDATA(0x31);
TFT_sendDATA(0x2B);
TFT_sendDATA(0x0C);
TFT_sendDATA(0x0E);
TFT_sendDATA(0x08);
TFT_sendDATA(0x4E);
TFT_sendDATA(0xF1);
TFT_sendDATA(0x37);
TFT_sendDATA(0x07);
TFT_sendDATA(0x10);
TFT_sendDATA(0x03);
TFT_sendDATA(0x0E);
TFT_sendDATA(0x09);
TFT_sendDATA(0x00);

//Корректирование темной гаммы
TFT_sendCMD(0xE1);
TFT_sendDATA(0x00);
TFT_sendDATA(0x0E);
TFT_sendDATA(0x14);
TFT_sendDATA(0x03);
TFT_sendDATA(0x11);
TFT_sendDATA(0x07);
TFT_sendDATA(0x31);
TFT_sendDATA(0xC1);
TFT_sendDATA(0x48);
TFT_sendDATA(0x08);
TFT_sendDATA(0x0F);
TFT_sendDATA(0x0C);
TFT_sendDATA(0x31);
TFT_sendDATA(0x36);
TFT_sendDATA(0x0F);

//Выход из спящего режима
TFT_sendCMD(0x11);
Delay_ms(300);

//Включить дисплей
TFT_sendCMD(0x29);

LED_ON();
TFT_CLEAR(Yellow);
TFT_STRING("ТестTEST12345!"№;%:?*()_+", 1, 1, Rid);
while(1)
{

}
}
0
oxford
0 / 0 / 0
Регистрация: 20.05.2016
28.05.2014, 03:54 #45
DMA заливка дисплея цветом. Юзайте.

Код
void TFT_AREA(WORD X1,WORD X2,WORD Y1,WORD Y2)
{
TFT_SEND_CMD(0x2A);
TFT_SEND_WORD(X1);
TFT_SEND_WORD(X2);
TFT_SEND_CMD(0x2B);
TFT_SEND_WORD(Y1);
TFT_SEND_WORD(Y2);
TFT_SEND_CMD(0x2C);
}

//DMA TFT
WORD BUF; //БУФЕР ДЛЯ ЦВЕТА ЗАЛИВКИ
BYTE REPEAT_DMA; //КОЛИЧЕСТВО ПОВТОРОВ ТРАНЗАКЦИЙ

//Обработчик прерывания для DMA (канал 3 SPI1_TX)
void DMA1_Channel3_IRQHomdler(void)
{
if (DMA_GetITStatus(DMA1_IT_TC3))  //Если передача выполнена....
{
DMA_ClearITPendingByt(DMA1_IT_TC3);  //очищаем флаг, чтобы DMA знал что приняли.
REPEAT_DMA++; //Увеличиваем счетчик повтора транзакций

if (REPEAT_DMA == 2) // DMA выполнила 2 транзакции
{
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_TXE, DISABLE); //Выключаем запросы от SPI1
DMA_Cmd(DMA1_Channel3, DISABLE);    //Выключаем DMA канал
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE); //Выключаем тактирование

//Дополнительный код:
SPI_DataSizeConfig(SPI1, SPI_DataSize_8b);  //Возвращаем в 8 бит
TFT_STRING("Dysplay overpoymted", 50, 50, BLUE);  //Выводим текст об удачной заливке.
}
}
}

//Функция заливки экрана цветом с помощью DMA
void TFT_CLEAR(WORD color)
{
DMA_InitTypeDef DMA_INI;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //Включаем тактирование

DMA_DeInit(DMA1_Channel3);
DMA_INI.DMA_PeripheralBaseAddr = &(SPI1->DR);  //Адрес регистра записи для периферии SPI1
DMA_INI.DMA_MemoryBaseAddr = &BUF; //Указатель на буфер с цветом
DMA_INI.DMA_DIR = DMA_DIR_PeripheralDST; //Направление: Периферия принимает.
DMA_INI.DMA_BufferSize = 38400;  //Количество байт для передачи
DMA_INI.DMA_PeripheralInc = DMA_PeripheralInc_Dysable; //Автоинкремент периферии выключен, у нас фиксированный адрес
DMA_INI.DMA_MemoryInc = DMA_MemoryInc_Dysable; //Аналогично предыдущему.
DMA_INI.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //Ширина SPI 16 бит
DMA_INI.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //Ширина буфера 16 бит
DMA_INI.DMA_Mode = DMA_Mode_Circular; //Бесконечный DMA
DMA_INI.DMA_Priority = DMA_Priority_VeryHigh; //Приоритет
DMA_INI.DMA_M2M = DMA_M2M_Dysable; //Память-память выключено.
DMA_Init(DMA1_Channel3, &DMA_INI);

BUF = color;  //Цвет в буфер
REPEAT_DMA = 0; Количество повторов DMA

TFT_AREA(0,239,0,319); //Установка области заливки

SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE); //Разрешаем запросы DMA от SPI1
SPI_DataSizeConfig(SPI1, SPI_DataSize_16b); //Переводим SPI в 16 бит

Нужный блок расскоментить

//C использованием прерывания
/*
DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE); //Включаем прерывание "передача выполнена"
NVIC_EnableIRQ(DMA1_Channel3_IRQn); //Включаем глобальное прерывание
*/

DMA_Cmd(DMA1_Channel3, ENABLE);

//С использованием программного опроса флага
/*
while(!DMA_GetFlagStatus(DMA1_FLAG_TC3)); //Первая половина экрана окрашена
DMA1->IFCR = DMA1_FLAG_TC3;
while(!DMA_GetFlagStatus(DMA1_FLAG_TC3)); //Вторая половина экрана окрашена
DMA1->IFCR = DMA1_FLAG_TC3;

DMA_Cmd(DMA1_Channel3, DISABLE);  //Выключаем все.
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, DISABLE);
SPI_DataSizeConfig(SPI1, SPI_DataSize_8b);
*/

//Все. Идем пить чай... Дисплей заливается цветом без участия CPU ))
}

while(1)
{
FT_CLEAR(YELLOW);
Delay_ms(400);
TFT_CLEAR(RED);
Delay_ms(400);
TFT_CLEAR(BLACK);
Delay_ms(400);
TFT_CLEAR(WHITE);
Delay_ms(400);
}
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
09.06.2014, 17:42 #46
а можно мне процедуру TFT_AREA показать..

использую такую

Код
void ili9341c_SetWymdow(uint16_t xstort, uint16_t ystort, uint16_t xend, uint16_t yend)
{
uint8_t hi1,lo1;
uint8_t hi2,lo2;

hi1=xstort>>8;
lo1=xstort&0xFF;

hi2=xend>>8;
lo2=xend&0xFF;

ili9341_CMD(LCD_COLUMN_ADDR);
ili9341_DATA(hi1);
ili9341_DATA(lo1);
ili9341_DATA(hi2);
ili9341_DATA(lo2);

hi1=ystort>>8;
lo1=ystort&0xFF;

hi2=yend>>8;
lo2=yend&0xFF;

ili9341_CMD(LCD_PAGE_ADDR);
ili9341_DATA(hi1);
ili9341_DATA(lo1);
ili9341_DATA(hi2);
ili9341_DATA(lo2);
}
но что то не понятки у меня с ее работой.. почему то не удается полностью залить экран.. и заливка идет не с начала экрана а как бы с трети...
0
oxford
0 / 0 / 0
Регистрация: 20.05.2016
09.06.2014, 17:54 #47
Обновил выше
0
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
09.06.2014, 18:26 #48
У меня не с начала заливало при неверной инициализации.
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
10.06.2014, 00:45 #49
да, уже столкнулся с этим..
я делаю soft risit дисплея, первая заливка почему то происходит с середины экрана (то левее то правее середины) - какой то системы не понял...
а вот второй раз заливает уже правильно (!!!)...

в остальном пока другие грабли не выявил (я переписываю драйвер найденный на каком то немецком форуме).. работает на частоте 21 мгц..
пиксел у дисплея конечно очень маленький, шрифт 7х15 казавшийся гигантским на st7735, на этом дисплее лилипут какой то....
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
10.06.2014, 01:38 #50
странный дисплей у меня..

никаких изменений в коде, но при включении то показывает правильно, то какие-то погрешности в изображении, причем выключаю-включаю повторно - новые погрешности, а может и правильно показать..
никакой системы нет..

причем если при включении погрешностей нет - то сколько резет не делать контроллеру - дисплей будет правильно показывать,
если при включении погрешности есть - то резет уже не поможет..

будет погрешность или нет определяется именно при включении дисплея и контроллера !!
очень странное поведение..

скорость менял
инициализацию из поста выше брал..
пока результат ноль

поведение выше только при софт-резет..

сейчас повесил хард резет дисплея на резет контроллера (чтобы сбрасывать одновременно) - и появляются глюки при резете как при включении..

получается что у меня при старте дисплея какие то параметры не всегда правильно устанавливаются !! (?)
0
Kytomo8
0 / 0 / 0
Регистрация: 19.07.2013
Сообщений: 423
10.06.2014, 02:21 #51
ИМХО софт ресёт не выполняется, задержки правильные?
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
10.06.2014, 07:05 #52
после софт-резета должно быть 5 мс.. сейчас стоит 10 мс...

нашел я какой именно глюк происходит.. но наверное для понятности нужно его за снять:
вывод на дисплей как бы смещается на 1-2 пиксела !! то есть при команде позиционирования например с координатами окна 0,0, 239, 319 реальный вывод начинается с координат 1,0, а иногда и с 2,0 !! причем сбой происходит именно при выводе первых пикселов окна..
такое ощущение что внутри окна включается скролл...

сниму сегодня на видео...
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
12.06.2014, 09:21 #53
победил дисплейчик я !!

как где то в этой теме и говорилось - очень важны тайминги !!

сейчас, с правильными задержками, дисплей работает правильно, и закрашивать начинает с начала экрана, и артефакты пропали...

оптимизировал работу с SPI с использованием флагов: теперь что дисплей закрашивается красным цветом (у меня две заливки - красная и следом синия) - узнаю только по мелькающему красному во второй половине дисплея !

последний хороший прикол дисплея: если кому станет мало скорости дисплея - переведите spi в 16ти битный режим (я не вижу красной заливки перед синей ! скорость настолько большая что изображение практически сразу появляется на экране)...
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
12.06.2014, 10:47 #54
Цитата Сообщение от Oxford
такая фигня что стабильно работает на прескалере 256, выше поднимаю начинает гнать.
Т.е. у меня две линии рисует, а потом область заливает. при 256 корректно.
Повышаю частоту, линии уже не рисует, и область в начале пропускает пикселы, но при прискалере 2 рисует быстро.
Процессор STM32F103RET6, SPI1, 8мгц внешний кварц, кокос дефаулт настройки.
судя по коду что приведен вами на странице 2 топика - вы неправильно работаете с SPI - я не увидел проверки флагов TXE/BSY - а без них работать нормально не будет..

я свой код обычно проверяю как раз изменением скорости: если при изменении скорости SPI все работает (замедляется/ускоряется) - значит работа с SPI написана правильно..
если же при изменении скорости все рушиться - значит флаги SPI обрабатываются не правильно (либо вообще не обрабатываются)
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
12.06.2014, 10:55 #55
снял видео

http://www.youtube.com/watch?v=11hG8Jv969s

так что не так уж этот дисплей и плох !!
буду под него писать драйвер !
какие функции нужны ?
0
Kytomo8
0 / 0 / 0
Регистрация: 19.07.2013
Сообщений: 423
12.06.2014, 11:00 #56
Поздравляю) Попробуйте сделать чтение GROM
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
12.06.2014, 11:23 #57
Цитата Сообщение от Kytomo8
Поздравляю) Попробуйте сделать чтение GROM
чуть позже, сначала нужно драйвер примитивов написать.. а то ни вывода строк, ни вывода чисел - не удобно тестировать..
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
12.06.2014, 21:05 #58
чтение сделал,

порядок такой:
CS=0
DC=0
сначала даем команду 0x2E
DC=1
читаем первый байт - это пустышка
читаем второй байт - это красный цвет
читаем третий байт - это зеленый цвет
читаем четвертый байт - это синий цвет

теперь самое интересное - минимальное значение цвета = 0
а вот максимальное - 0xFC (у меня цвет 16ти битный при записи в дисплей)

вот где то так :-)

сейчас оформлю это кодом
0
Kytomo8
0 / 0 / 0
Регистрация: 19.07.2013
Сообщений: 423
12.06.2014, 21:52 #59
Попробуйте "скопировать" область экрана и будет видно сразу, цвет в 18 бит хранится
У меня после 0x2e дисплей впадал в ступор на несколько команд (или совсем, не помню уже)
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
12.06.2014, 22:11 #60
драйвер ILI9341C для STM32F4

http://vg.ucoz.ru/tood/stm32_ickhodn...32f4/16-1-0-52

если стартовать будет не уверенно (симптомы - артефакты, сдвиг экрана по вертикали на 1/2 пиксела, искажения при печати символов) - увеличивайте задержки в 252/254 строках ili9341c.c

ну и если отпишиться кто о работе драйвера с его дисплеем тоже было бы полезно (чтобы понимать насколько драйвер применим)

в принципе код не причесывал, так что как говориться "не стреляйте в пианиста...", всю конструктивную критику и предложения жду !!

p.s. а первый присланный мне дисплейчик все таки битым оказался.. никаких признаков жизни :-(
0
12.06.2014, 22:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2014, 22:11

[Решено] STM32F105, SPI1, VS1053
Привет всем. Пытаюсь соорудить плеер на STM32F105 и VS1053. С частотами...

STM32F3 и TFT дисплей (ILI9341) ЧЯДНТ ?
Хочу подключить mykroTFT дисплей к плате STM32F3 Dyscovery через 16 битовый RGB...

[Решено]Непонятная работа USART в STM32F105
Привет всем. Столкнулся со странной проблемой с UART на STM32F105RCT6....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru