Jump to content

    
ivainc1789

STemWin v5.44 и TFT3.97 с NT35510

Recommended Posts

Сначала у меня был дисплей на ILI9486 и мне удалось довольно быстро его настроить в STemWin, видимо потому, что он поддерживается библиотекой. Но при подключении было обнаружено, что кристаллы "потекли" (с момента покупки не проверялся и не подключался) и в конечном устройстве использовать его невозможно.

Вскоре получил дисплей на NT35510, который довольно быстро удалось инициализировать и проверить на тестовых программах до подключения STemWin. Все работает без замечаний. Однако после подключения STemWin дисплей не работает, при этом инициализация его проходит нормально.

Наверное, дело в том что команды NT35510 хотя в целом и похожи на ILI9486 имеют отличие - 16битный формат. Например, сброс дисплея для ILI9486: TFT_WriteCmd(01); а для NT35510: TFT_WriteCmd(0100); Возможно, дело именно в этом, но моих знаний STemWin пока не хватает, чтобы что-то поправить в библиотеке.

Скорее всего, ошибка в этой функции:

void LCD_X_Config(void) {
  GUI_DEVICE * pDevice;
  CONFIG_FLEXCOLOR Config = {0};
  GUI_PORT_API PortAPI = {0};

  // Set display driver and color conversion
  pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR,GUICC_565,0,0);
  // Orientation
  //Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;
  Config.Orientation = GUI_SWAP_XY;
  //Config.Orientation = GUI_ROTATION_CW;
  //Config.RegEntryMode = 0x6E30;
  LCD_SetSizeEx(0, YSIZE_PHYS, XSIZE_PHYS);
  GUIDRV_FlexColor_Config(pDevice,&Config);
  // Set controller and operation mode
  PortAPI.pfWrite16_A0  = LcdWriteReg;
  PortAPI.pfWrite16_A1  = LcdWriteData;
  PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
  PortAPI.pfReadM16_A1  = LcdReadDataMultiple;
  GUIDRV_FlexColor_SetFunc(pDevice,&PortAPI,GUIDRV_FLEXCOLOR_F66709,GUIDRV_FLEXCOLOR_M16C0B16);
}

Я ее не изменял с момента использования ILI9486. Подскажите, что не так...

Share this post


Link to post
Share on other sites

Отвечу сам себе (.

Судя по мануалу, NT35510 не поддерживается.
Тем не менее, я попробовал это оспорить. Система команд очень похожа, для ввода/вывода используются [в основном] команды ILI9486 0x36,2A,2B,2C,2E. NT35510 должен получить: 0x3600,0x2A00 и так далее. Причем параметры всегда однобайтовые и перед ними должна всегда выводится "инкрементированная" команда. Короче, вот функции LCDConf_FlexColor.c, которые я переписал:

/********************************************************************
*
*       LcdWriteReg
*
* Function description:
*   Sets display register
*/
uint16_t cmd; // текущая команда
uint8_t i;    // текущий параметр команды
static void LcdWriteReg(U16 Data) {
  // ... TBD by user
  Data <<= 8;cmd = Data;i=0;
  *(uint16_t *)ADR_CMD = Data;
}
	/********************************************************************
*
*       LcdWriteData
*
* Function description:
*   Writes a value to a display register
*/
static void LcdWriteData(U16 Data) {
  // ... TBD by user
  if (i == 0){// первый параметр команды
    *(uint16_t *)ADR_DAT = Data;
  }else{// команда и последующий параметр команды
    *(uint16_t *)ADR_CMD = cmd+i;*(uint16_t *)ADR_DAT = Data;
  }
  i++;
}
	/********************************************************************


И это работает!!!
Дисплей: http://www.lcdwiki.com/3.97inch_16BIT_Module_NT35510_SKU:MRB3973
Подключение: STM32F103VET6, FSMC.

Но счастье длилось недолго ибо обнаружил странный глюк при выводе текста. Взял кусок кода из UM01003 v6.18 стр 215:

  // пример вывода текста из UM03001_v6.18.pdf стр. 215
  // вывод должен соответствовать картинке в UM03001_v6.18.pdf
  GUI_SetFont(&GUI_Font8x16);
  GUI_SetBkColor(GUI_BLUE);
  GUI_Clear();
  GUI_SetPenSize(10);
  GUI_SetColor(GUI_RED);
  GUI_DrawLine(80, 10, 240, 90);
  GUI_DrawLine(80, 90, 240, 10);
  GUI_SetBkColor(GUI_BLACK);
  GUI_SetColor(GUI_WHITE);
  GUI_SetTextMode(GUI_TM_NORMAL);
  GUI_DispStringHCenterAt("GUI_TM_NORMAL", 160, 20);
  GUI_SetTextMode(GUI_TM_REV);
  GUI_DispStringHCenterAt("GUI_TM_REV", 160, 36);
  GUI_SetTextMode(GUI_TM_TRANS);
  GUI_DispStringHCenterAt("GUI_TM_TRANS", 160, 52);
  GUI_SetTextMode(GUI_TM_XOR);
  GUI_DispStringHCenterAt("GUI_TM_XOR", 160, 68);
  GUI_SetTextMode(GUI_TM_TRANS | GUI_TM_REV);
  GUI_DispStringHCenterAt("GUI_TM_TRANS | GUI_TM_REV", 160, 84);


К сожалению, через функции GUI_ текст выводится иногда с  ошибками и пока нельзя сказать, что это из-за криво поддержанного контроллера NT35510. Текст внутри виджетов всегда выводится корректно.
 

STemWin_TextNT35510.jpg

Share this post


Link to post
Share on other sites

Да, не работает вывод текста именно в режимах GUI_SetTextMode(GUI_TM_NORMAL) и GUI_SetTextMode(GUI_TM_REV). Скорее это не связано с "поддержкой" нового контроллера, я проверил какие команды посылает библиотека в контроллер при выводе текста в этих режимах. Оказалось, что ничего особенного - те же команды 2A,2B,2C. Пробовал увеличивать тайминги по FSMC - не помогло. Удивительно, что не работают только два режима вывода из пяти. Особенно жаль NORMAL, поле EDIT использует для своей инициализации именно этот режим...
Что же делать?... Попробую еще поиграться с инициализацией самого контроллера, если не поможет, значит все дело в библиотеке, будем как-то жить с урезанным текстовым выводом...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.