我希望有一个人可以帮助我。经过几天阅读文档、其他问题等等,我仍然对所有 LTDC 和 DSI 的工作原理感到困惑。
好的,所以我有一个
STM32F469 Disovery 板,上面已经有一个显示器。
我在 touchgfx 中创建了一个项目,其中只有一个蓝屏和四个角落的白框。
在IDE中打开我可以上传它并且它可以工作。难怪,都是原创。
现在我使用相同的 FPC 连接器更换了显示器。我正在使用一个小型
PCB 来更换电线以匹配新显示器的规格。
它也是 2 通道 DSI。
作为程序“模板”,我仍然使用 469-disco 之一
我删除了所有 otm8009a 的东西,并使用 HX8363 而不是 OTM8009a 的新显示器的开机顺序
- HAL_DSI_ShortWrite(&hdsi, 0x00, DSI_DCS_SHORT_PKT_WRITE_P1, 0x11, 0x00);
- HAL_Delay(201);
- uint8_t enExtCmd[5] = {0xFF, 0x83, 0x63};
- HAL_DSI_LongWrite(&hdsi, 0x00, DSI_DCS_LONG_PKT_WRITE, 4, 0xB9, enExtCmd);
- uint8_t setLaneNumer[15] ={0x80, 0x00, 0x10, 0x08, 0x08, 0x10, 0x7E, 0x6E, 0x6D, 0x0A, 0x01, 0x80, 0x43};
- HAL_DSI_LongWrite(&hdsi, 0x00, DSI_DCS_LONG_PKT_WRITE, 14, 0xBA, setLaneNumer);
- HAL_DSI_ShortWrite(&hdsi, 0x00, DSI_DCS_SHORT_PKT_WRITE_P1, 0x36, 0x00);
- HAL_Delay(7);
- HAL_DSI_ShortWrite(&hdsi, 0x00, DSI_DCS_SHORT_PKT_WRITE_P1, 0xCC, 0x0B);
- HAL_Delay(11);
- HAL_DSI_ShortWrite(&hdsi, 0x00, DSI_DCS_SHORT_PKT_WRITE_P1, 0x29, 0x00);
在不知道自己在做什么的情况下尝试了无数次尝试后,我的显示屏显示了一些东西。对我来说,这是一个巨大的成功。我打开 IOC 将 touchgfx 接口更改为 Parallel RGB (LTDC) 并将 Driver 更改为 LTDC。
DSI 主机到视频模式。
数据表:
- - 4.0 inch diagonal display, 480 x RGB [H] x 800 [V] dots.
- - 24bitRGB ( 8-8-8 Format ) / 16.7 Million colors.
- - MIPI DSI as high-speed interface. Video mode only.
到目前为止,一切都很好。我认为现在很容易获得时间和所有其他参数。只需使用数据表并使用 IOC 配置将值放入正确的参数中。
在这里,我开始阅读许多关于 LTDC、DSI 等的文档。但是还是不明白。
所以显示器是 4.0" WVGA 480 x RGB x 800 Portrait
在数据表的尺寸部分有“点数”1440[H] x 800[V]。那是需要调整的重要东西还是由 IC 驱动器 HX8363 控制?
时间安排呢?在其他人在他们的问题中发布的所有数据表中,对我没有帮助,“项目”和“符号”是不同的,所以似乎每个制造商都使用不同的功能命名。
就我而言:
和:
这是我的显示器实际显示的内容:
使用此设置:
- static void MX_DMA2D_Init(void)
- {
- hdma2d.Instance = DMA2D;
- hdma2d.Init.Mode = DMA2D_M2M;
- hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
- hdma2d.Init.OutputOffset = 0;
- hdma2d.LayerCfg[1].InputOffset = 0;
- hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_ARGB8888;
- hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
- hdma2d.LayerCfg[1].InputAlpha = 0;
- if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
- {
- Error_Handler();
- }
- }
- static void MX_DSIHOST_DSI_Init(void)
- {
- /* USER CODE BEGIN DSIHOST_Init 0 */
- /* Activate XRES active low */
- HAL_Delay(20); /* wait 20 ms */
- HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
- HAL_Delay(20); /* wait 20 ms */
- /* Desactivate XRES */
- HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_SET);
- /* Wait for 11ms after releasing XRES before sending commands */
- HAL_Delay(11);
- /* USER CODE END DSIHOST_Init 0 */
- DSI_PLLInitTypeDef PLLInit = {0};
- DSI_HOST_TimeoutTypeDef HostTimeouts = {0};
- DSI_PHY_TimerTypeDef PhyTimings = {0};
- DSI_VidCfgTypeDef VidCfg = {0};
- hdsi.Instance = DSI;
- hdsi.Init.AutomaticClockLaneControl = DSI_AUTO_CLK_LANE_CTRL_DISABLE;
- hdsi.Init.TXEscapeCkdiv = 4;
- hdsi.Init.NumberOfLanes = DSI_TWO_DATA_LANES;
- PLLInit.PLLNDIV = 125;
- PLLInit.PLLIDF = DSI_PLL_IN_DIV2;
- 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 = 28;
- PhyTimings.ClockLaneLP2HSTime = 33;
- PhyTimings.DataLaneHS2LPTime = 15;
- PhyTimings.DataLaneLP2HSTime = 25;
- 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();
- }
- VidCfg.VirtualChannelID = 0;
- VidCfg.ColorCoding = DSI_RGB888;
- VidCfg.LooselyPacked = DSI_LOOSELY_PACKED_DISABLE;
- VidCfg.Mode = DSI_VID_MODE_NB_PULSES;
- VidCfg.PacketSize = 1;
- VidCfg.NumberOfChunks = 200;
- VidCfg.NullPacketSize = 0;
- VidCfg.HSPolarity = DSI_HSYNC_ACTIVE_LOW;
- VidCfg.VSPolarity = DSI_VSYNC_ACTIVE_LOW;
- VidCfg.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH;
- VidCfg.HorizontalSyncActive = 4;
- VidCfg.HorizontalBackPorch = 2;
- VidCfg.HorizontalLine = 425;
- VidCfg.VerticalSyncActive = 2;
- VidCfg.VerticalBackPorch = 1;
- VidCfg.VerticalFrontPorch = 1;
- VidCfg.VerticalActive = 480;
- VidCfg.LPCommandEnable = DSI_LP_COMMAND_DISABLE;
- VidCfg.LPLargestPacketSize = 0;
- VidCfg.LPVACTLargestPacketSize = 0;
- VidCfg.LPHorizontalFrontPorchEnable = DSI_LP_HFP_DISABLE;
- VidCfg.LPHorizontalBackPorchEnable = DSI_LP_HBP_DISABLE;
- VidCfg.LPVerticalActiveEnable = DSI_LP_VACT_DISABLE;
- VidCfg.LPVerticalFrontPorchEnable = DSI_LP_VFP_DISABLE;
- VidCfg.LPVerticalBackPorchEnable = DSI_LP_VBP_DISABLE;
- VidCfg.LPVerticalSyncActiveEnable = DSI_LP_VSYNC_DISABLE;
- VidCfg.FrameBTAAcknowledgeEnable = DSI_FBTAA_DISABLE;
- if (HAL_DSI_ConfigVideoMode(&hdsi, &VidCfg) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_DSI_SetGenericVCID(&hdsi, 0) != HAL_OK)
- {
- Error_Handler();
- }
- }
我必须在这里拆分,因为我无法发送“文本太大”的问题。