SPI主时钟设置

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
13个员额/ 0个新员额
最后一篇
herangli
离线
最后一次露面:1个月3周前
加入:2019-12-15 42
SPI主时钟设置

亲爱的支持

我有一个DA14695 USB eval板,我想将设备集成到SPI上。
这个从设备需要最大1MHz SCLK频率才能通信。
我试图找到一些方法来降低频率,但我没有找到任何方法。

是否有可能设置一个较低的SPI主SCLK频率?如果可能的话,请帮我怎么做。

谢谢提前

设备:
PM_DIALOG.
离线
最后一次露面:17小时59分钟前
职员
加入: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.

herangli
离线
最后一次露面:1个月3周前
加入:2019-12-15 42
亲爱的支持

亲爱的支持

谢谢你的快速回答。
我在我的代码中检查并使用SPI示例。我使用AD SW层代码的所有其他部分。
我试图以一种原始的方式减少SPI时钟。这意味着改变最大分隔符枚举(HW_SPI_FREQ_DIV_14)中的.xtal_freq值。
当我测量SPI SCLK信号频率时,我看到大约2.5 MHz。(我的USB示波器精度不那么高,但我相信它超过1MHz)

我有点困惑,因为我检查了时钟树(第168页),我看到这个分频器是降低SCLK频率的一种方法,因为分频器的输入可以来自sysck或divN时钟源。divN是一个固定值,因为我知道或者没有任何接口函数,我可以修改这个值。
这意味着对我来说,它是不可能去低于1MHz与SCLK,如果我想使用32MHz晶体或锁相环。我肯定我错过了什么,只是我不知道是什么。

谢谢提前

PM_DIALOG.
离线
最后一次露面:17小时59分钟前
职员
加入:2018-02-08 11:03
嗨herangli,

嗨herangli,

请尝试更改分隔符:

cm_apb_set_clock_divider (apb_div1);

cm_ahb_set_clock_divider(ahb_div1);

但是,您无法将时钟装入PLL,因此系统将使用32MHz运行。请检查hw_clk_set_sysclk()函数。

谢谢,PM_DIALOG.

herangli
离线
最后一次露面:1个月3周前
加入:2019-12-15 42
亲爱的支持

亲爱的支持

谢谢你的回复。

我切换回xtal 32 MHz时钟,以修改ahb和apb总线时钟分压器,我测量了SCLK频率,但我不能实现任何积极的结果。我尝试了几个分频器参数,但它们对SPI时钟频率没有任何影响。

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

我看到大约2.3-2.5MHz的SPI CLK引脚和一种方式,我可以通过SPI时钟分频器修改这个频率,正如你在过去也提到过。

你有任何其他的想法,我如何实现一个小于1MHz的频率,或者我们可能会宣布这是不可能的架构?

谢谢提前

PM_DIALOG.
离线
最后一次露面:17小时59分钟前
职员
加入:2018-02-08 11:03
嗨herangli,

嗨herangli,

请查看图34:数据表中的时钟树图。所有外围块都是从系统时钟div1(绿线)或divn_clk(红线)馈送。绿线是系统时钟除以1,2。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实现。时钟频率可以进一步划分在外围HW块中(如果可能)。

具体到SPI外围块,时钟速度为32 MHz的SPI控制器和SPI源时钟可以除以2,4,8,14(根据数据表)。所以最小SPI时钟是32MHz / 14。

如果您要进一步降低SPI时钟,则应为外围时钟选择DIV1,然后将DIV1降低系统时钟以便能够获得较低的外围频率。这不建议使用,因为整体CPU性能将较低。另外,在将应用程序中触发的事件的情况下,更高频率对系统时钟的变化,例如需要PLL96的USB中的插头,这将导致外围设备中速度的无条件变化。您必须在您的应用程序中进行额外的照顾,因此在使用DIVN的外围设备的交易中将绝对不会发生系统时钟。

如果您仍需要使用1MHz SPI时钟,则可能的解决方法可能如下:

  1. 在main()函数中将系统时钟除以4,如下所示

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.

herangli
离线
最后一次露面:1个月3周前
加入:2019-12-15 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)
空白hw_spi_init_clk_reg (HW_SPI_ID id)

assert_warning(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_PLK_SEL_SEL_SEL_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

};

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

我又检查了一遍数据表,但我不清楚你为什么写那个绿线是系统时钟除以。4或8”。绿线是系统时钟。ahb和apb总线时钟是系统时钟除以1,2,4,8。绿线来自sys_clk选择器,直接来自XTAL32, RC32, PLL, LP时钟。我可以修改ahb和apb总线时钟,但我看到SPI外围时钟独立于ahb或apb总线时钟。(图84:SPI框图)。这些总线只参与数据移动。

谢谢提前

PM_DIALOG.
离线
最后一次露面:17小时59分钟前
职员
加入:2018-02-08 11:03
嗨herangli,

嗨herangli,

我的意思是,如果AHB和APB总线时钟划分,则系统时钟也将分为1,2,4,8。请让我在我身边检查它,我会告诉你。

我能问一下你使用的SPI接口是什么,并且要求SPI clack速度小于1MHz吗?

由于PM_Dialog

herangli
离线
最后一次露面:1个月3周前
加入:2019-12-15 42
亲爱的支持

亲爱的支持

谢谢你帮我检查这个问题。

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

(我认为在这篇文章之后,我们可能会向Analog Devices索要一些广告费用:))

谢谢提前

herangli
离线
最后一次露面:1个月3周前
加入:2019-12-15 42
亲爱的支持

亲爱的支持

您是否有机会在评估板中查看此问题?

先谢谢你

herangli
离线
最后一次露面:1个月3周前
加入:2019-12-15 42
亲爱的支持

亲爱的支持

您是否有机会在评估板中查看此问题?

先谢谢你

PM_DIALOG.
离线
最后一次露面:17小时59分钟前
职员
加入:2018-02-08 11:03
嗨herangli,

嗨herangli,

谢谢你提醒,我对迟到的回应道歉。我会再试一次。

谢谢,PM_DIALOG.

PM_DIALOG.
离线
最后一次露面:17小时59分钟前
职员
加入:2018-02-08 11:03
嗨herangli,

嗨herangli,

是否有可能在此处附上您的项目来看看?

谢谢,PM_DIALOG.