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**** 2535750 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 寄存器设置如下:

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

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

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

我在这里出了什么问题?

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

    您好、Simon、

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

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

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

    --

    谢谢、此致、

    Jagadish。

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

    你好 Jagadish

    我设置 G1DMACR 的位2 (G1_BLK_Xfer)。

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

    根据 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 端配置:

        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                   */

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

    您好、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

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

    感谢您的支持!