Страница 1 из 2
Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вс июл 14, 2013 00:43:19
КАШАК
Доброго времени суток
Запустил TFT дисплей на SSD1289 с МК STM32F103VCT6. С использованием FSMC, как полагается. Дисплей завелся почти сразу, но нормально работает только заливка, при выводе какой-либо информации получается бред. Использовал найденную на просторах интернета
библиотеку. В результате, с кодом из примера:
Спойлер
Код: Выделить всё
LCD_Init();
LCD_Clear(LCD_COLOR_BLUE2);
LCD_SetTextColor(LCD_COLOR_GREEN);
LCD_SetBackColor(LCD_COLOR_BLUE2);
LCD_DisplayStringLine(50," Hello World!!! ");
LCD_SetFont(&Font8x8);
LCD_SetTextColor(LCD_COLOR_BLACK);
LCD_DisplayStringLine(135," Soft: v1.0.0 ");
LCD_SetFont(&Font8x12);
LCD_SetTextColor(LCD_COLOR_BLACK);
LCD_DisplayStringLine(110," Demo_Keil_LCD_SSD1289");
LCD_SetFont(&Font12x12);
LCD_SetTextColor(LCD_COLOR_GREY);
LCD_DisplayStringLine(90," Linx_83 ");
LCD_SetTextColor(LCD_COLOR_BLUE);
LCD_DrawLine(230,60,50,LCD_DIR_HORIZONTAL);
LCD_SetTextColor(LCD_COLOR_RED);
LCD_DrawCircle(200,280,20);
LCD_SetTextColor(LCD_COLOR_MAGENTA);
LCD_DrawRect(160,80,50,50);
LCD_SetTextColor(LCD_COLOR_BLUE);
LCD_DrawFullRect(150,210,120,40);
LCD_SetTextColor(LCD_COLOR_YELLOW);
LCD_DrawFullCircle(150,250,20);
LCD_DrawFullRect(190,210,120,40);
на экране должно быть вот это:

А у меня вот такой ужас:

Попробовал вывести текст:
Код: Выделить всё
LCD_DisplayStringLine(30,"Hello World!!!"); // 30-расстояние от верхнего края
LCD_DisplayStringLine(60,"Hello World!!!");
LCD_DisplayStringLine(90,"Hello World!!!");
LCD_DisplayStringLine(120,"Hello World!!!");
Получил нечто жуткое:
В чем может быть проблема?
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вс июл 14, 2013 11:37:31
dosikus
Переписывал пины FSMC ?
У меня одна версия - что то с пинами , или напутаны и инициализация.
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вс июл 14, 2013 11:46:11
КАШАК
Нет, пины FSMC не трогал, изменил только пин RESET. А если неправильно идет передача данных, заливка будет нормально работать? Специально гонял заливку разными цветами, все в норме. Инициализацию взял готовую. Пробовал менять настройки ориентации, никакого эффекта, все равно вывод идет в какую-то обрезанную область.
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вс июл 14, 2013 11:48:50
dosikus
Я всего то перепутал два рядом стоящих пина .
Это было нечто ...
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вс июл 14, 2013 12:14:03
КАШАК
Даже так?

