Перейти к содержанию

    

SSD1963 + FSMC

Здравствуйте!

 

Завожу дисплей по 16-бит шине FSMC. инициализация проходит нормально, дисплей запускается, но отображение цветов странно работает. Происходит следующая ситуация:

в режиме 565

1) отправляю команду записи в буфер

2) заливаю экран цветом 0b11111100000, экран должен стать зеленым(с красным такая же проблема)

3) все пиксели на экране черные

 

Когда заливаю экран цветом 0b11111 - все ок, заливается синим.

 

в режиме 16 бит цвет

1) отправляю команду записи в буфер

2) заливаю экран зеленым цветом

    WriteData(0x00FF);      
    WriteCommand(0x3c);
  
    WriteData(0x0000); 
    WriteCommand(0x3c);

    WriteData(0xFF00);  
    WriteCommand(0x3c);

3) пиксели заполняются зеленым через один. один зеленый, один черный. получается такая последовательность ...ЧЗЧЗЧЗЧЗ...

 

Если поменять в инициализации на 8 битный режим работы дисплея и переделать отправку цвета пакетами по 8 байт - все корректно работает.

 

Почему не заводится 16 битный режим? Есть какая-то тонкость? Я неверно настроил FSMC?

 

Код инициализации FSMC на всякий случай привожу:

  
NorSramBankInit(FSMC_Bank1_NORSRAM1);

void NorSramBankInit(uint32_t FSMC_Bank1_SRAMx)
{
FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  p;
  /* Enable FSMC clock */
  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); 
/*-- FSMC Configuration ------------------------------------------------------*/
  p.FSMC_AddressSetupTime = 10;
  p.FSMC_AddressHoldTime = 1;
  p.FSMC_DataSetupTime = 15;//4;
  p.FSMC_BusTurnAroundDuration = 0;//1;
  p.FSMC_CLKDivision = 0;
  p.FSMC_DataLatency = 0;
  p.FSMC_AccessMode = FSMC_AccessMode_A;

  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_SRAMx;//FSMC_Bank1_NORSRAM2;
  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_AsynchronousWait = FSMC_AsynchronousWait_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_ExtendedMode = FSMC_ExtendedMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 
  /*!< Enable FSMC Bank1_SRAM2 Bank */
  FSMC_NORSRAMCmd(FSMC_Bank1_SRAMx, ENABLE); 
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите разобраться с проблемой. stm32f103zet+rfc571A+fsmc.долгими мучениями удалось настроить fsmc для работы с экраном:

  p.FSMC_AddressSetupTime = 10;
  p.FSMC_AddressHoldTime = 20;
  p.FSMC_DataSetupTime = 60;
  p.FSMC_BusTurnAroundDuration =0;
  p.FSMC_CLKDivision = 0;
  p.FSMC_DataLatency = 0;
  p.FSMC_AccessMode = FSMC_AccessMode_A;

именно с такими настройками fsmc удается читать записанные при инициализации дисплея регистры и данные.

Но изображение на экран не выводится, вместо заливки экрана заданным цветом на экране отображаются разноцветные полосы. не могу понять, что не так.

Если регистры тфт и данные, записанные в него считываются верно, значит fsmc настроен правильно?Следовательно скорее всего ошибка в инициализации тфт?

