公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

您好, PSoC™社区,我有几个关于 SPI 从机中的 SCB(从 32 位 ADC 接收数据)以及从 SPI 从机 RX fifo 缓冲区到PSoC™上双缓冲区设置的 DMA 传输的问题。 模数转换器输出的数据速率是 16.384 Mbps:

 

1.首先,我将从属模式下 SCB 中的 "数据速率(kbps)"设置为 16384。 难道这还不足以确定操作 SCB 的时钟吗? 我不明白为什么我们需要指定另一个EVAL_100W_DRIVE_CFD2块。 另外,我应该将块时钟设置为什么值?目前设置为 100 MHz(外设时钟),它来自 FLL。

 

2.谁能确认将 SCB SPI RX 数据宽度设为 16 是否没问题? 如上所述,ADC 产生 32 位数据,因此 CS 信号在 32 位传输过程中保持低电平。 如果 CS 信号在 32 位传输过程中保持低电平,从站模式下的 SCB 是否会将单个 32 位作为两个 16 位值存储在 SCB RX fifo 缓冲器中? (因为 SCB SPI 块的最大 RX 数据宽度为 16)。 不幸的是,我无法将 SPI 主 CS 线控制为EVAL_100W_DRIVE_CFD2高电平,然后在 32 位传输过程中再次控制为低电平。

 

3.最后,当 SCB RX Fifo 缓冲区满时,我设置 SCB 触发 DMA 传输。 我遇到的问题是,我不知道该如何设置 DMA 描述符中的 "数据传输宽度"。 直观地说,我认为应该是半字(2 字节)到半字,其中源是 SCB RX Fifo 缓冲区,它的数据宽度设置为 16 位,目标也是半字,因为我已经分配了 uint16_t 内存块(目标)。 不过,源代码(SCB RX Fifo)似乎必须设置为 "Word",程序才能编译和运行。 谁能解释一下这是为什么? 另外,在选择中还有 Word 到 Word(屏蔽)的设置,有人能解释一下这些设置的作用吗? 文档资料实在太少了! 附注 然后,在 DMA 传输到内存后,将两个 16 位值合并为一个 32 位值。 希望得到任何帮助。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-6/Clarification-on-SCB-SPI-and-DMA-Settings/td-p/690920

0 点赞
3 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @peterq

您可以参考以下应用笔记,其中提供了有关在PSoC™ 6 中配置 DMA 的指导:
PSoC™ 6 MCU 使用直接内存访问 (DMA)。

1.要为 SCB(本例中为 SPI)获得准确的数据速率(与您在数据速率字段中设置的相同),与 SCB 时钟相连的时钟必须是所提供的数据速率的倍数。

如果您查看PSoC™ 6 时钟树,您会发现所有外设均使用 CLK_PERI 提供时钟。
而 CLK_PERI 的父时钟为 CLK_HF0。 CLK_PERI 在到达 SCB 之前,必须通过一个 8 位外设时钟分频器。

 

Ekta_0-1707328404314.png

进入 SCB 的 8 位外设时钟分频器的值必须设置为可以达到所需的数据传输速率。 如果没有出现这种情况,设备配置器将在保存配置时提示正确设置分隔线,如下图所示:

Ekta_1-1707328779029.png

2. 您能帮我了解一下ADC是如何生成32位数据的吗?
PSoC™ 6 具有 12 位 ADC。 由于 ADC 输出最多为 12 位,因此可以轻松地将 SPI 数据宽度设置为 12 或更大,例如 16 位,以确保不会丢失任何位。

3.所有外设都支持 32 位数据宽度,如果传输源或目标是外设,则源或目标数据宽度必须设置为 32 位。
内存支持 8 位、16 位和 32 位访问。 您可以使用较大的数据宽度来提高吞吐量,或使用
较小的数据宽度来量化数据大小。 例如,从
通信块向内存传输 8 位数据时,源数据宽度必须是 32 位(因为源是
外设),但目标数据宽度可以是 8 位(因为目标是内存位置),
会自动截断较高的 24 位。 这将使内存占用更小。

在您的案例中,由于传输是在 ADC 和 SPI(即外设到外设)之间进行的,您必须将数据传输宽度参数设置为字到字。

最佳问候
Ekta

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-6/Clarification-on-SCB-SPI-and-DMA-Settings/m-p/691210

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 Ekta,

感谢您的答复,但我还有几个后续问题。

