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.

[参考译文] TMS570LC4357:硬件触发 ADC + DMA 会导致 ADC 溢出

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1185293/tms570lc4357-hardware-triggering-adc-dma-causes-adc-overrun

器件型号:TMS570LC4357

您好!

我目前正在努力实现以下目标:

  1. 让一些 ADC1通道(在事件组中)由硬件触发。
  2. 使用 DMA 将 ADC 读数从 ADC1的 RAM 传输到 CPU 的 RAM (SRAM)。

我的实施能够实现这些目标。 但是、 在 DMA 完成一次 ADC 读数传输后、ADC1的存储器超限(由 ADEVINTFLG 指示)。

传输的 ADC 读数正确、DMA 的挂起寄存器显示它没有等待处理。

感谢您的帮助!

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

    抱歉、我想补充的是、DMA 直接从 ADC1的结果存储器读取、而不是从其 FIFO 寄存器读取。

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

    我想再次补充一点、如果 CPU 直接从 ADC1的 RAM 中读取、则会发生相同的问题(存储器溢出)。 但是、如果 DMA/CPU 从 ADC1的 FIFO 寄存器中读取数据、问题就会消失。

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

    得到您的问题、稍后将向您提供我的评论。

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

    如果使用 组块 DMA 传输(EV_BLK_Xfer=1)、当 ADC 将 EV_BLOCK 数量的缓冲器写入事件组存储器时、就会生成 DMA 请求。

    在 DMA 数据包配置中、元素大小应等于  EV_BUARTs。 否则、您可能会得到溢出中断。

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

    大家好、QJ Wang

    感谢您的关注和回应!

    我将帧传输用于 DMA 通道、而(dma_ev_end = 1)用于 ADC。

    我是否必须改用块传输(DMA)和 EV_BLK_Xfer?

    以下是我的当前设置:

    DMA:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    dmaChannelAdc1Rx[EventGroup] = DMA_CH26;
    dmaControlAdc1Rx[EventGroup].SADD = adc1SourceAddresses[EventGroup];
    dmaControlAdc1Rx[EventGroup].DADD = (uint32_t)settings->dmaAdc1RxBuffer[EventGroup];
    dmaControlAdc1Rx[EventGroup].CHCTRL = 0U;
    dmaControlAdc1Rx[EventGroup].FRCNT = 1U;
    dmaControlAdc1Rx[EventGroup].ELCNT = settings->dmaAdc1RxBufferSize[EventGroup];
    dmaControlAdc1Rx[EventGroup].ELDOFFSET = 0U;
    dmaControlAdc1Rx[EventGroup].ELSOFFSET = 0U;
    dmaControlAdc1Rx[EventGroup].FRDOFFSET = 0U;
    dmaControlAdc1Rx[EventGroup].FRSOFFSET = 0U;
    dmaControlAdc1Rx[EventGroup].PORTASGN = PORTB_READ_PORTA_WRITE;
    dmaControlAdc1Rx[EventGroup].RDSIZE = ACCESS_32_BIT;
    dmaControlAdc1Rx[EventGroup].WRSIZE = ACCESS_32_BIT;
    dmaControlAdc1Rx[EventGroup].TTYPE = FRAME_TRANSFER;
    dmaControlAdc1Rx[EventGroup].ADDMODERD = ADDR_INC1;
    dmaControlAdc1Rx[EventGroup].ADDMODEWR = ADDR_INC1;
    dmaControlAdc1Rx[EventGroup].AUTOINIT = AUTOINIT_ON;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    ADC:

    Fullscreen
    1
    2
    3
    4
    5
    ADEVDMACR: 0x0000 0008
    ADEVMODECR: 0x0000 0000
    ADEVSRC: EPWM
    ADCLOCKCR, ADEVSAMP, and ADEVSAMPDISEN are all set.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    我尝试了以下设置。 仍然出现内存溢出问题。

    DMA:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    dmaChannelAdc1Rx[EventGroup] = DMA_CH26;
    dmaControlAdc1Rx[EventGroup].SADD = adc1SourceAddresses[EventGroup];
    dmaControlAdc1Rx[EventGroup].DADD = (uint32_t)settings->dmaAdc1RxBuffer[EventGroup];
    dmaControlAdc1Rx[EventGroup].CHCTRL = 0U;
    dmaControlAdc1Rx[EventGroup].FRCNT = 1U;
    dmaControlAdc1Rx[EventGroup].ELCNT = settings->dmaAdc1RxBufferSize[EventGroup];
    dmaControlAdc1Rx[EventGroup].ELDOFFSET = 0U;
    dmaControlAdc1Rx[EventGroup].ELSOFFSET = 0U;
    dmaControlAdc1Rx[EventGroup].FRDOFFSET = 0U;
    dmaControlAdc1Rx[EventGroup].FRSOFFSET = 0U;
    dmaControlAdc1Rx[EventGroup].PORTASGN = PORTB_READ_PORTA_WRITE;
    dmaControlAdc1Rx[EventGroup].RDSIZE = ACCESS_32_BIT;
    dmaControlAdc1Rx[EventGroup].WRSIZE = ACCESS_32_BIT;
    dmaControlAdc1Rx[EventGroup].TTYPE = BLOCK_TRANSFER;
    dmaControlAdc1Rx[EventGroup].ADDMODERD = ADDR_INC1;
    dmaControlAdc1Rx[EventGroup].ADDMODEWR = ADDR_INC1;
    dmaControlAdc1Rx[EventGroup].AUTOINIT = AUTOINIT_ON;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    ADC:

    Fullscreen
    1
    2
    3
    4
    5
    ADEVDMACR: 0x0002 0004
    ADEVMODECR: 0x0000 0000
    ADEVSRC: EPWM
    ADCLOCKCR, ADEVSAMP, and ADEVSAMPDISEN are all set.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    遗憾的是、我无法显示更多代码。 是否有任何寄存器或指示可 供我进一步查找  、以找出根本原因?

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

    如果 EV_BLK_Xfer=0、 如果 EV_DMA_EN 被置位、ADC 模块为每次到事件存储器的写入生成一个 DMA 请求。
    如果 EV_BLK_Xfer=1、 ADC 模块在 ADC 已将 EV_BLOCK 数量的缓冲器写入事件存储器中时生成一个 DMA 请求。

    DMA 数据包的元素大小应与 EV_BUARTs 相同。

    在下一组2次转换完成之前、DMA 控制器应完成读取2个数据(配置中的 EV_BLOCK_2)。

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

    此帖子的状态更新:

    我已经尝试 过帖子中推荐的修复程序、 但它们对我不起作用。 (这并不能使这些建议事实上是正确的。)

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

    我们怀疑此问题可能是由触发 ADC 模块的方式引起的。

    我们决定不使用带有 DMA 的 ADC、因此这篇文章可能没有分辨率。

    编辑:语法