Part Number:AM4379
- 我目前的配置:QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV是0, CLKEN 是1
- 我的问题:
我从外部FLash的CLK引脚测试,测量只有12MHz。
我是否可以通过更改程序设置,连接外部FLash之后,从外部FLash的CLK引脚测试,让时钟达到48MHz?
- 问题由来:ROM代码的QSPI_CLK默认默认设置为12MHz
,
https://www.ti.com/cn/lit/ds/symlink/am4379.pdf?ts=1654738324063 数据手册P231页表明QSPI_CLK最大支持频率为48MHz
。
Nancy Wang:
请问是在启动期间测量的还是启动之后?
Tianyang 说:我目前的配置:QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV是0, CLKEN 是1
我理解应该是可以在应用程序中修改的,是否有测试过例程?
software-dl.ti.com/…/index_device_drv.html
,
Tianyang:
是在启动期间测试的,我们的测试程序是-取一段flash数据
,
Nancy Wang:
启动过程中,有可能是无法修改的,ROM code一般无法修改,我需要确认一下再给你回复。
,
jh chen:
启动过程不修改,ROMCODE中是设置了那些寄存器,从而配置为12M的?
目前能修改的寄存器也就是QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV。运行测试程序后,查看QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV为0.所以理解为前级输入就是12M?
另外QSPI的时钟信号有两个,一个是CORE_CLKOUTM 4/2.一个是PER_CLKOUTM2/4.这两个是在哪个寄存器里来选择的,并没有看到。
是否为PRCM_CM_PER_L3S_CLKSTCTRL Register的D8 位 为1时,L3S_CLK激活,就表示选择了CORE_CLKOUTM 4/2,此时输入为100M,需要使用QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV来分频?但这个L3S_CLK并不是只给QSPI使用。
另外,您提到的software-dl.ti.com/…/index_device_drv.html这个页面的测试程序,在哪个文件里面,下载了“ti-processor-sdk-rtos-am437x-evm-06.03.00.106-Windows-x86-Install”,没有发现。
谢谢
,
Nancy Wang:
jh chen 说:启动过程不修改,ROMCODE中是设置了那些寄存器,从而配置为12M的?
ROM code一般不公开的。
参考TRM 5.2.6.7 QSPI of AM437x 的说明 "The ROM Code initializes the QSPI controller, pin muxing, and clocks to communicate with the QSPI device. The controller is initialized in Mode 3 and the clock is set to operate at 12 MHz."
请等待英文论坛的回复确认:
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1108269/am4379-qspi_clk/4107370#4107370
,
Nancy Wang:
jh chen 说:另外,您提到的software-dl.ti.com/…/index_device_drv.html这个页面的测试程序,在哪个文件里面,下载了“ti-processor-sdk-rtos-am437x-evm-06.03.00.106-Windows-x86-Install”,没有发现。
需要自己编译生成:
software-dl.ti.com/…/index_overview.html
,
jh chen:
我看到英文论坛有人回复了。目前并不想在boot期间修改。而是想在应用程序中,看看是否可以修改。另外应用程序中,调整这个值QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV为3,CLKEN 是1。但是输出的时钟依然为12M。
The SPI clock generator uses the QSPI_FCLK clock as an input, and generates the qspi1_sclk, which is a divided version of the QSPI_FCLK clock. The divide ratio is a 16-bit value configured through the QSPI_CLOCK_CNTRL_REG[15:0] DCLK_DIV bit field and thus provides a division factor in a range from 1 to 65536. The QSPI_FCLK clock is divided by the DCLK_DIV value + 1 to provide the qspi1_sclk clock. When DCLK_DIV = 0x0 the QSPI_FCLK clock equals the DCLK clock. The value in the DCLK_DIV bit field applies only when the QSPI_CLOCK_CNTRL_REG[31] CLKEN bit is set to 0x1. Figure 27-3 shows the SPI_CLKGEN block.
根据这段话,QSPI_FCLK 是12M还是48M?如果是48M,那么QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV为0,CLKEN 是1,输出的qspi1_sclk应该是为48M。
想确认一下qspi1_sclk是否最大只有12M?
,
Nancy Wang:
我没有找到QSPI_FCLK 和 qspi1_sclk 的频率范围的相关信息。看到您也在英文论坛发布了,请等待回复。
按照datasheet Table 5-95 QSPI_CLK是可以达到48MHZ的。
,
jh chen:
您好,我看到英文论坛回复了,目前我们能确定ROM code 是12M。但没有回复如何能修改到48M,即当程序加载到DDR 之后,是否能通过修改配置将qspi1_sclk修改为48M,以便可以快速从QSPI读取其他数据?如何修改?谢谢
,
Nancy Wang:
英文论坛给了uboot下的一些配置。
Tianyang 说:QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV是0, CLKEN 是1
您是否是基于TI的示例代码进行修改配置的?配置后有查看过寄存器或者单步调试过吗?配置是否有生效?
同时我搜到了一个帖子跟您的问题类似,参考看一下。
e2e.ti.com/…/compiler-processor-sdk-am437x-qspi-clock-frequency
,
jh chen:
您好,我对比了一下\pdk_am437x_1_0_17和我们目前的版本,确实这里有问题。已按照\pdk_am437x_1_0_17修改。修改后是48M了。
之前主要是通过CCS查看寄存器的值时,QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV是0, CLKEN 是1。所以就感觉解释不了。看起来这个可能是CCS读取寄存器的值是错误的。实际QSPI_CLOCK_CNTRL_REG 的 DCLK_DIV可能在ROMcode中被设置为3了。但是用CCS读取时,总是0.
非常感谢
,
Nancy Wang:
好的,感谢分享!你是指之前你们使用的版本通过QSPISetPreScaler修改没有生效吗?
,
jh chen:
是的,原版本比较早了,QSPISetPreScaler传入参数0,设置后,不会成功。但是从CCS去读取寄存器的值, DCLK_DIV是0, CLKEN 是1(但是没有在watch窗口或者memory看)。DCLK_DIV是0时,按照手册,QSPI_FCLK等于qspi1_sclk ,但是测试依然为12M。即无法在应用中修改boot中的设置。使用了pdk_am437x_1_0_17版本中的QSPISetPreScaler后,修改成功。对比两个qspi.c文件,并没有看到pdk_am437x_1_0_17中的qspi.c里面有任何更新修改记录。这个pdk_am437x_1_0_17文件升级的记录或者说bug修复能在那里看到呢?
,
Nancy Wang:
一般可以看一下release note中的说明,针对某个函数没有看到有具体修复说明,通常我们都建议使用最新的SDK再次测试。
software-dl.ti.com/…/index_release_specific.html