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.
您好、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
我按照您的建议更改了配置、现在一切都正常。
感谢您的支持!