Edit online

常见问题

如何正确计算和设置 SPI 的输出时钟频率?

SPI 频率计算方法如下所示:



以在 D12x 平台上得到 18 MHZ 的 SPI 输出频率为例:
注:
  • 修改 CLK_FRA0 会影响 XSPI/ QSPI/ SDMC 等外设。
  • 实际输出频率受硬件分频器精度限制。
  1. 在 meneconfig 的配置界面,配置 SPI 输入时钟源 CLK_FRA0:
    Board options --> 
        Clocks options --> 
            Clk fra0 pll frequence

    Board options --> 
        Clocks options --> 
            Clk fra0 pll frequence

    D12x SPI 时钟源为 CLK_FRA0(默认 384 MHz)。关于时钟源的说明,可查看产品文档 > 用户手册 > 时钟和电源 > Clock Manage Unit (CMU) 的详细说明。

  2. 在 meneconfig 的配置界面,配置 PLL分频与最大输入频率限制:
    Board options --> 
        SPI1 Parameter --> 
            Maxfrequency

    Maxfrequency, 默认是100 MHz。

    PLL_FRA0分频机制:1~16 级分频获取 SPI 输入时钟频率。例如,设置 CLK_FRA0 为 384 MHZ 且设置 Maxfrequency 为 100 MHZ,SPI 最终输入时钟频率为 384 ÷ 4 = 96 MHZ,接近 100 MHZ,不会得到 100 MHZ。

  3. 计算 SPI 输出时钟频率。
    • 输出频率组成:用户设置值 + 底层驱动自动分频
    • 关键寄存器:SPI_CCFG(用于最终分频控制),详情可查看产品文档 > 用户手册 > 接口 > Quad Serial Peripheral Interface (QSPI)中的寄存器说明。
    SPI 输出时钟频率计算步骤如下:
    1. 用户设置接口:
      qspi_cfg.parent.max_hz = 18000000; // 目标输出频率18MHz
    2. 驱动自动分频:
      • 基于输入频率选择最接近的目标频率
      • 公式:输出频率 = 输入频率 / (2^n) 或 输入频率 / (2*(n+1))

    示例结果:输入频率 96 MHz → 输出频率 16 MHz(非精确 18 MHz)

  4. 如果希望最终输出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(精确达成目标)