常见问题
如何正确计算和设置 SPI 的输出时钟频率?
SPI 频率计算方法如下所示:

以在 D12x 平台上得到 18 MHZ 的 SPI 输出频率为例:
注:
- 修改 CLK_FRA0 会影响 XSPI/ QSPI/ SDMC 等外设。
- 实际输出频率受硬件分频器精度限制。
- 在 meneconfig 的配置界面,配置 SPI 输入时钟源
CLK_FRA0:
Board options --> Clocks options --> Clk fra0 pll frequenceBoard options --> Clocks options --> Clk fra0 pll frequenceD12x SPI 时钟源为 CLK_FRA0(默认 384 MHz)。关于时钟源的说明,可查看 的详细说明。
- 在 meneconfig 的配置界面,配置
PLL分频与最大输入频率限制:
Board options --> SPI1 Parameter --> MaxfrequencyMaxfrequency, 默认是100 MHz。
PLL_FRA0分频机制:1~16 级分频获取 SPI 输入时钟频率。例如,设置 CLK_FRA0 为 384 MHZ 且设置 Maxfrequency 为 100 MHZ,SPI 最终输入时钟频率为 384 ÷ 4 = 96 MHZ,接近 100 MHZ,不会得到 100 MHZ。
- 计算 SPI 输出时钟频率。
- 输出频率组成:用户设置值 + 底层驱动自动分频
- 关键寄存器:SPI_CCFG(用于最终分频控制),详情可查看中的寄存器说明。
SPI 输出时钟频率计算步骤如下:- 用户设置接口:
qspi_cfg.parent.max_hz = 18000000; // 目标输出频率18MHz
- 驱动自动分频:
- 基于输入频率选择最接近的目标频率
- 公式:
输出频率 = 输入频率 / (2^n) 或 输入频率 / (2*(n+1))
示例结果:输入频率 96 MHz → 输出频率 16 MHz(非精确 18 MHz)
-
如果希望最终输出18MHz,可以做如下调整
按照步骤1中,将 CLK_FRA0 设置为 360 MHz
步骤2中,将输入时钟最大频率设置为72MHz
步骤3中,设置spi输出时钟qspi_cfg.parent.max_hz = 18000000
最终驱动层会自动计算并设置相关寄存器达到输出18Mhz的结果,计算如下:- 输入频率:360 MHz ÷ 5 = 72 MHz
- 输出频率:72 MHz ÷ 4 = 18 MHz(精确达成目标)
