Skip to main content
PZamb.2
Associate III
May 16, 2023
Question

DSI display interface doesn't work

  • May 16, 2023
  • 13 replies
  • 6095 views

Hi

I'm development a board with STM32F779a cpu connect with dsi display.

I create the graphic wit TouchFX tools and included in the STM32cube ide design software.

How example I see STM32f769i-disco demo, and received the init code of display by producer.

My problem is that the DSI Host not run, no signal appare , I'm monitoring with oscilloscopie.

What may be the problem ?

int main(void)

{

 /* USER CODE BEGIN 1 */

 /* USER CODE END 1 */

 /* MCU Configuration--------------------------------------------------------*/

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

 HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */

 SystemClock_Config();

 /* USER CODE BEGIN SysInit */

 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */

 MX_GPIO_Init();

 MX_LTDC_Init();

 MX_CRC_Init();

 MX_DSIHOST_DSI_Init();

 MX_FMC_Init();

 MX_QUADSPI_Init();

 MX_DMA2D_Init();

 MX_TouchGFX_Init();

 /* Call PreOsInit function */

 MX_TouchGFX_PreOSInit();

 /* USER CODE BEGIN 2 */

 /* USER CODE END 2 */

 /* Init scheduler */

 osKernelInitialize();

 /* USER CODE BEGIN RTOS_MUTEX */

 /* add mutexes, ... */

 /* USER CODE END RTOS_MUTEX */

 /* USER CODE BEGIN RTOS_SEMAPHORES */

 /* add semaphores, ... */

 /* USER CODE END RTOS_SEMAPHORES */

 /* USER CODE BEGIN RTOS_TIMERS */

 /* start timers, add new ones, ... */

 /* USER CODE END RTOS_TIMERS */

 /* USER CODE BEGIN RTOS_QUEUES */

 /* add queues, ... */

 /* USER CODE END RTOS_QUEUES */

 /* Create the thread(s) */

 /* creation of defaultTask */

 defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

 /* USER CODE BEGIN RTOS_THREADS */

 /* add threads, ... */

 /* USER CODE END RTOS_THREADS */

 /* USER CODE BEGIN RTOS_EVENTS */

 /* add events, ... */

 /* USER CODE END RTOS_EVENTS */

 /* Start scheduler */

 osKernelStart();

 /* We should never get here as control is now taken by the scheduler */

 /* Infinite loop */

 /* USER CODE BEGIN WHILE */

 while (1)

 {

   /* USER CODE END WHILE */

   /* USER CODE BEGIN 3 */

 }

This topic has been closed for replies.

13 replies

PZamb.2
PZamb.2Author
Associate III
May 16, 2023

static void MX_DSIHOST_DSI_Init(void)

{

 /* USER CODE BEGIN DSIHOST_Init 0 */

   // Reset DSI Display

   HAL_GPIO_WritePin(DSI_reset_GPIO_Port, DSI_reset_Pin, GPIO_PIN_RESET);

   HAL_Delay(20);

   HAL_GPIO_WritePin(DSI_reset_GPIO_Port, DSI_reset_Pin, GPIO_PIN_SET);

   HAL_Delay(20);

 /* USER CODE END DSIHOST_Init 0 */

 DSI_PLLInitTypeDef PLLInit = {0};

 DSI_HOST_TimeoutTypeDef HostTimeouts = {0};

 DSI_PHY_TimerTypeDef PhyTimings = {0};

 DSI_LPCmdTypeDef LPCmd = {0};

 DSI_CmdCfgTypeDef CmdCfg = {0};

 /* USER CODE BEGIN DSIHOST_Init 1 */

 /* USER CODE END DSIHOST_Init 1 */

 hdsi.Instance = DSI;

 hdsi.Init.AutomaticClockLaneControl = DSI_AUTO_CLK_LANE_CTRL_DISABLE;

 hdsi.Init.TXEscapeCkdiv = 3;

 hdsi.Init.NumberOfLanes = DSI_TWO_DATA_LANES;

 PLLInit.PLLNDIV = 103;

 PLLInit.PLLIDF = DSI_PLL_IN_DIV7;

 PLLInit.PLLODF = DSI_PLL_OUT_DIV1;

 if (HAL_DSI_Init(&hdsi, &PLLInit) != HAL_OK)

 {

   Error_Handler();

 }

 HostTimeouts.TimeoutCkdiv = 1;

 HostTimeouts.HighSpeedTransmissionTimeout = 0;

 HostTimeouts.LowPowerReceptionTimeout = 0;

 HostTimeouts.HighSpeedReadTimeout = 0;

 HostTimeouts.LowPowerReadTimeout = 0;

 HostTimeouts.HighSpeedWriteTimeout = 0;

 HostTimeouts.HighSpeedWritePrespMode = DSI_HS_PM_DISABLE;

 HostTimeouts.LowPowerWriteTimeout = 0;

 HostTimeouts.BTATimeout = 0;

 if (HAL_DSI_ConfigHostTimeouts(&hdsi, &HostTimeouts) != HAL_OK)

 {

   Error_Handler();

 }

 PhyTimings.ClockLaneHS2LPTime = 24;

 PhyTimings.ClockLaneLP2HSTime = 25;

 PhyTimings.DataLaneHS2LPTime = 13;

 PhyTimings.DataLaneLP2HSTime = 18;

 PhyTimings.DataLaneMaxReadTime = 0;

 PhyTimings.StopWaitTime = 0;

 if (HAL_DSI_ConfigPhyTimer(&hdsi, &PhyTimings) != HAL_OK)

 {

   Error_Handler();

 }

 if (HAL_DSI_ConfigFlowControl(&hdsi, DSI_FLOW_CONTROL_BTA) != HAL_OK)

 {

   Error_Handler();

 }

 if (HAL_DSI_SetLowPowerRXFilter(&hdsi, 10000) != HAL_OK)

 {

   Error_Handler();

 }

 if (HAL_DSI_ConfigErrorMonitor(&hdsi, HAL_DSI_ERROR_NONE) != HAL_OK)

 {

   Error_Handler();

 }

 LPCmd.LPGenShortWriteNoP = DSI_LP_GSW0P_ENABLE;

 LPCmd.LPGenShortWriteOneP = DSI_LP_GSW1P_ENABLE;

 LPCmd.LPGenShortWriteTwoP = DSI_LP_GSW2P_ENABLE;

 LPCmd.LPGenShortReadNoP = DSI_LP_GSR0P_ENABLE;

 LPCmd.LPGenShortReadOneP = DSI_LP_GSR1P_ENABLE;

 LPCmd.LPGenShortReadTwoP = DSI_LP_GSR2P_ENABLE;

 LPCmd.LPGenLongWrite = DSI_LP_GLW_ENABLE;

 LPCmd.LPDcsShortWriteNoP = DSI_LP_DSW0P_ENABLE;

 LPCmd.LPDcsShortWriteOneP = DSI_LP_DSW1P_ENABLE;

 LPCmd.LPDcsShortReadNoP = DSI_LP_DSR0P_ENABLE;

 LPCmd.LPDcsLongWrite = DSI_LP_DLW_ENABLE;

 LPCmd.LPMaxReadPacket = DSI_LP_MRDP_ENABLE;

 LPCmd.AcknowledgeRequest = DSI_ACKNOWLEDGE_ENABLE;

 if (HAL_DSI_ConfigCommand(&hdsi, &LPCmd) != HAL_OK)

 {

   Error_Handler();

 }

 CmdCfg.VirtualChannelID = 0;

 CmdCfg.ColorCoding = DSI_RGB565;

 CmdCfg.CommandSize = 200;

 CmdCfg.TearingEffectSource = DSI_TE_EXTERNAL;

 CmdCfg.TearingEffectPolarity = DSI_TE_RISING_EDGE;

 CmdCfg.HSPolarity = DSI_HSYNC_ACTIVE_LOW;

 CmdCfg.VSPolarity = DSI_VSYNC_ACTIVE_LOW;

 CmdCfg.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH;

 CmdCfg.VSyncPol = DSI_VSYNC_FALLING;

 CmdCfg.AutomaticRefresh = DSI_AR_DISABLE;

 CmdCfg.TEAcknowledgeRequest = DSI_TE_ACKNOWLEDGE_ENABLE;

 if (HAL_DSI_ConfigAdaptedCommandMode(&hdsi, &CmdCfg) != HAL_OK)

 {

   Error_Handler();

 }

 if (HAL_DSI_SetGenericVCID(&hdsi, 0) != HAL_OK)

 {

   Error_Handler();

 }

 /* USER CODE BEGIN DSIHOST_Init 2 */

 /* USER CODE END DSIHOST_Init 2 */

}

/**

 * @brief LTDC Initialization Function

 * @param None

 * @retval None

 */

static void MX_LTDC_Init(void)

{

 /* USER CODE BEGIN LTDC_Init 0 */

 /* USER CODE END LTDC_Init 0 */

 LTDC_LayerCfgTypeDef pLayerCfg = {0};

 /* USER CODE BEGIN LTDC_Init 1 */

 /* USER CODE END LTDC_Init 1 */

 hltdc.Instance = LTDC;

 hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;

 hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;

 hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;

 hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;

 hltdc.Init.HorizontalSync = 23;

 hltdc.Init.VerticalSync = 3;

 hltdc.Init.AccumulatedHBP = 73;

 hltdc.Init.AccumulatedVBP = 23;

 hltdc.Init.AccumulatedActiveW = 873;

 hltdc.Init.AccumulatedActiveH = 823;

 hltdc.Init.TotalWidth = 923;

 hltdc.Init.TotalHeigh = 831;

 hltdc.Init.Backcolor.Blue = 0;

 hltdc.Init.Backcolor.Green = 0;

 hltdc.Init.Backcolor.Red = 0;

 if (HAL_LTDC_Init(&hltdc) != HAL_OK)

 {

   Error_Handler();

 }

 pLayerCfg.WindowX0 = 0;

 pLayerCfg.WindowX1 = 800;

 pLayerCfg.WindowY0 = 0;

 pLayerCfg.WindowY1 = 800;

 pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;

 pLayerCfg.Alpha = 255;

 pLayerCfg.Alpha0 = 0;

 pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;

 pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;

 pLayerCfg.FBStartAdress = 0xC0000000;

 pLayerCfg.ImageWidth = 800;

 pLayerCfg.ImageHeight = 800;

 pLayerCfg.Backcolor.Blue = 0;

 pLayerCfg.Backcolor.Green = 0;

 pLayerCfg.Backcolor.Red = 0;

 if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)

 {

   Error_Handler();

 }

 /* USER CODE BEGIN LTDC_Init 2 */

 __HAL_LTDC_DISABLE(&hltdc);

   DSI_LPCmdTypeDef LPCmd;

   HAL_DSI_Start(&hdsi);

   MLT034S32_setup();

   //HAL_DSI_ShortWrite(&hdsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, OTM8009A_CMD_DISPOFF, 0x00);

   //DSI_IO_WriteCmd();

   LPCmd.LPGenShortWriteNoP = DSI_LP_GSW0P_DISABLE;

   LPCmd.LPGenShortWriteOneP = DSI_LP_GSW1P_DISABLE;

   LPCmd.LPGenShortWriteTwoP = DSI_LP_GSW2P_DISABLE;

   LPCmd.LPGenShortReadNoP = DSI_LP_GSR0P_DISABLE;

   LPCmd.LPGenShortReadOneP = DSI_LP_GSR1P_DISABLE;

   LPCmd.LPGenShortReadTwoP = DSI_LP_GSR2P_DISABLE;

   LPCmd.LPGenLongWrite = DSI_LP_GLW_DISABLE;

   LPCmd.LPDcsShortWriteNoP = DSI_LP_DSW0P_DISABLE;

   LPCmd.LPDcsShortWriteOneP = DSI_LP_DSW1P_DISABLE;

   LPCmd.LPDcsShortReadNoP = DSI_LP_DSR0P_DISABLE;

   LPCmd.LPDcsLongWrite = DSI_LP_DLW_DISABLE;

   HAL_DSI_ConfigCommand(&hdsi, &LPCmd);

   HAL_LTDC_SetPitch(&hltdc, 800, 0);

   __HAL_LTDC_ENABLE(&hltdc);

 /* USER CODE END LTDC_Init 2 */

}

