亲爱的支持
我有一个DA14695 USB eval板,我想将设备集成到SPI上。该从设备需要最大1MHz SCLK频率能够进行通信。我试图找到一些解决方案来设置较低的频率,但我还没有找到任何方式。
是否可以设置较低的SPI主SCLK频率?如果有可能请帮助我如何。
提前致谢
嗨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.
谢谢你们的快速响应。我在我的代码中检查并使用SPI示例。我使用AD SW层代码的所有其他部分。我试图以原始方式减少SPI时钟。如上所述,它意味着最大分配枚举中的更改.xtal_freq值(hw_spi_freq_div_14)。当我测量SPI SCLK信号频率时,我看到大约2.5 MHz。(我的USB示波器精度不那么高,但我相信它超过1MHz)
我有点困惑,因为我检查了时钟树(第168页),因为我看到这个分频器是减少SCLK频率的一种方法,因为分频器的输入可以来自SYSCLK或DIVN时钟源。DIVN是我知道的修复值,或者没有任何接口功能,我能够修改此值。这意味着我对我来说,如果我想使用32MHz水晶或PLL,那就不可能使用SCLK。我相信我错过了我不知道什么。
请尝试更改分隔符:
cm_apb_set_clock_divider(apb_div1);
cm_ahb_set_clock_divider(ahb_div1);
但是,您无法将时钟装入PLL,因此系统将使用32MHz运行。请检查hw_clk_set_sysclk()函数。
感谢您的回复。
我切换回XTAL 32 MHz时钟,以修改AHB和APB总线分频器,并测量SCLK频率,但我无法达到任何正面结果。我尝试了几个分频器参数,但它们对SPI时钟频率没有任何影响。
在时钟树和数据表中,我看到这些分隔符只有QSPI外设影响,但它用于闪存或RAM处理。
我在SPI CLK引脚中看到大约2.3-2.5MHz,以及如何通过SPI时钟分频器修改此频率的一种方式。
您还有其他想法如何达到比1MHz更小的频率,或者我们可能会声明这架构不可能?
请查看图34:数据表中的时钟树图。所有外围块都是从系统时钟div1(绿线)或divn_clk(红线)馈送。绿线是系统时钟除以1,2。4或8。默认情况下,系统时钟分为1,位于32MHz:
cm_sys_clk_init(sysclk_xtal32m);
红线是DIVN HW块的输出,无论上述划分,频率始终为32MHz。
CLK_COM_REG处理“绿色”和“红色”线之间的选择。低级驱动程序(LLD)用32MHz时钟(红线)Divn_Clk实现。时钟频率可以进一步划分在外围HW块中(如果可能)。
专为SPI外围块,SPI控制器最多32 MHz的时钟速度,SPI源时钟可以除以2,4,8,14(根据数据表)。因此最小SPI时钟为32MHz / 14。
如果您要进一步降低SPI时钟,则应为外围时钟选择DIV1,然后将DIV1降低系统时钟以便能够获得较低的外围频率。这不建议使用,因为整体CPU性能将较低。另外,在将应用程序中触发的事件的情况下,更高频率对系统时钟的变化,例如需要PLL96的USB中的插头,这将导致外围设备中速度的无条件变化。您必须在您的应用程序中进行额外的照顾,因此在使用DIVN的外围设备的交易中将绝对不会发生系统时钟。
如果您仍需要使用1MHz SPI时钟,则可能的解决方法可能如下:
cm_apb_set_clock_divider(apb_div4);
cm_ahb_set_clock_divider(ahb_div4);
新系统时钟将是32MHz / 4 = 8MHz
亲爱的支持谢谢你的详细答案。我检查了这个解决方法。它的意思是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){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.}};
不幸的是,结果是一样的。
我再次检查了数据表,但对我来说不清楚你为什么写了,绿线是系统时钟除以1,2或8“。绿线是系统时钟。AHB和APB总线时钟是系统时钟除以1,2,4,8.绿线来自Sys_Clk选择器,直接来自XTAL32,RC32,PLL,LP时钟。我可以修改AHB和APB总线时钟,但随着我看到SPI外围时钟独立于AHB或APB总线时钟。(图84:SPI块图)。这些总线仅参加数据移动。
我的意思是,如果AHB和APB总线时钟划分,则系统时钟也将分为1,2,4,8。请让我在我身边检查它,我会告诉你。
我可以问你使用的SPI接口是什么,需要的SPI疏通速度小于1MHz吗?
谢谢pm_dialog.
感谢您在您身边查看此问题。
当然,我想用ADIS16460进行高精度的IMU测量,并通过蓝牙发送测量。这是ADIS传感器的数据表https://www.analog.com/en/亚博电竞菠菜products/adis16460.html.在数据表中,您可以在第5页顶部看到最大SPI时钟频率。
(我想在这篇文章之后我们可能会从模拟设备上询问一些钱,如广告成本:))
您是否有机会在评估板中查看此问题?
先感谢您
谢谢你提醒,我对迟到的回应道歉。我会再试一次。
是否有可能在此处附上您的项目来看看?
嗨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.
亲爱的支持
谢谢你们的快速响应。
我在我的代码中检查并使用SPI示例。我使用AD SW层代码的所有其他部分。
我试图以原始方式减少SPI时钟。如上所述,它意味着最大分配枚举中的更改.xtal_freq值(hw_spi_freq_div_14)。
当我测量SPI SCLK信号频率时,我看到大约2.5 MHz。(我的USB示波器精度不那么高,但我相信它超过1MHz)
我有点困惑,因为我检查了时钟树(第168页),因为我看到这个分频器是减少SCLK频率的一种方法,因为分频器的输入可以来自SYSCLK或DIVN时钟源。DIVN是我知道的修复值,或者没有任何接口功能,我能够修改此值。
这意味着我对我来说,如果我想使用32MHz水晶或PLL,那就不可能使用SCLK。我相信我错过了我不知道什么。
提前致谢
嗨Herangli,
请尝试更改分隔符:
cm_apb_set_clock_divider(apb_div1);
cm_ahb_set_clock_divider(ahb_div1);
但是,您无法将时钟装入PLL,因此系统将使用32MHz运行。请检查hw_clk_set_sysclk()函数。
谢谢,PM_DIALOG.
亲爱的支持
感谢您的回复。
我切换回XTAL 32 MHz时钟,以修改AHB和APB总线分频器,并测量SCLK频率,但我无法达到任何正面结果。我尝试了几个分频器参数,但它们对SPI时钟频率没有任何影响。
在时钟树和数据表中,我看到这些分隔符只有QSPI外设影响,但它用于闪存或RAM处理。
我在SPI CLK引脚中看到大约2.3-2.5MHz,以及如何通过SPI时钟分频器修改此频率的一种方式。
您还有其他想法如何达到比1MHz更小的频率,或者我们可能会声明这架构不可能?
提前致谢
嗨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外围块,SPI控制器最多32 MHz的时钟速度,SPI源时钟可以除以2,4,8,14(根据数据表)。因此最小SPI时钟为32MHz / 14。
如果您要进一步降低SPI时钟,则应为外围时钟选择DIV1,然后将DIV1降低系统时钟以便能够获得较低的外围频率。这不建议使用,因为整体CPU性能将较低。另外,在将应用程序中触发的事件的情况下,更高频率对系统时钟的变化,例如需要PLL96的USB中的插头,这将导致外围设备中速度的无条件变化。您必须在您的应用程序中进行额外的照顾,因此在使用DIVN的外围设备的交易中将绝对不会发生系统时钟。
如果您仍需要使用1MHz SPI时钟,则可能的解决方法可能如下:
cm_sys_clk_init(sysclk_xtal32m);
cm_apb_set_clock_divider(apb_div4);
cm_ahb_set_clock_divider(ahb_div4);
新系统时钟将是32MHz / 4 = 8MHz
谢谢,PM_DIALOG.
亲爱的支持
谢谢你的详细答案。我检查了这个解决方法。它的意思是
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)
{
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.
}
};
不幸的是,结果是一样的。
我再次检查了数据表,但对我来说不清楚你为什么写了,绿线是系统时钟除以1,2或8“。绿线是系统时钟。AHB和APB总线时钟是系统时钟除以1,2,4,8.绿线来自Sys_Clk选择器,直接来自XTAL32,RC32,PLL,LP时钟。我可以修改AHB和APB总线时钟,但随着我看到SPI外围时钟独立于AHB或APB总线时钟。(图84:SPI块图)。这些总线仅参加数据移动。
提前致谢
嗨Herangli,
我的意思是,如果AHB和APB总线时钟划分,则系统时钟也将分为1,2,4,8。请让我在我身边检查它,我会告诉你。
我可以问你使用的SPI接口是什么,需要的SPI疏通速度小于1MHz吗?
谢谢pm_dialog.
亲爱的支持
感谢您在您身边查看此问题。
当然,我想用ADIS16460进行高精度的IMU测量,并通过蓝牙发送测量。
这是ADIS传感器的数据表https://www.analog.com/en/亚博电竞菠菜products/adis16460.html.
在数据表中,您可以在第5页顶部看到最大SPI时钟频率。
(我想在这篇文章之后我们可能会从模拟设备上询问一些钱,如广告成本:))
提前致谢
亲爱的支持
您是否有机会在评估板中查看此问题?
先感谢您
亲爱的支持
您是否有机会在评估板中查看此问题?
先感谢您
嗨Herangli,
谢谢你提醒,我对迟到的回应道歉。我会再试一次。
谢谢,PM_DIALOG.
嗨Herangli,
是否有可能在此处附上您的项目来看看?
谢谢,PM_DIALOG.