⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
13个帖子/ 0新
最后发表
赫朗利
离线
最后看到:6个月2周前
加入:2019-12-15 12:42
SPI主时钟设置

亲爱的支持

我有一个da14695 USB eval板,我想集成一个设备板上的SPI。
该从设备需要最大1MHz SCLK频率能够进行通信。
我试图找到一些解决方案来设置较低的频率,但我还没有找到任何方式。

是否可以设置较低的SPI主SCLK频率?如果有可能请帮助我如何。

提前致谢

设备:
PM_Dialog
离线
最后看到:1天17小时前
工作人员
加入:2018-02-08 11:03
嗨Herangli,

嗨Herangli,

谢谢你的问题。请参见数据表第33节和表345:SPI_CTRL_REG。在主模式下,SPI_CTRL_REG[SPI_CLK]位域负责时钟输出频率。因此,在SPI配置结构(ad_spi_driver_conf_t)中,您应该选择适当的时钟。

我建议先检查一下DA1469x教程SPI适配器概念.在该教程中,选择了.xtal_freq = HW_SPI_FREQ_DIV_8,因此您可以根据您的需求更改它。

通常,我们强烈建议使用适配器来访问硬件外围设备,因为不仅提供对外设的访问,而且还确保当前正在访问的其他任务,暂停其操作,直到外围设备再次释放。因此,如果另一个任务在同一时间访问相同的外围设备,则不必担心。此外,在睡眠模式下,所有外围块都断电。

谢谢,PM_Dialog

赫朗利
离线
最后看到:6个月2周前
加入:2019-12-15 12:42
亲爱的支持

亲爱的支持

谢谢你迅速回应。
我在代码中检查并使用了SPI示例。我使用广告sw层所有其他部分的代码。
我试图以原始方式减少SPI时钟。如上所述,它意味着最大分配枚举中的更改.xtal_freq值(hw_spi_freq_div_14)。
当我测量SPI SCLK信号频率时,我看到大约2.5 MHz。(我的USB示波器精度不是很高,但我肯定它超过1MHz)

我有点困惑,因为我检查了时钟树(第168页),因为我看到这个分频器是减少SCLK频率的一种方法,因为分频器的输入可以来自SYSCLK或DIVN时钟源。DIVN是我知道的修复值,或者没有任何接口功能,我能够修改此值。
这意味着我对我来说,如果我想使用32MHz水晶或PLL,那就不可能使用SCLK。我相信我错过了我不知道什么。

提前致谢

PM_Dialog
离线
最后看到:1天17小时前
工作人员
加入:2018-02-08 11:03
嗨Herangli,

嗨Herangli,

请试着改变分割线:

cm_apb_set_clock_divider(apb_div1);

cm_ahb_set_clock_divider (ahb_div1);

然而,你将不能时钟时钟锁相环,所以系统将运行在32MHz。请检查hw_clk_set_sysclk()函数。

谢谢,PM_Dialog

赫朗利
离线
最后看到:6个月2周前
加入:2019-12-15 12:42
亲爱的支持

亲爱的支持

感谢您的回复。

我切换回XTAL 32 MHz时钟,以修改AHB和APB总线分频器,并测量SCLK频率,但我无法达到任何正面结果。我尝试了几个分频器参数,但它们对SPI时钟频率没有任何影响。

在时钟树和数据表中,我看到这些分隔器只对QSPI外围设备有影响,但它用于闪存或ram处理。

我在SPI CLK引脚中看到大约2.3-2.5MHz,以及如何通过SPI时钟分频器修改此频率的一种方式。

您还有其他想法如何达到比1MHz更小的频率,或者我们可能会声明这架构不可能?

提前致谢

PM_Dialog
离线
最后看到:1天17小时前
工作人员
加入:2018-02-08 11:03
嗨Herangli,

嗨Herangli,

请查看数据表中的图34:时钟树图。所有的外围块要么来自系统时钟div1(绿线),要么来自divN_clk(红线)。绿线是系统时钟除以。4或8。默认情况下,系统时钟除以1,频率为32MHz:

cm_sys_clk_init (sysclk_XTAL32M);

cm_apb_set_clock_divider(apb_div1);

cm_ahb_set_clock_divider (ahb_div1);

红色的线是DivN HW块的输出,无论上述的划分,频率总是在32Mhz。

CLK_COM_REG处理“绿线”和“红线”之间的选择。低电平驱动(LLD)是用32MHz时钟(红线)divN_clk实现的。时钟频率可以进一步划分到外围硬件块中(如果可能的话)。

专为SPI外围块,SPI控制器最多32 MHz的时钟速度,SPI源时钟可以除以2,4,8,14(根据数据表)。因此最小SPI时钟为32MHz / 14。

如果您想进一步降低SPI时钟,您应该为外围时钟选择div1,然后降低系统时钟以能够获得较低的外围频率。CPU整体性能较差,不建议使用。此外,在一个事件,将触发您的应用程序的变化,一个更高的频率的系统时钟,例如插入USB需要PLL96,这将导致无条件的变化,在您的外围设备的速度。在你的应用程序中,你必须格外小心,所以在使用divN的外设事务期间,绝对不会有系统时钟的改变。

如果您仍然需要使用1MHz SPI时钟,一个可能的解决方案可能是以下:

  1. 将系统时钟划分为4在main()函数中如下

