TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] TMS570LS1224:ADC 生成的 DMA 请求

Guru**** 2048030 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/1165645/tms570ls1224-adc-generated-dma-requests

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

您好、TI 支持

我将 ADC 模块设置为 HET1作为转换触发器-到目前为止工作正常。 现在、我想使用 DMA 将 ADC 结果传输到缓冲器中。

我想为固定数量的转换结果配置 DMA 请求。

为此、我将 G1DMACR 寄存器设置如下:

Fullscreen
1
adcREG1->G1DMACR = (uint32)((uint32)0x18 << 16U) | (uint32)((uint32)1U << 2U);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我的目的是将 G1_blocks 设置为0x18 (24)、以便每24次转换生成一个 DMA 组传输请求。

但是、似乎总是生成一个 DMA 请求8次转换。

我在这里出了什么问题?

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

    您好、Simon、

    我希望您已启用组1 DMA 传输

    我还想知道您如何确认在8次转换后生成 DMA 请求? 它是否基于在 DMA 目标缓冲区中移动的转换值的数量?

    我还需要您所做的 DMA 端配置、如帧计数、元素计数等

    --

    谢谢、此致、

    Jagadish。

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

    你好 Jagadish

    我设置 G1DMACR 的位2 (G1_BLK_Xfer)。

    Fullscreen
    1
    adcREG1->G1DMACR = (uint32)((uint32)0x18 << 16U) | (uint32)((uint32)1U << 2U);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    根据 technical 参考手册:"Group1 Block DMA Transfer Enable。 如果 G1 BLK_Xfer 位设置为1、G1_DMA_EN 位将被忽略、并且每当阈值计数器从计数值1达到0时都会生成 DMA 请求。

    因此、我认为我不需要设置 G1_DMA_EN。

    此外、DMA 传输正常、但每8次转换请求一次传输、而不是每24次转换请求一次传输。

    我在 HalCoGen 中配置了 ADC1-MEMORY、我不需要 EventGroup 和 Group2。

    下面是 DMA 端配置:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    g_dmaCTRLPKT_ADC1.SADD = (uint32)&adcREG1->GxBUF[0].BUF0 + 2; /* source address: EvBuffer1 + 2 Bytes offset */
    g_dmaCTRLPKT_ADC1.DADD = (uint32)&ADC1DataA[0]; /* destination address, start with Buffer A */
    g_dmaCTRLPKT_ADC1.CHCTRL = 0; /* next channel to be chained, 0 = disable chaining */
    g_dmaCTRLPKT_ADC1.FRCNT = 1; /* frame count, number of ADC samples */
    g_dmaCTRLPKT_ADC1.ELCNT = 24; /* element count, number of ADC channels */
    g_dmaCTRLPKT_ADC1.ELDOFFSET = 0; /* element destination offset to be added after each element transfer in number of bytes*/
    g_dmaCTRLPKT_ADC1.ELSOFFSET = 4; /* element source offset to be added after each element transfer in number of bytes */
    g_dmaCTRLPKT_ADC1.FRDOFFSET = 0; /* frame destination offset to be added after the count reaches zero in number of bytes */
    g_dmaCTRLPKT_ADC1.FRSOFFSET = 0; /* frame source offset to be added after the count reaches zero in number of bytes */
    g_dmaCTRLPKT_ADC1.PORTASGN = 4; /* dma port b, always 0x100 for all TMS570 */
    g_dmaCTRLPKT_ADC1.RDSIZE = ACCESS_16_BIT; /* read size ToDo: tbd */
    g_dmaCTRLPKT_ADC1.WRSIZE = ACCESS_16_BIT; /* write size */
    g_dmaCTRLPKT_ADC1.TTYPE = BLOCK_TRANSFER; /* transfer type */
    g_dmaCTRLPKT_ADC1.ADDMODERD = ADDR_OFFSET; /* address mode read */
    g_dmaCTRLPKT_ADC1.ADDMODEWR = ADDR_INC1; /* address mode write */
    g_dmaCTRLPKT_ADC1.AUTOINIT = AUTOINIT_ON; /* autoinit */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    您好、Simon、

    [引用 userid="523548" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1165645/tms570ls1224-adc-generated-dma-requests/4384210 #4384210"]因此,我认为我不需要设置 G1_DMA_EN。

    您是对的、这不是必需的。

    感谢您分享 DMA 配置详细信息、我尝试在我的末尾触发相同的问题、我将尽快为您提供更新。

    --
    谢谢、此致、
    Jagadish。

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

    您好、Simon、

    我了解了问题的根本原因、您在代码中配置的 FIFO 大小是多少?

    由于每8次转换都会发生 DMA 触发器、因此您可能配置了8次、您应该将上述值配置为24、以每24次转换获得 DMA 触发器。

    此外、在 DMA 配置中、您应该进行以下更改

    需要进行上述更改、因为我们从 ADC FIFO 读取、而不是直接从 ADC RAM 读取。  因此、我们不应将读取地址模式指定为偏移量、当我们从 FIFO 读取时、读取地址应固定、 在读取第一个转换值后、第二个转换值将从 RAM 移入 FIFO、因此我们不需要增加读取地址。

    --

    谢谢、此致、

    Jagadish。

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

    尊敬的 Jagadish

    我按照您的建议更改了配置、现在一切都正常。

    感谢您的支持!