1984036_zh-CN

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

1984036_zh-CN

1984036_zh-CN

AD9833 LPSPI 总线配置与 S32k358

Hello,

我正在使用 AD9833 芯片,利用来自我的 S32k358 微控制器中配置的 SPI 总线的数据生成 100kHz 正弦波。我已经使用 LPSPI RTD 驱动程序设置了 SPI 总线。我已经定义了一个函数,将 FSYNC 引脚设置为低电平,推送数据,然后将 FSYNC 引脚设置回高电平。我已附上我的LPSPI配置

根据配置,我可以得到 SPI 波形,但仍然 DAC 的控制寄存器尚未设置。

根据数据表和应用说明 AN-1070,以下是我将等效数据处理到 DAC 中的代码:

DAC_data_send(0x2100); //重置开启
data = 1073742;//来自SPI2 MOSI的100000Hz等效16位数据
uint16 MSB = (uint16)((data & 0xFFFC000) >> 14); //提取MSB并设置FREQREG0的控制位
uint16 LSB = (uint16)(data & 0x3FFF); //提取 LSB 并设置 FREQREG0 的控制位

LSB |= 0x4000; // FREQREG0 的 LSB 控制位,0x8000; // FREQ1 的 LSB 控制位
MSB |= 0x4000; // FREQREG0 的 MSB 控制位,0x8000; // FREQ1 的 MSB 控制位


DAC_data_send(LSB); //将 14 位 LSB 写入频率寄存器 0
DAC_data_send(MSB); //将14位MSB写入频率寄存器0
DAC_data_send(0xC000); //设置相位寄存器0中的相位调整
DAC_data_send(0x2000); // 重置关闭*/


1073742 的计算结果为 - (100000*2^28)/(25*10^6)。我按照数据表中的公式计算的。我不知道哪里出错了,谁能指点一下?

回复:使用S32k358的AD9833 LPSPI总线配置

正如S32 配置工具针对SpiTimeClk2CsSpiTimeCs2Clk所示:此参数允许使用从30 ns 到0.01 s 的值范围。因此您不能将SPItimeCs2Clk设置为20 ns。

The SpiTimeCs2Clk value is out of range. In HW specific the value must be in the range [3E-08 to 0.01].jpgThe SpiTimeCs2Clk value is out of range. In HW specific the value must be in the range [3E-08 to 0.01].jpg

我不明白为什么必须将SPItimeCs2Clk ( t8 ) 设置为20 ns。据我所知,当 LPSPI2 以10 MHz 运行时, SCLK 周期t4 )等于100 ns。所以t8 最大值=t4-5=100-5= 95 ns。您只需将SPItimeCs2Clk ( t8 ) 设置在 t8 最小值和最大值之间,即 10ns 到 95ns 之间。
我只是将SpiTimeClk2CsSpiTimeCs2Clk设置为30 ns,即0.00000003

AD9833 Figure 4. Serial Timing t4 t8 t11.jpgAD9833 Figure 4. Serial Timing t4 t8 t11.jpg


AD9833 不是 NXP 的产品,移植AD9833 - 微控制器无操作系统驱动程序超出了我们的在线技术支持范围。

由于您不使用MISO引脚,建议启用SpiHalfDuplexModeSupport并使用Lpspi_Ip_SyncTransmitHalfDuplex而不是Lpspi_Ip_SyncTransmit

我修改了Lpspi_Ip_HalfDuplexTransfer_S32K358 _RTD400HF02 以发送来自AN-1070示例的命令初始化序列“0x2100 0x50C7 0x4000 0xC000 0x2000”。关于 AN-1070 的控制,我建议您也联系www.analog.com的技术支持。

AN-1070 The required initialization sequence.jpgAN-1070 The required initialization sequence.jpg

回复:使用S32k358的AD9833 LPSPI总线配置

是的,我知道 FreqReg 是使用 MCLK 计算的,并且 LPSPI2 的最大波特率为 10Mhz。

我说的是AD9833的工作频率和LPSPI2总线的串行时钟。我尝试将 LPSPI2 总线的频率设置为低于 40Mhz(20Mhz),但我无法将 SPItimeCs2Clk 时间设置在 20ns 以内。我尝试发送的数据没有设置 FreqReg。

