我正在尝试使用 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 的寄存器。简而言之,这是算法:
- 我通过在地址 0x0D 发送 0x00 来禁用 PLL,然后等待 3ms;
- 我在地址 0x0A 发送字节 0x01(LVDS 像素时钟的时钟源来自 MIPI D-PHY 通道,LVDS 像素时钟在 [25 MHz ; 37.5 MHz] 范围内);
- 我在地址 0x0B 处发送字节 0x08(将 DSI 时钟除以 2);
- 我通过在地址 0x0D 发送 0x01 来启用 PLL;
- 我通过在地址 0x09 发送 0x01 来重置网桥,因为根据该寄存器的描述(第 23 页):
该位在设置为“1”时自动清零,读取时返回零。该位必须在 CSR 更新后设置...
- 我正在等待通过读取并等待将位 7 设置为 0x0A 地址来启用 PLL。但是这个位从未设置。
- 我应该等待 3ms
注意:在 PLL_EN_STAT = 1 后,等待至少 3ms 让 PLL 锁定。
但我从来没有达到这一点,因为我在前一点 6 的循环中。如果我不检查 0x0A 地址处的位 7 并绕过点 6,它似乎不起作用,因为我没有看到LVDS 时钟上的时钟通过 LVDS 连接器。
我检查了我的寄存器的值(通过读取它们)并且它们的值是正确的。
由于它似乎不起作用并且根据位于地址 0x0D (p. 24) 的 PLL_EN 寄存器的描述:
[...]。在使能 PLL 之前,输入时钟源必须有效且稳定
我认为问题可能来自 DSI 端(STM32F4 端),但这是我在上述步骤之前所做的。
- 我启用了 DSI 主机外设(通过 STM32CubeMx 进行配置);
- 我启用了 LTDC 外设(通过 STM32CubeMx 进行配置);
- 我启动 DSI 模块。
我检查了在这些初始化过程中没有发生错误,一切似乎都很好。我无法直观地检查 DSI 时钟,因为我无法实际访问 DSI 时钟 PIN si 我无法判断 DSI 时钟是否确实在工作。但是,如果我错了,请告诉我,为了确保它正常工作,我检查了 DSI 主机 PHY 控制寄存器(DSI->PCTLR)以确保 CKE 位已启用(STM32F469 参考手册的第 616 页) . 它是。
无论如何,我真的不知道我现在还能做什么。SN65DSI84 似乎没有启用(或锁定),我不知道为什么。对我来说,问题可能来自各个方面: - DSI 初始化错误(stm32 端);- 网桥配置错误(sn65dsi84 端);- 其他 ?
在此先感谢您的帮助 !
注意:我还没有提供程序代码,以免这篇文章太混乱,因为有很多东西要复制。无论如何,不要犹豫,问我一些你想看的部分,我会提供的。