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.

F28M35x关于DMA方式传输AD采集的数据的问题



各位好,使用DMA方式将AD采集的数据传输到指定内存,现在有几个疑问:

1、当AD模块将采集转换完的数据放到结果寄存器中时,是不是需要一个中断来启动DMA的传输呢?还是硬件会去检测结果寄存器中是否已有转换完的数据?如果是需要中断来启动DMA的话是不是会占用CPU的资源,那样的话DMA的意义就不大了?我将触发源理解为中断了,不知道对否?

2、能否实现使用DMA来传输一组数据,而不是每次只传送一个数据?谢谢各位!

  • hongyue,

    1.ADC转换完成之后不用触发CPU中断来启动DMA,直接使用DMA的触发源就可以,如ADCINT1或ADCINT2,你使用使能ADC在采样完成后产生ADCINT1信号,但是只要不使能对应的PIE中断就可以了。这时该ADCINT1信号会输入到DMA模块,触发DMA搬运。你理解触发源应该是ADC的中断信号,但这个中断信号可以给PIE模块,可以给DMA模块,但我们设置PIE模块不接受这个中断,这样就不会影响CPU工作。

    2. 可以,你可以看一下例程和手册,我认为只是配置一些寄存器就可以了。

    Eric

  • Eric,

    非常感谢,

    关于第二个问题小弟已经苦思冥想、绞尽本已不多的脑汁,最后仍是不得而知啊。

    1、若选择ADC1的ADCIN0作为输入信号将其转换后的结果存至ADCRESULT0,转换完后产生ADCINTx去启动DMA转移。这时一个burst就是一个16-bit的字,而这时因transfer最大可设置为32,也就是说32次transfer最多就32个16-bit的数据,然后再由DMA产生中断请求由DSP去处理这一组数据。

    2、将ADCIN0进行五次采样转换,将转换的结果存至ADCRESULT0~5,等这5个结果寄存器中存满后产生ADCINTx信号去启动DMA转移,这5个值算一个burst,若设置数组长度为100,则需要20个transfer,等到数组存满后由DMA向DSP产生一个中断去处理这100个数据,同时DMA去继续转移已经转换完的AD数据。

    不知道我的理解是否正确,还有就是Eric能否帮小弟想想有没有更好的方法,谢谢了!

  • hongyue,

    1, 如果只采样一个ADC通道,只有一个ADCRESULT0,这种情况下,你设置BURST_SIZE =0 (1word/burst), 即只有一个数据,然后TRANSFER_SIZE =32,则DMA会搬32个ADCRESULT0的值,然后就可以触发DMA中断了。所以你的理解是对的。

    2. 这时有五个数据,因为你会配置DMA SR_ADDR = ADCRESULT0的地址,所以BRUST_SIZE = 4(5word/burst),这5个数据算一个burst。至于TRANSFER_SIZE 可以设置20, 然后就会搬移20次采样结果,即会从DST_ADDR开始装100个数据。然后20次转换完,DMA产生中断,去读取这个数据的数据。

    所以你理解正确。

    另外可以看一下http://processors.wiki.ti.com/index.php/C2000_Piccolo_Multi-Day_Workshop   中的Microcontroller Multi-Day Workshop Student Guide (pdf file) 里面有关于DMA的说明。

    Eric

  • 非常感谢!