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.

[参考译文] TMS570LS0914:ADC DMA 的权变措施

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1112871/tms570ls0914-workaround-with-adc-dma

器件型号:TMS570LS0914
主题中讨论的其他器件:HALCOGEN

尊敬的 TI 支持:

此 TT 与其他帖子相关:

简而言之:
当我们使用 DMA 模块时、4个 ADC 转换的结果似乎在一个未定义的时间后交换、实际上 ADC 结果无效、并且同一 ADC 通道再次被触发。 因此、结果的新值不在预期的 ADC 缓冲区中、并且 DMA 将无效值复制到应用缓冲区中。

原始:
https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1102375/tms570ls0914-adc-groupconversion-triggered-by-dma-generates-faulty-buffer-values-after-few-hours/4122409#4122409

为了解决这个问题、我们将 DMA 模块的元素计数设置为8、即使 G2_blocks 仍然为4。
其理念是在触发 DMA 请求后 DMA 将复制所有 ADC->G2BUF[0-7]。
在我们的应用中、我们会丢弃所有无效结果。
使用一个在10 DMA 帧结束时触发的块传输 IRQ (帧计数= 10)、我们测量每个 IRQ 之间的时间。
在一个未定义的时间之后、IRQ 被每2-3ms 而不是每10ms 触发一次。

我们不知道为什么 IRQ 会提前触发。

作为新的权变措施、我们考虑在两个不同的 DMA 请求行(11和17)上使用 ADC 端口 A 和端口 B。 同时、我们将 FIFO 大小从16减小到2或4。

A)您会推荐什么?

b)顺便说一下、如果我们使用大于8的 FIFO 大小、结果存储在哪里? 16是 Halcogen 的默认值、尽管只有8个缓冲寄存器?


我们启用大小为2的 G2_BLK_Xfer。 在我们的应用中、我们检查是否设置了 G2_EMPTY 标志、并且仅在​​该位未设置时复制值。

c) ADC 没有有效数据意味着什么?

d)块传输何时触发 DMA 请求? 如果我们将 G2_BLK_Xfer 设置 为2、是否会在第二次有效或次级测量之后生成请求?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="508031" url="支持/微控制器/基于 ARM 的微控制器组/基于 ARM 的微控制器/f/基于 ARM 的微控制器-forum/1112871/tms570ls0914-workarite-with -adC-dma"])您会推荐什么?

    我的建议是:

    DMA 元素计数= G2_blocks = FIFO 大小

    [~ userid="508031" url="支持/微控制器/基于 ARM 的微控制器组/基于 ARM 的微控制器/f/基于 ARM 的微控制器-forum/1112871/tms570ls0914-workade-wing-da-dma]B)顺便说一下,如果我们使用大于8的 FIFO 大小,结果存储在哪里? 16是 Halcogen 的默认值、尽管只有8个缓冲寄存器?

    如果 FIFO 中转换的数据(缓冲区0 ~缓冲区7)已经被复制到 SRAM 中、新的转换数据将从 FIFO[0]开始写入 FIFO。 如果尚未从 FIFO 中读出数据、新的转换数据将被写入 FIFO[16:8]。

    如果启用了 DMA_EN 和 BLK_Xfer、则应在下一次转换开始前读取数据。

    [~ userid="508031" url="支持/微控制器/基于 ARM 的微控制器组/基于 ARM 的微控制器/f/基于 ARM 的微控制器-forum/1112871/tms570ls0914-workarite-with -adc-dma"]c)有效数据对于 ADC 来说意味着什么?

    有一个硬件机制来保护应用程序不读取 FIFO 中的无效数据。 一旦所有可用的转换结果都被读出 FIFO、 随后的 FIFO 读取会使该机制 通过置位空字段来指示 FIFO 是否为空。

    [~ userid="508031" url="支持/微控制器/基于 ARM 的微控制器组/基于 ARM 的微控制器/f/基于 ARM 的微控制器-forum/1112871/tms570ls0914-workarite-wing-adC-dma"]d)块传输何时触发 DMA 请求? 如果我们将 G2_BLK_Xfer 设置 为2、则在第二次有效或次级测量之后是否会生成请求?

    G2_BLK_Xfer 可编程为0x0或0x1。 2无效。  

    G2_BLK_Xfer = 1 -> ADC 模块在 ADC 已将 G2_blocks 数量的缓冲区写入组2存储器时生成 DMA 请求。

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

    谢谢您、我们将尝试一下。 在 d)中、我们的意思是"如果我们将 G2_blocks 设置为2、[[.]"、但我想它会回答。

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

    我们注意到 、G2_blocks 的值在运行时发生变化。 在 ADC_init 中、它设置为2。
    在应用运行时、我们通过 CAN 发送值、该值在1-8之间变化。

    您有什么想法、为什么会改变?

    _

    编辑:我们可以看到、如果我们设置 GxINTCR = FIFO_SIZE、则 G2_BLOCK_SIZE 也会设置为 FIFO_SIZE。 现在 FIFO 大小设置为2。

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

    HALCOGEN GUI 上的"FIFO 大小"配置该组的中断阈值计数器。 也就是说、在生成该组的阈值中断标志之前、ADC 应该为该组累积多少次转换。 对于单次转换序列、ADC 将始终转换选定的通道数、然后停止。