我想知道时钟配置必须是什么样的。你能清楚地告诉我吗因为我的时间很紧!!

回复:使用S32k358的AD9833 LPSPI总线配置
The serial clock can have a frequency of 40 MHz maximum. 

AD9833 数据表中提到的最大频率并不意味着您必须使用 40MHz SPI 时钟进行通信。您还可以使用较低的 SPI 时钟频率。
请注意:

For S32K314, S32K322, S32K324, S32K328, S32K338, S32K341, S32K342, S32K344, S32K348, S32K358, S32K388,S32K396: The maximum baudrate for LPSPI0 is 20MHz, for LPSPI1-LPSPI5 is 10MHz, for FLEXIO is 10MHz.


此外, FreqReg是使用MCLK而不是SLCK计算的。

回复:使用S32k358的AD9833 LPSPI总线配置

谢谢您的回复。我将按照您所指出的更改 DAC_STACK 大小和 tx 缓冲区分配。

根据 AD9833 数据表,工作频率必须高达 40Mhz,您的 LPSPI 总线频率是多少,您的 SpiTimeClk2Cs 和 SpiTimeCs2Clk 时间是多少。

您的 SpiTimeCs2Clk 是否在 20ns 以内?

你能提供你的修改后的项目吗


回复:使用S32k358的AD9833 LPSPI总线配置

以下是我调试完你附件项目中的AD9833_TX_SPI(SPI_ONLY_M7_0_0)后的SPI波形:
由于我的S32K358 mini板载了16MHz的晶振,所以我修改了时钟部分,同时还增加了SpiTimeClk2Cs和SpiTimeCs2Clk的值。

SPI_ONLY_M7_0_0 AD9833_TX_SPI.jpgSPI_ONLY_M7_0_0 AD9833_TX_SPI.jpg

根据逻辑分析仪上的SPI数据,我发现了两个问题:
1. 每次都会额外发送 0x0000。为什么要#define DAC_STACK( 4 U)?难道不应该是2 U 吗?
2.您调用了 AD9833_TX_SPI(0x2100); 但发送了 0x0021。看起来你把高8位和低8位颠倒了。请修改TxMasterBufferAD3988[0]和TxMasterBufferAD3988[1]的分配。

回复:使用S32k358的AD9833 LPSPI总线配置

我已附加基于无操作系统驱动程序的新代码。

回复:使用S32k358的AD9833 LPSPI总线配置

由于 AD9833 不是 NXP 的产品,我不确定是否是因为您没有按照AN-1070命令序列说明部分发送这些 SPI 数据。我检查了ad9833_inithttps://github.com/analogdevicesinc/no-OS/blob/main/drivers/frequency/ad9833/ad9833.c#L128 ),似乎您应该按照 AN-1070 发送 SPI 数据。
建议发送这些SPI数据:0x2100 0x50C7 0x4000 0xC000 0x2000

回复:使用S32k358的AD9833 LPSPI总线配置

那么 SPI 总线时间和时钟配置必须是什么。我已确保为我的 SCLK 选择 40MHz 时钟(如数据表中所述)。

根据数据表中的时间特性,FSYNC 到 SCLK 保持时间(t8)表示我可以设置的最大值为 20ns。使用 40MHz 设置时我无法设置该值,我可以设置的最小值是 30ns。

当我在“SPITimeCS2CLK”属性中输入 20E-9 时,会出现一个值不兼容的错误,并以红色突出显示。当我将 SPIbus 的 SCLK 设置为 20Mhz 和 60MHz 时,我尝试了相同的配置,但仍然得到相同的输出

回复:使用S32k358的AD9833 LPSPI总线配置

由于S32K3X8EVB-Q289板上PTB3默认连接到J63 pin8(GMAC_RGMII_TXD3_PTB3),所以我不方便在S32K3X8EVB-Q289上对其进行测试。
今天我找到了另一个 S32K358 迷你板来测试您的项目。以下是逻辑分析仪捕获的SPI数据。感觉这个数据有点奇怪,SPI发送数据的时间间隔太短了。我不知道您的应用程序是否真的需要如此频繁地修改AD9833的输出。