MM..1
Super User
May 16, 2023

Primary all this lines is in bad order in LTDC you start unconfigured DSI

 MX_GPIO_Init();
 MX_LTDC_Init();
 MX_CRC_Init();
 MX_DSIHOST_DSI_Init();
 MX_FMC_Init();
 MX_QUADSPI_Init();
 MX_DMA2D_Init();

PZamb.2
PZamb.2Author
Associate III
May 17, 2023

Hi yes is true but is the automatic compiler, all run i must move DSIhost under LTDC

I modify the interface protocole to DSI 24Bit (Display datasheet is poor of information) and now the signal run.

PZamb.2
PZamb.2Author
Associate III
May 18, 2023

I don't understand because the TouchGFx application doesn't work.

I try with another application board based of same cpu but different display , i think of configured all device , memory Sdram work and external flash is loaded, configuration string from display productor.

The Touchgfx not start, i place the breakpoint to screenviewbase.cpp but the routines doesen't call.

PZamb.2
PZamb.2Author
Associate III
May 18, 2023

I chage the position but not work

May be some parameter is wrong

PZamb.2
PZamb.2Author
Associate III
May 18, 2023

..

PZamb.2
PZamb.2Author
Associate III
May 18, 2023

..

PZamb.2
PZamb.2Author
Associate III
May 18, 2023