cm_sys_clk_init (sysclk_XTAL32M);

cm_apb_set_clock_divider (apb_div4);

cm_ahb_set_clock_divider(ahb_div4);

新系统时钟将是32MHz / 4 = 8MHz

  1. 相应修改hw_spi_init_clk_reg(),并选择Div1时钟- CLK_COM_REG[SPI_CLK_SEL] = 0x01
  2. 将SPI时钟另外除以8 - SPI_CTRL_REG [SPI_CLK] = 0x00。结果将是8MHz / 8 = 1MHz

谢谢,PM_Dialog

赫朗利
离线
最后看到:6个月2周前
加入:2019-12-15 12:42
亲爱的支持

亲爱的支持
谢谢你的详细回答。我检查了这个变通方法。它的意思是
1.设置HCLK和PCLK分频器
cm_sys_clk_init (sysclk_XTAL32M);
cm_apb_set_clock_divider (apb_div4);
cm_ahb_set_clock_divider(ahb_div4);
cm_lp_clk_init();
2.修改hw_spi_init_clk_reg()函数(我使用SPI1)
void hw_spi_init_clk_reg(hw_spi_id ID)
{
断言reg_getf (crg_top, pmu_ctrl_reg, com_sleep) == 0);
if(id == hw_spi1){
crg_com-> reset_clk_com_reg = crg_com_reset_clk_com_reg_spi_clk_sel_msk;
CRG_COM->SET_CLK_COM_REG = (CRG_COM_SET_CLK_COM_REG_SPI_ENABLE_Msk |CRG_COM_SET_CLK_COM_REG_SPI_CLK_SEL_Msk);
其他}{
CRG_COM - > RESET_CLK_COM_REG = CRG_COM_RESET_CLK_COM_REG_SPI2_CLK_SEL_Msk;
CRG_COM-> SET_CLK_COM_REG = CRG_COM_SET_CLK_COM_REG_SPI2_ENABLE_MSK;
}
}
3.SPI时钟(带14 -> 500k SCLK)
/*外部传感器/模块SPI驱动*/
const ad_spi_driver_conf_t drv_spi1_adis = {
.spi = {
.cs_pad = {DEVICE_CS_GPIO_PORT, DEVICE_CS_GPIO_PIN},
.word_mode = hw_spi_word_8bit,//在这里您可以定义所需的
.smn_role = HW_SPI_MODE_MASTER,
.polarity_mode = hw_spi_pol_low,//在这里您可以定义所需的SPI极性
.phase_mode = hw_spi_pha_mode_0,//在这里您可以在此处定义所需的SPI阶段
.mint_mode = hw_spi_mint_disable,
.xtal_freq = hw_spi_freq_div_14,
.fifo_mode = hw_spi_fifo_rx_tx,
.disabled = 0,/ *应在初始化阶段期间禁用* /
.ignore_cs = false,
.use_dma = true,
.rx_dma_channel = hw_dma_channel_2,
.tx_dma_channel = hw_dma_channel_4.
}
};

不幸的是,结果是一样的。

我再次检查了数据表,但对我来说不清楚你为什么写了,绿线是系统时钟除以1,2或8“。绿线是系统时钟。AHB和APB总线时钟是系统时钟除以1,2,4,8.绿线来自Sys_Clk选择器,直接来自XTAL32,RC32,PLL,LP时钟。我可以修改AHB和APB总线时钟,但随着我看到SPI外围时钟独立于AHB或APB总线时钟。(图84:SPI块图)。这些总线仅参加数据移动。

提前致谢

PM_Dialog
离线
最后看到:1天17小时前
工作人员
加入:2018-02-08 11:03
嗨Herangli,

嗨Herangli,

我的意思是,如果ahb和apb总线时钟被除,那么系统时钟也被1、2、4、8除。请让我在我身边检查一下,我会告诉你的。

我可以问你使用的SPI接口是什么,需要的SPI疏通速度小于1MHz吗?

谢谢pm_dialog.

赫朗利
离线
最后看到:6个月2周前
加入:2019-12-15 12:42
亲爱的支持

亲爱的支持

感谢您在您身边查看此问题。

当然,我想用ADIS16460进行高精度的IMU测量,并通过蓝牙发送测量。
这是ADIS传感器的数据表https://www.analog.com/en/雷电竞官网登录products/adis16460.html
在数据表中,您可以在第5页顶部看到最大SPI时钟频率。

(我想在这篇文章之后我们可能会从模拟设备上询问一些钱,如广告成本:))

提前致谢

赫朗利
离线
最后看到:6个月2周前
加入:2019-12-15 12:42
亲爱的支持

亲爱的支持

你在评估板上查过这个问题吗?

先感谢您

赫朗利
离线
最后看到:6个月2周前
加入:2019-12-15 12:42
亲爱的支持

亲爱的支持

你在评估板上查过这个问题吗?

先感谢您

PM_Dialog
离线
最后看到:1天17小时前
工作人员
加入:2018-02-08 11:03
嗨Herangli,

嗨Herangli,

谢谢你的提醒,很抱歉回复晚了。我再试一次。

谢谢,PM_Dialog

PM_Dialog
离线
最后看到:1天17小时前
工作人员
加入:2018-02-08 11:03
嗨Herangli,

嗨Herangli,

可不可以把你的项目附在这里看一下?

谢谢,PM_Dialog