亲爱的支持 谢谢你的详细答案。我检查了这个解决方法。它的意思是 1设置HCLK和PCLK分配器 cm_sys_clk_init(sysclk_xtal32m); cm_apb_set_clock_divider(apb_div4); cm\U ahb\U设置\U时钟\U分配器(ahb\U div4); cm_lp_clk_init(); 2.修改hw_spi_init_clk_reg()函数(我使用spi1) 无效hw\ U spi\ U init\ U clk\ U reg(hw\ U spi\ U ID) { assert_warning(reg_getf(crg_top,pmu_ctrl_reg,com_sleep)== 0); 如果(id==HW\u SPI1){ CRG\ U COM->RESET\ U CLK\ U COM\ U REG=CRG\ U COM\ U RESET\ U CLK\ U COM\ U REG\ U SPI\ U CLK\ U SEL\ U 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); } else { crg_com-> reset_clk_com_reg = crg_com_reset_clk_com_reg_spi2_clk_sel_msk; CRG\ U COM->SET\ CLK\ U COM\ U REG=CRG\ U COM\ SET\ CLK\ U COM\ U REG\ U SPI2\ U ENABLE\ Msk; } } 3.划分SPI时钟(带14 - > 500K SCLK) / *外部传感器/模块SPI驱动程序* / const ad \u spi \u driver \u conf \u t drv \u SPI1 \u adis={ .spi = { .cs_pad = {device_cs_gpio_port,device_cs_gpio_pin}, .word\u mode=HW\u SPI\u word\u 8BIT,//在这里可以定义所需的 .smn_role = hw_spi_mode_master, .polarity\u mode=HW\u SPI\u POL\u LOW,//这里可以定义所需的SPI极性 .phase\u mode=HW\u SPI\u PHA\u mode\u 0,//在这里可以定义所需的SPI阶段 .mint\u mode=HW\u SPI\u mint\u禁用, .xtal\ u freq=HW\ u SPI\ u freq\ u DIV\ u 14, .fifo\u mode=HW\u SPI\u fifo\u RX\u TX, .disabled=0,/*应在初始化阶段禁用*/ .ignore_cs = false, .使用\ dma=true, .rx\u dma\u channel=HW\u dma\u channel\u 2, .tx\u dma\u channel=HW\u dma\u channel\u 4 } };
不幸的是,结果是一样的。
我又看了一遍数据表,但不明白你为什么这么写,绿线是系统时钟除以1,2。4或8“。绿线是系统时钟。ahb和apb总线时钟是系统时钟除以1、2、4、8。绿线来自sys\ U clk选择器,直接来自XTAL32、RC32、PLL、LP时钟。我可以修改ahb和apb总线时钟,但正如我看到的SPI外围时钟是独立于ahb或apb总线时钟。(图84:SPI框图)。这些总线只参与数据传输。
你好,赫朗利,
谢谢你的问题。请参阅数据表第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时钟。它意味着改变最大除法器枚举(HW\u SPI\u freq\u DIV\u 14)中的.xtal\u freq值。
当我测量SPI SCLK信号频率时,我看到大约2.5 MHz。(我的USB示波器精度不那么高,但我相信它超过1MHz)
我有点困惑,因为我检查了时钟树(第168页),我看到这个除法器是降低SCLK频率的一种方法,因为除法器的输入可以来自sysclk或divN时钟源。据我所知,divN是一个固定值,或者没有任何接口函数可以修改这个值。
这意味着对我来说,这是不可能去贝娄与SCLK 1兆赫以下,如果我想使用32兆赫晶体或锁相环。我肯定我错过了什么只是我不知道什么。
提前谢谢
你好,赫朗利,
请尝试更改分隔符:
cm\ apb\ set\时钟\分频器(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处理。
我看到大约2.3-2.5MHz在SPI时钟引脚和一种方式,我可以修改这个频率的SPI时钟分频器,你也提到了过去。
你有没有其他的想法,我如何才能实现一个小于1MHz的频率,或者我们可以宣布,这是不可能的这种架构?
提前谢谢
你好,赫朗利,
请查看图34:数据表中的时钟树图。所有外围块都是从系统时钟div1(绿线)或divn_clk(红线)馈送。绿线是系统时钟除以1,2。4或8。默认情况下,系统时钟分为1,位于32MHz:
cm_sys_clk_init(sysclk_xtal32m);
cm\ apb\ set\时钟\分频器(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\U ahb\U设置\U时钟\U分配器(ahb\U div4);
新系统时钟为32MHz/4=8MHz
谢谢,PM_DIALOG.
亲爱的支持
谢谢你的详细答案。我检查了这个解决方法。它的意思是
1设置HCLK和PCLK分配器
cm_sys_clk_init(sysclk_xtal32m);
cm_apb_set_clock_divider(apb_div4);
cm\U ahb\U设置\U时钟\U分配器(ahb\U div4);
cm_lp_clk_init();
2.修改hw_spi_init_clk_reg()函数(我使用spi1)
无效hw\ U spi\ U init\ U clk\ U reg(hw\ U spi\ U ID)
{
assert_warning(reg_getf(crg_top,pmu_ctrl_reg,com_sleep)== 0);
如果(id==HW\u SPI1){
CRG\ U COM->RESET\ U CLK\ U COM\ U REG=CRG\ U COM\ U RESET\ U CLK\ U COM\ U REG\ U SPI\ U CLK\ U SEL\ U 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);
} else {
crg_com-> reset_clk_com_reg = crg_com_reset_clk_com_reg_spi2_clk_sel_msk;
CRG\ U COM->SET\ CLK\ U COM\ U REG=CRG\ U COM\ SET\ CLK\ U COM\ U REG\ U SPI2\ U ENABLE\ Msk;
}
}
3.划分SPI时钟(带14 - > 500K SCLK)
/ *外部传感器/模块SPI驱动程序* /
const ad \u spi \u driver \u conf \u t drv \u SPI1 \u adis={
.spi = {
.cs_pad = {device_cs_gpio_port,device_cs_gpio_pin},
.word\u mode=HW\u SPI\u word\u 8BIT,//在这里可以定义所需的
.smn_role = hw_spi_mode_master,
.polarity\u mode=HW\u SPI\u POL\u LOW,//这里可以定义所需的SPI极性
.phase\u mode=HW\u SPI\u PHA\u mode\u 0,//在这里可以定义所需的SPI阶段
.mint\u mode=HW\u SPI\u mint\u禁用,
.xtal\ u freq=HW\ u SPI\ u freq\ u DIV\ u 14,
.fifo\u mode=HW\u SPI\u fifo\u RX\u TX,
.disabled=0,/*应在初始化阶段禁用*/
.ignore_cs = false,
.使用\ dma=true,
.rx\u dma\u channel=HW\u dma\u channel\u 2,
.tx\u dma\u channel=HW\u dma\u channel\u 4
}
};
不幸的是,结果是一样的。
我又看了一遍数据表,但不明白你为什么这么写,绿线是系统时钟除以1,2。4或8“。绿线是系统时钟。ahb和apb总线时钟是系统时钟除以1、2、4、8。绿线来自sys\ U clk选择器,直接来自XTAL32、RC32、PLL、LP时钟。我可以修改ahb和apb总线时钟,但正如我看到的SPI外围时钟是独立于ahb或apb总线时钟。(图84:SPI框图)。这些总线只参与数据传输。
提前谢谢
你好,赫朗利,
我的意思是,如果AHB和APB总线时钟划分,则系统时钟也将分为1,2,4,8。请让我在我身边检查它,我会告诉你。
我能问一下您使用的SPI接口是什么,要求的SPI时钟速度低于1MHz吗?
谢谢你的对话
亲爱的支持
感谢您检查您这边的问题。
当然,我想用ADIS16460进行高精度IMU测量,并通过蓝牙发送测量结果。
这是ADIS传感器的数据表https://www.analog.com/en/雷电竞官网登录products/adis16460.html.
在数据表中,您可以在第5页顶部看到最大SPI时钟频率。
(我想在这篇文章之后,我们可以向模拟设备索取一些钱,作为广告费用:))
提前谢谢
亲爱的支持
您是否有机会在评估板中查看此问题?
先谢谢你
亲爱的支持
您是否有机会在评估板中查看此问题?
先谢谢你
你好,赫朗利,
谢谢你提醒,我对迟到的回应道歉。我会再试一次。
谢谢,PM_DIALOG.
你好,赫朗利,
是否有可能在此处附上您的项目来看看?
谢谢,PM_DIALOG.