Сегодня вечером проверю еще разок

Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вс июл 14, 2013 23:40:31
КАШАК
Перепроверил подключение, все правильно. С контактом тоже все нормально. Что еще может быть? Да, заметил, что после каждого сброса МК картинка на дисплее немного меняется, но правильно никогда не становится. А с настройкой FSMC и пинов у меня все правильно? Просто с FSMC работаю первый раз в жизни:
Спойлер
Код: Выделить всё
void Init_GPIO(){
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_IOPEEN;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | 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_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SysTick_Config(72000000/1000);//1ms
}
void Init_FSMC(){
RCC->AHBENR |= RCC_AHBENR_FSMCEN;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure;
FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = 0; //0
FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 0; //0
FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = 2; //3
FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 1;//1
FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Enable;//disable
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = 0; //0
FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 0; //0
FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = 4; //3
FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 1;//1
FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
Просто смущает, что в библиотеках есть вот такая функция для каждого вывода FSMC:
Код: Выделить всё
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
А у меня компилятор ее не знает, в стандартной библиотеке
stm32f10x_gpio.h ее нет.
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Пн июл 15, 2013 07:52:59
srg320
Могу ошибаться, но по-моему, если берётся вывод FSMC A16, то адрес LCD_RAM должен быть 0x60010000 даже для 16битной шины.
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Пн июл 15, 2013 08:14:47
dosikus
КАШАК писал(а):
Просто смущает, что в библиотеках есть вот такая функция для каждого вывода FSMC:
Код: Выделить всё
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
А у меня компилятор ее не знает, в стандартной библиотеке
stm32f10x_gpio.h ее нет.
С портянкой вашей разбираться лениво .
Смущаться не надо , либа под STM32F2xx.
Плата самодельная ? На длинных проводах ?
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Пн июл 15, 2013 10:34:32
КАШАК
Плата самодельная


Провода 40см., китайский, разноцветный шлейф, с коннекторами на концах. С платой STM32 VL Discovery дисплей работал нормально, правда там нет FSMC и скорость обмена в разы ниже.
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Пн июл 15, 2013 10:35:22
КАШАК
srg320 писал(а):Могу ошибаться, но по-моему, если берётся вывод FSMC A16, то адрес LCD_RAM должен быть 0x60010000 даже для 16битной шины.
Хм. Попробую.
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Пн июл 15, 2013 12:12:50
srg320
КАШАК писал(а):Провода 40см
40 - это много, у меня было 10-15 та были проблемы
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Пн июл 15, 2013 16:01:51
КАШАК
Я так и думал, что провода слишком длинные, просто паять пока не хотелось

ну ладно, вечером запаяю короткие провода. напишу о результатах...
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Пн июл 15, 2013 23:39:30
КАШАК
Значит укоротил я провода до 10 см. (были 20 см., обманул немного) теперь на экране вижу такое (цвета поменял):
В общем мало что изменилось. На помехи реагирует очень сильно, даже если руку к проводам поднести, начинает полную чушь выводить. Укорочу провода до минимума, все равно плата и дисплей рядом стоять будут, и проверю еще раз. Хотя вот тут вообще кошмар с проводами, а работает:
P.S.
С адресом LCD_RAM 0x60010000 вообще не работает, только с 0x60020000
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вт июл 16, 2013 08:20:36
srg320
Вставьте задержки в местах, где происходит запись данных в дисплей, если на малой скорости рисует всё правильно, то 100% причина - провода
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вт июл 16, 2013 11:26:28
Satyr
КАШАК писал(а):Значит укоротил я провода до 10 см. (были 20 см., обманул немного) теперь на экране вижу такое (цвета поменял):
Раз такая картинка, то с проводами и FMSC все ОК.
Инитишь не в той ориентации, что рисуешь, скорее всего.
И выводишь неправильно. С окном вывода промахиваешься.
Под кучу дисплеев библиотеки есть в самой библиотеке под STM32.
Туча драйверов легко портируемых есть в микрочиповской графической библиотеке.
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вт июл 16, 2013 12:24:38
КАШАК
Добавил задержки, но это вообще ничего не дало. Все разбросано по дисплею, как будто неправильно определяются то ли границы, то ли области памяти. Единственное, что работает правильно - это заливка. Что еще можно сделать?
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вт июл 16, 2013 12:46:39
srg320
Satyr прав, скорее всего дело в ориентации. Нужно поиграться с регистром R11 (биты ID1, ID0, AM)
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вт июл 16, 2013 12:48:18
Satyr
тут еще надо понимать, что ориентацию меняешь, а регистры окна и курсора как были так и остаются. они не крутятся.
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вт июл 16, 2013 13:03:54
Satyr
ориентация она вобщем то только на инкриментатор адреса при выводе битмапа по 22 регистру влияет.
Re: Дисплей на SSD1289 + FSMC+STM32F103
Добавлено: Вт июл 16, 2013 19:59:38
КАШАК
Да, точно, при работе без FSMC пришлось кучу всего в функциях вывода переписывать и весь шрифт для адекватной работы экрана... В итоге заработал вполне себе нормально:

Видимо и здесь так придется
