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:由 DMA 触发的 ADC 组转换在几个小时后生成错误的缓冲器值

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

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

器件型号:TMS570LS0914

您好、

一年以来、我们使用 DMA 模块来触发2个 ADC 通道。 到目前为止、它的效果非常好。

两个通道都位于 ADC 组2中、并由组转换触发。

我们在组转换中增加了2个 ADC 通道。 几个小时后、前2个 ADC 通道的数据不正确。 我们遇到了由该数据导致的错误。

当我们添加了一个通过 CAN 发送的附加调试变量时、遗憾的是我们无法使用调试变量重现错误行为。

我们的 ADC 通道:

说明 ADC 通道 ADC 端口 DMA 通道 缓冲器大小 缓冲区类型
ADC_First1 18 A 3. 100 uint16
ADC_First2 20. A 4. 100 uint16
ADC_Additional1 4. A 1 30 uint16
ADC_Additional2 12. A 2. 30 uint16

控制寄存器的配置:ADG2DMACR


下面是我们的配置和函数、我们将如何配置 DMA 数据包。

_________________________________________

我们有两个问题:

1) 1)当我们验证数据并在之后再次激活数据时、停用会产生什么影响? 在添加额外的 ADC 通道之前、我们在验证缓冲区中的数据之前停用了 DMA 通道。

激活:
dmaREG->HWCHENAS
=(uint32) 1U <<通道
停用:
dmaREG->HWCHENAR =(uint32) 1U <<通道

2) 2) ADC_TMS570LS_G2DMACR_GX_Blocks 的影响是什么?
我们有一个软件、其中 ADC_TMS570LS_G2DMACR_GX_Blocks 设置为2。 在现场测试中、尽管我们有4个 ADC 通道、该通道将由 DMA 触发、但该配置更稳定。

 

此致、

Thorben

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

    Thorben、您好!  

     如果未启用 TMS570LS_G2DMACR_GX_Xfer、则不使用 TMS570LS_G2DMACR_GX_BLK_Xfer。  

    您的配置显示每次写入 ADC 组2存储器都会生成 DMA 请求。  

    4个 ADC 通道是否由同一触发源触发? 缓冲器(大小=100和30)的用途是什么?

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

    您好 QJ、

    感谢您的回答。

    作为触发源、我们将用于所有四通道帧传输。

    buffer size 是目的数组的长度。 并且也设置为 frameCount。

    例如
    uint16_t ADC_FIRST[100];
    adcdma_configurateChannel (DestinationAddress =&ADC_First[0]、dmaChannel = 3、Size = 100);

    此致、Thorben

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

    明白了。 4个通道使用一个触发源: ADC 将开始 ADC 通道4、通道12、通道18、通道20的转换。

    在 ADC 配置中, BLK_Xfer 位未设置,因此 ADC 模块将在转换结果写入组结果存储器后立即生成 DMA 请求: 当 ADC 通道4的转换结果写入组结果存储器时、将产生第1个 DMA 请求、 当  ADC 通道14的转换结果写入组结果存储器等时、将产生第2个 DMA 请求。所有4个 DMA 请求都来自相同的 DMA 请求11。  

    如何保证 DMA 通道1、通道2、通道3和通道4按编号顺序触发?

    是否可以启用  BLK_Xfer,以便 为 组结果存储器中的4个转换结果生成 DMA 请求?  

    g2_blocks = 4、g1_blk_xfer=1 -> ADC 模块将在 第4次转换结束时生成 DMA 请求。 在下一组4个转换完成之前、DMA 控制器应完成对4个数据的读取。

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

    您好 QJ、

    感谢您的回复、

    我们还会修改触发源以阻止传输吗?

    dmaCtrl->tType = Block_Transfer

    如果我们这么做、缓冲区中的值会混合。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="508031" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forume/1102375/tms570ls0914-adc-groupconversion 触发的 dma-generate-fault-buffer-values/after -hour-hours/4088255#4088255]来修改源代码块[引用:我们还要修改源代码块吗?]

    否、请为 ADC 组2使用相同的触发源。

    DMA 请求仅在第4次转换结束时生成、您可以继续使用 FRAME_TRANSFM

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

    元素大小应更改为4、元素目标偏移量也应更改为4。

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

    感谢您的参与、我们将尝试一下。

    我们有调试值的结果、并希望与您分享。

    测试56h 后出现问题。 这看起来有点令人困惑、但我想解释一下:
    我们已通过 CAN 发送 ADC_FIRST缓冲 器值。
    在左侧、它看起来像一个容量曲线和一些矩形。 由于我们发送了许多缓冲器、这是我们所期望的行为。

    从中间到右侧、所有缓冲器值几乎相等。 此时、我们确信缓冲器的值已被切换。

    ADC_FIRST_1的值与 ADC_Additional _1的值类似。
    在发送 ADC_Additional _1缓冲区值平均值的 Not Debug 消息中、我们检测到了一条小矩形曲线。 导致这种苯胺的原因,我们确信缓冲器的值已切换。

    ADC_FIRST_1 <--> ADC_Additional _1。

    此致、

    Thorben

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

    我们更改了配置。 当我们增加元件尺寸时、我们得到 MPU 故障、因此我们将其保持为1。
    缓冲区类型和读/写大小设置为32位。
    现在、我们可以读取 AD 转换的通道 ID、并每100ms 通过 CAN 发送一次。
    字节0: 通道18;
    字节1:通道20;
    字节2:通道4;
    字节3:通道12;

    在未定义的时间内、通道 ID 正确、但在跟踪中、我们看到过一段时间后、其中一些 ID 不正确。

    我们不知道为什么会发生这种行为。 我们的下一个尝试是在这种行为开始时重新构建 ADC-DMA 模块。 如果您有更好的想法、请告诉我们。



    此致、

    Thorben

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

    Thorben、您好!

    是否启用  BLK_Xfer 位? 我建议使用一个 DMA 通道来进行块传输。  当4个转换结果被存储到 ADC 存储器中时、DMA 请求被生成。  

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

    我们有 enableerd BLK_Xfer。 好的方面、结果不再是混合的。 不过、过了一段时间后、缓冲器中没有值。

    我们尝试启用块传输完成 IRQ。 现在看起来还可以、测试时间还在延长。

    如果启用了 DMA_G2_END 和 G2_BLK_Xfer,会发生什么情况?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="508031" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forume/1102375/tms570ls0914-adc-groupconversion 触发 dma-generate-fault-buffer-value-after -hours/4112457-g2?如果启用了 eXpense_dma_end?]

    如果 启用了 G2_BLK_Xfer 和 DMA _G2_END、则 DMA 数据传输在最后一个通道的转换结果写入结果存储器时开始。

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

    感谢你的帮助

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

    尊敬的 TI 支持:

    我们认为我们发现主要原因:

    结果似乎交换了、实际上 ADC 结果无效、并且再次触发同一 ADC 通道。 因此、结果的新值不在预期的 ADC 缓冲区中、并且 DMA 将无效值复制到应用缓冲区中。 我们的 FIFO 大小为16、因此如果结果超过4个、DMA 引擎就不会考虑结果。

    感谢您的支持