亲爱的支持
我有一个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示例。我使用广告sw层所有其他部分的代码。我试图以一种原始的方式减少SPI时钟。这意味着改变最大分隔符枚举(HW_SPI_FREQ_DIV_14)中的.xtal_freq值。当我测量SPI SCLK信号频率时,我看到大约2.5 MHz。(我的USB示波器精度不是很高,但我肯定它超过1MHz)
我有点困惑,因为我检查了时钟树(第168页),我看到这个分频器是降低SCLK频率的一种方法,因为分频器的输入可以来自sysck或divN时钟源。divN是一个固定值,因为我知道或者没有任何接口函数,我可以修改这个值。这意味着对我来说,它是不可能去低于1MHz与SCLK,如果我想使用32MHz晶体或锁相环。我肯定我错过了什么,只是我不知道是什么。
请试着改变分割线:
cm_apb_set_clock_divider (apb_div1);
cm_ahb_set_clock_divider (ahb_div1);
然而,你将不能时钟时钟锁相环,所以系统将运行在32MHz。请检查hw_clk_set_sysclk()函数。
谢谢你的回复。
我切换回xtal 32 MHz时钟,以修改ahb和apb总线时钟分压器,我测量了SCLK频率,但我不能实现任何积极的结果。我尝试了几个分频器参数,但它们对SPI时钟频率没有任何影响。
在时钟树和数据表中,我看到这些分隔器只对QSPI外围设备有影响,但它用于闪存或ram处理。
我看到大约2.3-2.5MHz的SPI CLK引脚和一种方式,我可以通过SPI时钟分频器修改这个频率,正如你在过去也提到过。
你有任何其他的想法,我如何实现一个小于1MHz的频率,或者我们可能会宣布这是不可能的架构?
请查看数据表中的图34:时钟树图。所有的外围块要么来自系统时钟div1(绿线),要么来自divN_clk(红线)。绿线是系统时钟除以。4或8。默认情况下,系统时钟除以1,频率为32MHz:
cm_sys_clk_init (sysclk_XTAL32M);
红色的线是DivN HW块的输出,无论上述的划分,频率总是在32Mhz。
CLK_COM_REG处理“绿线”和“红线”之间的选择。低电平驱动(LLD)是用32MHz时钟(红线)divN_clk实现的。时钟频率可以进一步划分到外围硬件块中(如果可能的话)。
具体到SPI外围块,时钟速度为32 MHz的SPI控制器和SPI源时钟可以除以2,4,8,14(根据数据表)。所以最小SPI时钟是32MHz / 14。
如果您想进一步降低SPI时钟,您应该为外围时钟选择div1,然后降低系统时钟以能够获得较低的外围频率。CPU整体性能较差,不建议使用。此外,在一个事件,将触发您的应用程序的变化,一个更高的频率的系统时钟,例如插入USB需要PLL96,这将导致无条件的变化,在您的外围设备的速度。在你的应用程序中,你必须格外小心,所以在使用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)空白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}};
不幸的是,结果是一样的。
我又检查了一遍数据表,但我不清楚你为什么写那个绿线是系统时钟除以。4或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 clack速度小于1MHz吗?
由于PM_Dialog
谢谢你帮我检查这个问题。
当然,我想用ADIS16460进行高精度的IMU测量,并通过蓝牙发送测量结果。这是ADIS传感器数据表https://www.analog.com/en/雷电竞官网登录products/adis16460.html在数据表中,您可以在第5页顶部看到最大SPI时钟频率。
(我认为在这篇文章之后,我们可能会向Analog Devices索要一些广告费用:))
你在评估板上查过这个问题吗?
先谢谢你
谢谢你的提醒,很抱歉回复晚了。我再试一次。
可不可以把你的项目附在这里看一下?
嗨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示例。我使用广告sw层所有其他部分的代码。
我试图以一种原始的方式减少SPI时钟。这意味着改变最大分隔符枚举(HW_SPI_FREQ_DIV_14)中的.xtal_freq值。
当我测量SPI SCLK信号频率时,我看到大约2.5 MHz。(我的USB示波器精度不是很高,但我肯定它超过1MHz)
我有点困惑,因为我检查了时钟树(第168页),我看到这个分频器是降低SCLK频率的一种方法,因为分频器的输入可以来自sysck或divN时钟源。divN是一个固定值,因为我知道或者没有任何接口函数,我可以修改这个值。
这意味着对我来说,它是不可能去低于1MHz与SCLK,如果我想使用32MHz晶体或锁相环。我肯定我错过了什么,只是我不知道是什么。
谢谢提前
嗨herangli,
请试着改变分割线:
cm_apb_set_clock_divider (apb_div1);
cm_ahb_set_clock_divider (ahb_div1);
然而,你将不能时钟时钟锁相环,所以系统将运行在32MHz。请检查hw_clk_set_sysclk()函数。
谢谢,PM_Dialog
亲爱的支持
谢谢你的回复。
我切换回xtal 32 MHz时钟,以修改ahb和apb总线时钟分压器,我测量了SCLK频率,但我不能实现任何积极的结果。我尝试了几个分频器参数,但它们对SPI时钟频率没有任何影响。
在时钟树和数据表中,我看到这些分隔器只对QSPI外围设备有影响,但它用于闪存或ram处理。
我看到大约2.3-2.5MHz的SPI CLK引脚和一种方式,我可以通过SPI时钟分频器修改这个频率,正如你在过去也提到过。
你有任何其他的想法,我如何实现一个小于1MHz的频率,或者我们可能会宣布这是不可能的架构?
谢谢提前
嗨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外围块,时钟速度为32 MHz的SPI控制器和SPI源时钟可以除以2,4,8,14(根据数据表)。所以最小SPI时钟是32MHz / 14。
如果您想进一步降低SPI时钟,您应该为外围时钟选择div1,然后降低系统时钟以能够获得较低的外围频率。CPU整体性能较差,不建议使用。此外,在一个事件,将触发您的应用程序的变化,一个更高的频率的系统时钟,例如插入USB需要PLL96,这将导致无条件的变化,在您的外围设备的速度。在你的应用程序中,你必须格外小心,所以在使用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)
空白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
}
};
不幸的是,结果是一样的。
我又检查了一遍数据表,但我不清楚你为什么写那个绿线是系统时钟除以。4或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 clack速度小于1MHz吗?
由于PM_Dialog
亲爱的支持
谢谢你帮我检查这个问题。
当然,我想用ADIS16460进行高精度的IMU测量,并通过蓝牙发送测量结果。
这是ADIS传感器数据表https://www.analog.com/en/雷电竞官网登录products/adis16460.html
在数据表中,您可以在第5页顶部看到最大SPI时钟频率。
(我认为在这篇文章之后,我们可能会向Analog Devices索要一些广告费用:))
谢谢提前
亲爱的支持
你在评估板上查过这个问题吗?
先谢谢你
亲爱的支持
你在评估板上查过这个问题吗?
先谢谢你
嗨herangli,
谢谢你的提醒,很抱歉回复晚了。我再试一次。
谢谢,PM_Dialog
嗨herangli,
可不可以把你的项目附在这里看一下?
谢谢,PM_Dialog