Код инициализации взят из апноута для экранов winstar(5.7") с контроллером ssd1963, но у меня экран raystar rfc571A.

Подскажите, где искать ошибку.

И еще, у моего экрана есть линии scan direction UP и LR, не пойму как ими управлять, в даташите на экран о них ни слова.

Код инициализации тфт:

RESETCLR;//RS=0
DelayUS(1);
RESETSET;//RS=1
DelayUS(1);
    
    
LCD_WriteCommand(CMD_SOFT_RESET);
LCD_WriteCommand(CMD_SOFT_RESET);
LCD_WriteCommand(CMD_SOFT_RESET);
        
    
LCD_WriteCmd(CMD_PLL_START,0x01);//START PLL
LCD_WriteCmd(CMD_PLL_START,0x03);//LOCK PLL

    
LCD_WriteCommand(CMD_SET_PANEL_MODE);//SET LCD MODE SET TFT 18Bits MODE
    
    
LCD_WriteData(0x0c);//c     //SET TFT MODE & hsync+Vsync+DEN MODE
LCD_WriteData(0x00);     //SET TFT MODE & hsync+Vsync+DEN MODE
LCD_WriteData(0x01);     //SET horizontal size=320-1 HightByte
LCD_WriteData(0x3f);     //SET horizontal size=320-1 LowByte
LCD_WriteData(0x00);     //SET vertical size=240-1 HightByte
LCD_WriteData(0xef); //SET vertical size=240-1 LowByte
LCD_WriteData(0x00); //SET even/odd line RGB seq.=RGB
    
    
LCD_WriteCmd(CMD_SET_DATA_INTERFACE,0x00); //SET pixel data I/F format=8bit
LCD_WriteCmd(CMD_SET_PIXEL_FORMAT,0x60); // SET R G B format = 6 6 6
    
LCD_WriteCommand(CMD_SET_PLL_MN); //SET PLL freq=113.33MHz;
LCD_WriteData(0x22);
LCD_WriteData(0x03);
LCD_WriteData(0x04);

        
LCD_WriteCommand(CMD_SET_PCLK); //SET PCLK freq=9MHz; pixel clock frequency
LCD_WriteData(0x00);
LCD_WriteData(0xE7);
LCD_WriteData(0x4f);
  
    
    
LCD_WriteCommand(CMD_SET_HOR_PERIOD); //SET HBP
LCD_WriteData(0x01); //0x01  //SET HSYNC Total = 440
LCD_WriteData(0xb8);
LCD_WriteData(0x00); //SET HBP = 68
LCD_WriteData(0x44);
LCD_WriteData(0x0f); //0x0f//SET VBP 16 = 15 + 1
LCD_WriteData(0x00); //SET Hsync pulse start position
LCD_WriteData(0x00);
LCD_WriteData(0x00); //SET Hsync pulse subpixel start position
    
LCD_WriteCommand(CMD_SET_VER_PERIOD); //SET VBP
LCD_WriteData(0x01); //SET Vsync total 265 = 264 + 1
LCD_WriteData(0x08);
LCD_WriteData(0x00); //SET VBP = 19
LCD_WriteData(0x12);//
LCD_WriteData(0x07); //SET Vsync pulse 8 = 7 + 1
LCD_WriteData(0x00); //SET Vsync pulse start position
LCD_WriteData(0x00);


LCD_WriteCommand(CMD_SET_COLUMN);//SET column address
LCD_WriteData(0x00); //SET start column address=0
LCD_WriteData(0x00);
LCD_WriteData(0x01); //SET end column address=320
LCD_WriteData(0x3f);
    
LCD_WriteCommand(CMD_SET_PAGE);//SET page address
LCD_WriteData(0x00); //SET start page address=0
LCD_WriteData(0x00);
LCD_WriteData(0x00); //SET end page address=240
LCD_WriteData(0xef);
    

LCD_WriteCommand(CMD_ENT_NORMAL_MODE);
LCD_WriteCommand(CMD_ON_DISPLAY); //SET display on

Изменено пользователем batisto4ka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Линии UP и LR управляют направлением вывода изображения: верх-низ меняются местами, лево-право. В документах должно быть. Если нет, найдите любой другой, например, Sharp, Tianma, там точно есть.

Вертикальные полосы толщиной в пискель у меня были, когда плохо вставлен был ленточный кабель в разъем. С ними вообще проблема, особенно, у меня - не нашли на 33 контакта, надрезали 40-контактный. И потом тыкаешься с ними...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да вроде нормально вставлен. и еще замечаю особенность. сразу после включения жки на экране появляются вертиальные яркие разноцветные линии толщиной в пиксель. а через несколько секунд они плавно теряют яркость и становятся менее яркими, и что бы не выводилось на экран картинка не меняется

Изменено пользователем batisto4ka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
да вроде нормально вставлен. и еще замечаю особенность. сразу после включения жки на экране появляются вертиальные яркие разноцветные линии толщиной в пиксель. а через несколько секунд они плавно теряют яркость и становятся менее яркими, и что бы не выводилось на экран картинка не меняется

Вот-вот, именно так и у меня было. Попробуйте раз 8 вставить, с обоих концов. :rolleyes: Посмотрите, к какому краю разъема прижать кабель. И еще на нем следы от контактов остаются, можно посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но вот еще необьяснимая странность: одинаковая ситуация и при включении подсветки до вывода цвета на экран и то же, если подсветка включается вначале, а потом включается жки и выводится цвет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел по своим заметкам, в дополнение к кабелю:

Контроллер ЖКИ не работал, оттого, что не в том регистре была задана стартовая позиция синхронизации.

Для работы с ЖКИ Tianma сигнал DRDY оторвал от контроллера ЖКИ, и повесил на +3.3VD. Так нужно согласно datasheet (SYNC mode)

 

одинаковая ситуация и при включении подсветки до вывода цвета на экран и то же, если подсветка включается вначале, а потом включается жки и выводится цвет

"Действия и поступки - это одно и то же!"

 

Подсветке все равно, когда включаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подсветке то может все равно, но если отладчиком пройти инициализацию и залить экран цветом а потом включить подсветку результат тот же. значит наверное подсветка как то влияет а изображение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Расскажите подробнее, ничего не понятно.

Без подсветки вообще ничего не будет видно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

такс, таки вроде проблема была в шлейфе, пару раз подергав получилось добиться вывода на экран заливки. но теперь мучаюсь с настройкой для корректного отображения изоображения. во-первых у меня быстро мерцает изображение, а во-вторых получается, что у меня ширина пикселя как бы в 2 раза уже. вот если вывести полоску шириной в 5 пикселей зеленого цвета, то невооруженным глазом видно, что идет следующая последовательность зеленый-черный, зеленый-черный, зеленый-черный,зеленый-черный, зеленый-черный.то есть выведенно 5 пикселей с промежутками. как бы так настроить, чтобы была корректная картинка и не мерцала? дисплей rfc57a1

Изменено пользователем batisto4ka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите, какого типа данные посылаете. uint16_t? Я именно так и делаю. Даже не так. Готовлю картинку в буфере, в ОЗУ. А потом оттуда перебрасываю в виде uint32_t, по 4 пиксела за команду. Можно и ПДП (DMA) использовать.

Еще я проверял, что записываю в контроллер ЖКИ. Читал обратно, сравнивал.

Зеленый-черный, зеленый-черный... и все квадратные? :) Или просто из rgbrgb горят только G, как и положено: rGbrGb.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Эти полосы видно и при выключеном экране. пришли к выводу, что это таое расстояние между пикселями и сами пиксели прямоугольные этом индикаторе

Но кто знает, подскажите, как настроить частоты и горизонтальный и вертикальный период? откуда берутся эти значения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
сами пиксели прямоугольные этом индикаторе

Но кто знает, подскажите, как настроить частоты и горизонтальный и вертикальный период? откуда берутся эти значения?

Три субпиксела, R G B, каждый прямоугольный, образуют один квадратный пиксел. :) И таких квадратных 320 x 240. При желании можно использовать и субпиксельное сглаживание, шрифта, например.

У контроллера S1D13706 есть утилита для настройки регистров. Попробуйте. Все эти контроллеры - близнецы-братья.

13706cfg.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация