This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220SF:来自 SPI 的基于 DMA 的传输、由计时器触发

Guru**** 2540720 points
Other Parts Discussed in Thread: CC3220SF

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1557973/cc3220sf-dma-based-transfers-from-spi-being-triggered-from-a-timer

器件型号:CC3220SF


工具/软件:

我们有一个外部 ADC、可通过 SPI 提供 32 位数据(2 个背对背 16 位值)。  存在驱动器级延迟、两次采样之间的时间限制为大约 30us。 我们已经了解了几次如何使用计时器触发 SPI 通过 DMA 将数据传输到存储器。 我们还不能弄清这一点。 数据表中的一些详细信息似乎并未完全确定。 有一些“信号“应该能够执行触发、但不清楚如何完全映射设置。 设置的说明中调用了一些详细信息、但随后在寄存器映射详细信息中找不到这些详细信息。  


这可能是不可能的,但希望在我们完全放弃之前与那些有更深刻知识的人核实。  我们当前使用 PWM 来触发 ADC。 这样、我们就可以调整时序、因为在需要采样时需要更改。  使用 DMA 的目标是将数据直接加载到存储器中、然后使用 CPU 周期来检查我们是要保留数据还是跳过数据。 此外、在两次采样之间我们可以降低到大约 5us、这将很有用。 10us 将是可行的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ken:

    我了解您的设置、您正在使用 DMA 将 ADC 值的缓冲区传输到通过 SPI 输入的存储器中、并且您在特定时间通过 PWM 收集这些值、但仅限于在采样下一次采样之前等待 30us?

    我也在尝试弄清楚您使用的计时器;好像您尝试触发 SPI 事务以通过 DMA 将数据传输到存储器中、但我不确定这意味着什么。

    更多的细节和清晰度会有所帮助。

    谢谢你。

    Brandon Liu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ken:

    根据我对系统的了解、您使用的是外部 ADC、它通过 SPI 将数据通信到 CC3220SF、但是您似乎只能在 SPI 事务之间有 30 微秒的间隔、这限制了您可以读取的样本数。  

    我目前仍在调试一项我正在运行的测试、在该测试中、我尝试从另一个 线程中提到的 SYSCFG 设置中获得灵感、更大限度地提高 CC3220SF 上 SPI 事务的吞吐量。  我正在编辑 SPI 控制器示例、其中使用逻辑分析仪探测 MOSI、CLK 和 CSn (EN) 线路、并设置 spiconController.c 文件以从根本上完全忽略外设。 我将比特率更改为最大值 (2e7)、将数据大小更改为 32。 这样在不使用 DMA 的情况下、事务之间的延迟为 11us、如以下屏幕截图所示。 我还研究与 SPI 事务关联的 DMA 通道、以了解是否可以更好地进行优化。

    我希望这对我有所帮助、请随时让我知道您的想法。  

    感谢您的耐心。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是客户提供的更多信息:

    我们将使用:#define Board_PWM0          CC3220SF_LAUNCHXL_PWM6 作为我们的 ADC 启动转换信号。

    目标是使用这个相同的信号触发 SPI/DMA 传输。  我们通读了指南 (DMA/PWM/SPI) 后、我们会发现一些细节、但不是一个完整的画面。

    我们已经阅读了 swru465 中的 DMA(从 114 页开始)和 GP 计时器(从 281 页开始)、我们无法了解的其中一个方面是(从我们的固件开发人员的电子邮件中获得:


    “我还看到对计时器控制寄存器中未在任何位置定义的位的引用。  特别是一个叫 TnOTE 的位。
     SWRU465 的 288 页中引用了该参数。 “  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很清楚、您是需要将 DMA 传输作为 SPI 的一部分、还是为了降低 SPI 事务之间的 30us 延迟而尝试进行的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    理想情况下、DMA 可配置为乒乓、从而释放处理器以对一组 ADC 样本进行一些检查。 如果处理器仅在高速传输中断的情况下进行 ADC 传输、则数据分配的能力将有限。  

     

    最后的配置可能如下所示:

    1. PWM 通过 SPI 触发 DMA 传输到存储器、 每个缓冲区的乒乓缓冲区大小为 32 次传输、ADC 样本为 5us-10us。  
    2. 在每个缓冲区已满时、处理器将检查数据、并在 值不在目标范围内时丢弃 ADC 读数。   
      1. 我们目前将执行两部分 ADC 读数、一个在 30uS、另一个以较慢的速度(由第一组读数的数据定义)。  
      2. 我们希望能够看到数据的更多细节、但不希望将所有数据保存到内存中。 使用 DMA 关断数据传输将释放处理器、从而对收集的数据进行逻辑控制。  
    3. 该过程最长运行 2 秒、最终 ADC 采样计数为 1000 32 位对。  正常运行时间更像是 200ms、但我们还有时间让缓慢的数据收集阶段能够运行 2 秒。  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。 我将在接下来的几天更新您 — 您应该期待我的最新回复是 Next 星期一。 感谢您的耐心。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ken:

    首先介绍与计时器控制寄存器相关的位。 在 TnOTE 中、该位的字母 n 表示计时器、该计时器可以是 A 或 B。您可以在 hw_timer.h 中找到这些位(可在 tnot\source\ti\devices\cc32xx\inc\hw_timer.h 中找到 SDK-INSTALL-DIR)   

    对于 UDMA 寄存器、您可以查找在 hw_udma.h 中定义的偏移(类似于 hw_timer.h)、并在 udma.h 中定义乒乓模式(可在 SDK-INSTALL-DIR \source\ti\devices\cc32xx\driverlib 中找到)。 SPICC32xxDMA.c 驱动程序在基本模式下执行 DMA 事务、因此您将需要使用在 UDMA.h 中定义常量的不同模式 在 UDMA.c 中、有一个在第 715 行定义的函数、称为 uDMAChannelTransferSet(由 SPICC32XXDMA.c 驱动程序用作 MAP_uDMAChannelTransferSet、也在 driverlib 文件夹中定义)、这是 SPICC32XXDMA.c 从它们中派生大量函数调用的地方。  

    请记住使用对 uDMAChannelControlSet 的某种函数调用来为乒乓模式设置主要和备用数据结构。 请随时使用 SPICC32XXDMA.c 驱动程序代码中使用的 MAP 版本。  

    将来、当查找 TRM 中提到的定义不容易找到的信号或位时、VSCode 搜索工具会非常有用。 您可以使用区分大小写的搜索作为筛选器之一。

    希望这对您有所帮助。