1

我正在尝试使用 STM32F469 微控制器驱动SN65DSI84 桥 MIPI-to-LVDS。基本上,我的 STM32 提供 DSI 数据,SN65DSI84 将其转换为 LVDS 格式。

问题

今天,我设法通过 I2C 与我的 SN65DSI84 进行通信以配置其寄存器,但我未能成功使其 PLL 锁定。

只是为了让您理解,SN65DSI84 需要一个用于 LVDS 输出的时钟(LVDS 像素时钟)。您可以在数据表的第 14 页阅读该时钟,它可能来自外部源或直接来自 DSI 通道。我通过设置 CSR 0x0A 寄存器的位 0 来使用最后一个选项。问题是当我通过 0x0D 寄存器启用 PLL 时,0x0A 寄存器中应该告诉我 PLL 确实已启用的位没有设置。

到目前为止我做了什么

好的,首先我最关心的是要锁定 PLL。如果我对数据表的理解正确,那么实现这一点不需要配置桥的所有寄存器,而只需要配置位于地址 0x09、0x0A、0x0B 和 0x0D 的寄存器。

在我的程序中,我创建了一个函数,允许我配置位于地址 0x0A、0x0B 和 0x0D 的寄存器。简而言之,这是算法:

  1. 我通过在地址 0x0D 发送 0x00 来禁用 PLL,然后等待 3ms;
  2. 我在地址 0x0A 发送字节 0x01(LVDS 像素时钟的时钟源来自 MIPI D-PHY 通道,LVDS 像素时钟在 [25 MHz ; 37.5 MHz] 范围内);
  3. 我在地址 0x0B 处发送字节 0x08(将 DSI 时钟除以 2);
  4. 我通过在地址 0x0D 发送 0x01 来启用 PLL;
  5. 我通过在地址 0x09 发送 0x01 来重置网桥,因为根据该寄存器的描述(第 23 页):

该位在设置为“1”时自动清零,读取时返回零。该位必须在 CSR 更新后设置...

  1. 我正在等待通过读取并等待将位 7 设置为 0x0A 地址来启用 PLL。但是这个位从未设置。
  2. 我应该等待 3ms

注意:在 PLL_EN_STAT = 1 后,等待至少 3ms 让 PLL 锁定。

但我从来没有达到这一点,因为我在前一点 6 的循环中。如果我不检查 0x0A 地址处的位 7 并绕过点 6,它似乎不起作用,因为我没有看到LVDS 时钟上的时钟通过 LVDS 连接器。

我检查了我的寄存器的值(通过读取它们)并且它们的值是正确的。

由于它似乎不起作用并且根据位于地址 0x0D (p. 24) 的 PLL_EN 寄存器的描述:

[...]。在使能 PLL 之前,输入时钟源必须有效且稳定

我认为问题可能来自 DSI 端(STM32F4 端),但这是我上述步骤之前所做的。

  1. 我启用了 DSI 主机外设(通过 STM32CubeMx 进行配置);
  2. 我启用了 LTDC 外设(通过 STM32CubeMx 进行配置);
  3. 我启动 DSI 模块。

我检查了在这些初始化过程中没有发生错误,一切似乎都很好。我无法直观地检查 DSI 时钟,因为我无法实际访问 DSI 时钟 PIN si 我无法判断 DSI 时钟是否确实在工作。但是,如果我错了,请告诉我,为了确保它正常工作,我检查了 DSI 主机 PHY 控制寄存器(DSI->PCTLR)以确保 CKE 位已启用(STM32F469 参考手册的第 616 页) . 它是。

无论如何,我真的不知道我现在还能做什么。SN65DSI84 似乎没有启用(或锁定),我不知道为什么。对我来说,问题可能来自各个方面: - DSI 初始化错误(stm32 端);- 网桥配置错误(sn65dsi84 端);- 其他 ?

在此先感谢您的帮助 !

注意:我还没有提供程序代码,以免这篇文章太混乱,因为有很多东西要复制。无论如何,不​​要犹豫,问我一些你想看的部分,我会提供的。

4

1 回答 1

1

几次之后(以及德州仪器的一些帮助),我部分解决了我的问题。我错误地设置了CHA_DSI_CLK_RANGE寄存器(0x12地址)。我使用 DSI 主机的“ lane_byte_clock ”值而不是 DSI“ DDR 时钟”值,导致 PLL 永远不会锁定(DSI 时钟值、LVDS 像素时钟值和 DSI 时钟分频器之间的不匹配)。

对于对此感兴趣的人,请参阅 ST 应用说明 4860 第 75 页关于 DSI 主机,我建议那些试图驱动此组件的人使用德州仪器的DSI 调谐器工具。

现在我显示了图案图片,但我的屏幕不稳定(闪光,奇怪的伪影......当然是因为时序参数设置不正确,我猜)。

谢谢 !

于 2017-06-12T07:13:27.680 回答