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.

[参考译文] LP-MSPM0G3507:使用两个 ADC+DMA 通道时数据损坏

Guru**** 2530100 points
Other Parts Discussed in Thread: MSPM0G3507, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1293871/lp-mspm0g3507-data-corruption-when-using-two-adc-dma-channels

器件型号:LP-MSPM0G3507
主题中讨论的其他器件:MSPM0G3507SysConfig

我已将两个 ADC 设置为分别对单个通道重复采样、两个 ADC 都由相同的事件触发、并且以相同的重复速率重复、以便它们同时运行。 当每个通道的测量都可用时(加载了 MEM0结果)、DMA 通道将被触发、以将值从 MEMRES[0]复制到缓冲器。 两个 DMA 通道的传输大小均设置为34、且 ADC 引脚连接到同一个信号源、因此在此过程结束时、我希望有两个包含相同样本的34字缓冲器(支持噪声)。

我实际上看到的是、其中一个缓冲区的第二个字重复到第三个位置、并且所有值都会发生移位。 缓冲区中的样本如下所示:

缓冲器 B [ 0、1、2、3、4、 5、6、7、8、...、]
缓冲器 A [1、3、3、4、5、 6、7、8、9、...]

如果我将 DMA 通道设置为使用循环优先级、重复字就会切换它出现在哪个缓冲区中。

据我所知,在同一时间没有其他任何事情发生-没有其他 DMA 通道处于活动状态,内核位于 WFI ()上。

我是否应该能够以这种方式同时使用两个 ADC+DMA 通道?是否有办法找出为什么我在缓冲区中得到重复/偏斜的数据?

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

    您好、Alan!

    我已经对此进行了测试、我认为您的 DMA 设置和 ADC 采样时间存在不平衡。 我正在附加我测试过的项目与一些阵列的屏幕截图。 我可能会将其添加为未来 SDK 的代码示例。

    ADC 阵列0

    ADC 阵列1

    我的采样时间为20us、我的输入信号是频率为10kHz 的3V 正弦波。 对于 DMA、我复制了 DMA 乒乓示例中的设置(可在 MSP_subsystem 文件夹 C:\ti\mspm0_sdk_1_20_00_05\examples\nortos\lp_MSPM0G3507\msp_subs\cdma_pong 中找到)

    e2e.ti.com/.../adc_5F00_sim_5F00_dma_5F00_example.zip

    此致、
    卢克

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

    卢克

    感谢示例。  我可以看到、您使用的采样时间比我使用的慢得多、如果我将采样时间稍微增加一点(从每样本300ns 增加到每样本400ns)、我可以看到我的问题似乎消失了。  虽然 SysConfig 允许我使用此配置、但对于预期同时传输到 RAM 缓冲区的数据是否存在速率限制?

    我还看到您使用了 FIFO 模式。  当我尝试在我的示例(和我的时序)中使用您的配置时、我看到偏差和重复较少、但我的两个缓冲区之间的数据仍有一些细微差异、会定期出现。  同样、我是否应该能够以300ns/样本在两个通道上执行同步采样和 DMA 传输到缓冲器?

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

    您好、Alan!

    这种症状确实暗示了一些时序问题、即 DMA 使用 ULPCLK。 如果您将 ULPCLK 从32 MHz 增加到40MHz、这是否会删除双采样?

    你是否在 ADC 中断上得到下溢或上溢错误? (下面的屏幕截图来自  TRM 中 FIFO 模式下的 ADC-DMA/CPU 操作)

    此致、
    卢克

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

    在我的配置中、我已经在40MHz 上使用了 ULPCLK、因此我看到的各种症状都出现在这个时钟速度下。

    我已经调整您的示例以使用40MHz ULPCLK、总采样率为300ns (与此类似、对于两个 ADC 模块):

    当按下 BKPT()时,ADC1报告下溢状况。  如果我让它通过断点运行、也会在两个模块中设置溢出位。

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

    您好、Alan!

    我要等到星期一才能做任何检查、所以我最后不能检查300纳秒。 下溢情况可能是您获得重复样本或0值的原因。 溢出位是由断点引起的。随着 ADC 不断采样、如果你从断点看到溢出、我不会专注于该溢出。 您可以始终启用溢出中断并检查溢出是否独立于断点发生。

    此致、
    卢克

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

    谢谢、如果您在较高的采样率下看到与我相同的数据变化、那将很高兴听到。  由于通告的最大值为4ms/s、我预计能够每250ns 执行一次采样、因此300ns (如果我正确配置了它)看起来应该是可行的。

    我明白为什么溢出会发生在断点之后。  我感到惊讶的是、采样速度更快触发了下溢位。  我将看看我能否调整设置以了解发生这种情况的原因。

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

    您好、Alan!

    我必须对此进行测试、当我将采样时间减小到100ns 以与您的寄存器相匹配时、ADC1出现了溢出错误 (总转换时间为300ns)。发生溢出错误的原因是 ADC 比 DMA 更快、因此为了缓解这种情况、我导致 DMA 更快地触发。 将"启用 DMA 触发器"从 MEM11结果载入中断更改为 MEM9结果载入中断。

    输入信号是0.5V 至2.5V 范围内@100kHz 的正弦波

    此致、
    卢克

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

    效果更好-如您所示、缓冲区中的数据现在符合预期。

    接下来、我们要问一个有关 DMA 操作的问题。  我们保留了配置,以便从 FIFO 执行6次 DMA 读取,由 ADC 填充 MEMRES[9]触发,因此在数据完全可用之前有效地开始流程。  我假设我必须依靠一致的操作来确保在 DMA 读取更早的样本时将更多的样本填充 FIFO -没有任何节流来确保 DMA 将等待 FIFO 中的数据?  或者我应该在每次传输到我的缓冲器后检查欠流和过流位吗?  我可以想象到、对 ADC 采样时序或 DMA 优先级(与其他通道)的微小变化可能会影响 FIFO 的满量。

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

    您好、Alan!

    在我的示例中、DMA 会在第9 MEM 寄存器加载时开始传输、并会运行全部6次传输(利用完整 FIFO)。 如果您总共只进行4次采样(2次 DMA 传输)、那么 DMA 将不会触发传输。 如果总共仅采样10个样本(5个 DMA 传输)、则 DMA 仍会触发、但最后2个样本将触发下溢标志。  

    没错、DMA 优先级和 ADC 采样时序需要在您的设置中进行调整。 在如何设置应用以 提高 DMA 总线和 ADC 采样的效率、时序要求和其他外设的优先级方面需要进行取舍。 ADC 样本和 DMA 触发器之间存在竞态条件、这就是我们需要更早触发的原因。 示例代码固定为在 ADC 上进行连续重复采样、但如果您的应用程序仅对如此多的数据点进行采样、然后转至不同的流程、您可能能够 利用 不同的 DMA 设置。

    我不知道 ADC 样片对您的系统有多重要、但如果它们具有高优先级、则可能需要将 ADC 设置为最高优先级并在整个 FIFO 上使用 DMA 传输。 如果 ADC 的优先级较低、那么您可以使用较小的 DMA 传输取代整个6个 DMA 传输。

    此致、
    卢克