PIT_TRIGMUX_ADC_BCTU_1_M7_0_0 SPI data.jpgPIT_TRIGMUX_ADC_BCTU_1_M7_0_0 SPI data.jpg

回复:使用S32k358的AD9833 LPSPI总线配置

我参考了 AN1070 应用程序,并按照文章中解释的步骤进行操作。我没有得到正确的输出。

我的逻辑分析仪工作不正常,我正在使用常用的探头。我能够解码 SPI sout、PCS0 和 SCLK,但是当我测量 AD9833 Vout 引脚的输出频率时,它会不断改变接近我设定频率的几个值,以及远高于设定值的一两个频率。

当我看到使用不同的平台板对相同的 AD9833 芯片进行编程的例子时,波形的频率恰好等于设置的频率。

我还研究了特定于该芯片的 No-OS 驱动程序代码,并定义了与源代码中的定义类似的函数。无论哪里有 no_spi 和 no_gpio 的语句,我都用 Lpspi 和 Siul2_gpio 函数替换它们。

我已经对它们进行了测试并且得到了类似的输出。我仍不知道我在这里错过了什么。

回复:使用S32k358的AD9833 LPSPI总线配置

您是说,除了接收 FREQREG 寄存器之外,AD9833 可以执行所有 SPI 命令吗?

由于您指的是AN-1070:对 AD9833/AD9834 进行编程,您是否考虑过使用相同的 SPI 命令序列并仅修改频率部分?同时用逻辑分析仪抓取SPI波形,确保与AN-1070一致?

回复:使用S32k358的AD9833 LPSPI总线配置

我已经尝试过了,但我想使用 LPSPI 总线配置进行数据传输。我已经验证我的数据正在通过 SPI 总线传输,但是当我按照 No-OS 驱动程序中定义的顺序发送数据时,我能够获得具有额定输出电压的正弦波,但无法控制频率。AD9833芯片的vout电压频率等于SPI SCLK而不是FREQREG中设置的频率。请告诉我哪里出错了。

苏米克

回复:使用S32k358的AD9833 LPSPI总线配置

您是否参考过AD9833 - 微控制器无操作系统驱动程序
https://github.com/analogdevicesinc/no-OS/blob/main/drivers/frequency/ad9833/ad9833.c
https://github.com/analogdevicesinc/no-OS/blob/main/drivers/frequency/ad9833/ad9833.h
请使用逻辑分析仪检查发送给AD9833的SPI是否正确。

回复:使用S32k358的AD9833 LPSPI总线配置

是的,我已经将 AD9833 chp 的 FSYNC 引脚连接到 LPSPI-PCS0 引脚。我在 AD9833 引脚上获得了 SPI sout、串行时钟和芯片选择。

soumik1506_0-1730383851398.pngsoumik1506_0-1730383851398.png


即使进行了您在图像中突出显示的更改之后,我仍然没有从 AD9833 VOUT 引脚获得输出。我尝试过不同的 FREQREG 值

回复:使用S32k358的AD9833 LPSPI总线配置

Hi

由于AD9833不是NXP的产品,所以我对它了解不多。我看了它的手册,发现下面突出显示的部分需要修改。

AD9833 LPSPI configuration.jpgAD9833 LPSPI configuration.jpg

您是否将FSYNC连接到PCS0?根据我的理解,FSYNC引脚应该是SPI的片选引脚。

请使用逻辑分析仪捕捉SPI通信波形。如果你之前使用过AD9833并且熟悉它的控制,建议观察SPI波形检查是否正确。

AD9833 Figure 4. Serial Timing.jpgAD9833 Figure 4. Serial Timing.jpg


此致,
罗宾
--------------------------------------------------------------------------------
笔记:
- 如果这篇文章回答了您的问题,请点击“标记正确”按钮。谢谢你!

- 我们会关注上次发帖后七周的帖子,之后的回复将被忽略
如果您稍后有相关问题,请打开一个新线程并参考已关闭的线程。
--------------------------------------------------------------------------------

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎01-06-2026 01:33 AM
更新者: