Страница 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 пришлось кучу всего в функциях вывода переписывать и весь шрифт для адекватной работы экрана... В итоге заработал вполне себе нормально:
ИзображениеИзображение

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