1.感谢您的说明,即时钟必须是所提供数据速率的倍数。 我看到配置器提示更新外设时钟分频器,但是,在我的例子中,数据速率为 16384 kbps,源 IMO (8 MHz) -> FLL -> CLK_PERI 不可能正好分到这个频率。 我猜我们可能需要使用自己的 EXTCLK 信号源?

其次,您建议 CLK_PERI 的整数倍数据速率是多少? 5 倍的数据传输速率? 即 81.92 兆赫?

 

 

2.ADC 是一个外部 ADC IC,型号为 AD7768,来自 analog devices,它是一个 24 位 ADC,但每个数据包都有一个相关的 8 位报头,因此是 32 位。 这是 SPI 主站。 PSoC™是接收 4x 32 位(来自 4 个通道)的 SPI 从机,并且 CS 线在整个 128 位中保持低电平。 因此我的问题是,具有 16 个数据的PSoC™ SCB 是否将这 128 位存储为 RX FIFO 缓冲区中的 8 个单独的 uint16_t 数字?

 

3。

>> 所有外设都支持 32 位数据宽度,如果传输源或目标是外设,则源或目标数据宽度必须设置为 32 位。

好吧,我明白了

>> 内存支持 8 位、16 位和 32 位访问。您可以使用较大的数据宽度来提高吞吐量,或使用 较小的数据宽度来量化数据大小。

请澄清这一点。 如果SCB的RX FIFO的数据宽度为16位,并且您在DMA中指定源数据宽度为32位(因为源是外设),那么您是否将RX FIFO缓冲区中的一个值传输到目的地还是两个?我的猜测是,DMA 会将 RX FIFO 中的 16 位值转换为 32 位数字,然后如果目标缓冲区(在我的例子中是PSoC™上的内存)是 uint16_t 类型缓冲区,它将截断 16 个 MSB DMA 投射的零的数量?

>>在本例中,由于传输是在 ADC 和 SPI 之间进行的,即外设到外设,因此必须将数据传输宽度参数设置为字到字。

我认为您很困惑,DMA 不会将数据从 ADC 移动到 SPI RX FIFO,而是 DMA 将数据从 SPI RX FIFO 移动到PSoC™内部存储器分配的缓冲区。

 

非常感谢 Ekta

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-6/Clarification-on-SCB-SPI-and-DMA-Settings/m-p/691223

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @peterq

你说得对,我弄糊涂了。 根据您对问题的描述,我认为 DMA 用于从 ADC 到 SPI(在PSoC™内)的内部传输。 现在我明白,ADC 使用 SPI 与PSoC™交互,必须使用 DMA 将数据从 Rx FIFO 传输到内存位置。

以下是您后续问题的答案:

1. "我看到您的时钟路径是IMO (8 MHz) -> FLL -> CLK_PERI。FLL 的配置是什么?我尝试了以下配置,在数据速率为 16384 时可以正常工作。


IMO (8 MHz) -> FLL (72MHz) ->CLK_HF0(72MHz)-> CLK_PERI (72MHz)
假设现在为 72MHz 的 CLK_PERI 通过时钟"8 位分频器 2" ,然后被选为 SCB 的源。 ModusToolbox™提示我将“8 位分频器 2”的值选择为 5,以便接近实现 SCB 块所需的数据速率。 我可以保存此配置,不会出现任何警告或错误。

Ekta_0-1707815888207.png

2. 是的,如果您选择 SPI 宽度为 16 位并总共发送 8 个 16 位数据,则PSoC™会将传入数据保存为 8 个单独的 16 位数据元素。

参考:SPI FIFO 可配置为 8 位 * 128 或 16 位 *164 两种模式。 我在配置 SPI 模块时观察到的是,SPI 数据宽度和 FIFO 模式上的TLE9243QK_BASE_BOARD会自动调整。 因此,如果将宽度从 4 选为 8,则 FIFO 模式为 8* 128。 如果 SPI 数据宽度为 9 或更大,则 FIFO 宽度为 16 *64。

PSoC™ 6 架构 TRM 的 SPI 部分也提到了这一点。

3.在这种情况下,可以将数据传输宽度设置为字(从 SCB)到半字(在内存中)。

希望这会有所帮助

最好的问候
Ekta

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-6/Clarification-on-SCB-SPI-and-DMA-Settings/m-p/693621

0 点赞