..

PZamb.2
PZamb.2Author
Associate III
May 18, 2023

This is my .project file:

<?xml version="1.0" encoding="UTF-8"?>

<projectDescription>

   <name>Pomelli_test_funzioni</name>

   <comment></comment>

   <projects>

   </projects>

   <buildSpec>

      <buildCommand>

         <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>

         <triggers>clean,full,incremental,</triggers>

         <arguments>

         </arguments>

      </buildCommand>

      <buildCommand>

         <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>

         <triggers>full,incremental,</triggers>

         <arguments>

         </arguments>

      </buildCommand>

   </buildSpec>

   <natures>

      <nature>com.st.stm32cube.ide.mcu.MCUProjectNature</nature>

      <nature>com.st.stm32cube.ide.mcu.MCUCubeProjectNature</nature>

      <nature>org.eclipse.cdt.core.cnature</nature>

      <nature>com.st.stm32cube.ide.mcu.MCUCubeIdeServicesRevAev2ProjectNature</nature>

      <nature>com.st.stm32cube.ide.mcu.MCUAdvancedStructureProjectNature</nature>

      <nature>com.st.stm32cube.ide.mcu.MCUSingleCpuProjectNature</nature>

      <nature>com.st.stm32cube.ide.mcu.MCURootProjectNature</nature>

      <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>

      <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>

      <nature>org.eclipse.cdt.core.ccnature</nature>

   </natures>

</projectDescription>

LMI2
Senior III
May 18, 2023

DSI is a tricky bus. All clock and data pairs must have equal length. That is, on the PCB