<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>LPC MicrocontrollersのトピックRe: 20 ADC Chanel0 vakues to Memory, DMA driven?</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/20-ADC-Chanel0-vakues-to-Memory-DMA-driven/m-p/518527#M2726</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by elgarbe on Sun Apr 13 17:50:51 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I think that maybe the previouse value from ADC where correct, so i configure the DMA transfer size to 1000 and I obtain this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
arrRSSI[0]uint32_t3221258592
arrRSSI[1]uint32_t33120
arrRSSI[2]uint32_t33120
arrRSSI[3]uint32_t33120
arrRSSI[4]uint32_t33120
arrRSSI[5]uint32_t33120
arrRSSI[6]uint32_t33120
arrRSSI[7]uint32_t33120
arrRSSI[8]uint32_t33120
arrRSSI[9]uint32_t33120
arrRSSI[10]uint32_t33120
arrRSSI[11]uint32_t33120
arrRSSI[12]uint32_t33120
arrRSSI[13]uint32_t33120
arrRSSI[14]uint32_t33120
arrRSSI[15]uint32_t33120
arrRSSI[16]uint32_t33120
arrRSSI[17]uint32_t33120
arrRSSI[18]uint32_t33120
arrRSSI[19]uint32_t33120
arrRSSI[20]uint32_t33120
arrRSSI[21]uint32_t33120
arrRSSI[22]uint32_t33120
arrRSSI[23]uint32_t33120
arrRSSI[24]uint32_t33120
arrRSSI[25]uint32_t33120
arrRSSI[26]uint32_t33120
arrRSSI[27]uint32_t33120
arrRSSI[28]uint32_t2147516768
arrRSSI[29]uint32_t33120
arrRSSI[30]uint32_t33120
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So, only position 0 and 28 of the array is valid ADC value. Another valid value is on position 63 and 99 and so on.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I think that maybe the way to make it work is with Linked List and scatter and gather, so I change my code to this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;dma.c&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
typedef struct LLI{
uint32_t SourAddr;
uint32_t DestAddr;
struct LLI *nextLLI;
uint32_t&amp;nbsp; Control;
}dmaLLI;

struct LLI adcLLI[4];

extern volatile float adcRSSI;
uint32_t arrRSSI[1000];

void DMAInit(){
adcLLI[0].SourAddr = (uint32_t) &amp;amp;(LPC_ADC-&amp;gt;ADDR0); // ADC Chanel 0
adcLLI[0].DestAddr = (uint32_t) &amp;amp;arrRSSI[2]; // ADC Chanel 0
adcLLI[0].nextLLI = &amp;amp;adcLLI[1];
adcLLI[0].Control =1 // Transferencia de 20 half word
| (0 &amp;lt;&amp;lt; 12) // 1 burst
| (0 &amp;lt;&amp;lt; 15) // 1 burst
| (2 &amp;lt;&amp;lt; 18) // Word width
| (2 &amp;lt;&amp;lt; 21) // Word width
| (0 &amp;lt;&amp;lt; 26 ) // Source no increment.
| (0 &amp;lt;&amp;lt; 27 ) // Destination increment.
| (0 &amp;lt;&amp;lt; 31 );// Enable Terminal Count Interrupt

adcLLI[1].SourAddr = (uint32_t) &amp;amp;(LPC_ADC-&amp;gt;ADDR0); // ADC Chanel 0
adcLLI[1].DestAddr = (uint32_t) &amp;amp;arrRSSI[4]; // ADC Chanel 0
adcLLI[1].nextLLI = 0;
adcLLI[1].Control =1 // Transferencia de 20 half word
| (0 &amp;lt;&amp;lt; 12) // 1 burst
| (0 &amp;lt;&amp;lt; 15) // 1 burst
| (2 &amp;lt;&amp;lt; 18) // Word width
| (2 &amp;lt;&amp;lt; 21) // Word width
| (0 &amp;lt;&amp;lt; 26 ) // Source no increment.
| (0 &amp;lt;&amp;lt; 27 ) // Destination increment.
| (1 &amp;lt;&amp;lt; 31 );// Enable Terminal Count Interrupt

LPC_SC-&amp;gt;PCONP |= 1 &amp;lt;&amp;lt; 29; // Power up DMA

LPC_GPDMACH0-&amp;gt;DMACCConfig = 0; // stop ch0 dma

LPC_GPDMACH0-&amp;gt;DMACCSrcAddr = (uint32_t) &amp;amp;(LPC_ADC-&amp;gt;ADDR0); // ADC Chanel 0
LPC_GPDMACH0-&amp;gt;DMACCDestAddr = (uint32_t) &amp;amp;arrRSSI[0]; // Array
LPC_GPDMACH0-&amp;gt;DMACCControl = 1 // Transferencia de 20 half word
| (0 &amp;lt;&amp;lt; 12) // 1 burst
| (0 &amp;lt;&amp;lt; 15) // 1 burst
| (2 &amp;lt;&amp;lt; 18) // Word width
| (2 &amp;lt;&amp;lt; 21) // Word width
| (0 &amp;lt;&amp;lt; 26 ) // Source no increment.
| (1 &amp;lt;&amp;lt; 27 ) // Destination increment.
| (0 &amp;lt;&amp;lt; 31 );// Enable Terminal Count Interrupt
LPC_GPDMACH0-&amp;gt;DMACCConfig = ( 4 &amp;lt;&amp;lt; 1 )// Set ADC as source DMA request
| ( 2 &amp;lt;&amp;lt; 11 ) // Peripheral to Memory
| ( 1 &amp;lt;&amp;lt; 15 ); // Terminal count interrupt mask. 1 = unmasked
//LPC_GPDMACH0-&amp;gt;DMACCLLI = 0;
LPC_GPDMACH0-&amp;gt;DMACCLLI = (uint32_t)&amp;amp;adcLLI[0];

LPC_GPDMA-&amp;gt;DMACIntErrClr |= 0xff;//Clear all DMA interrupts
LPC_GPDMA-&amp;gt;DMACIntTCClear |= 0xff;
NVIC_EnableIRQ(DMA_IRQn);// Register DMA Interrupt Handler

//LPC_GPDMACH0-&amp;gt;DMACCConfig |= 1; // enable ch0
LPC_GPDMA-&amp;gt;DMACConfig |= 1; // enable DMA
}

void DMA_IRQHandler (void){
uint8_t i;
int adcSuma=0;
for (i=0;i&amp;lt;=ADC_CANT_SAMPLE;i++){
adcSuma += (arrRSSI[0] &amp;gt;&amp;gt; 4) &amp;amp; 0xFFF;
}
adcRSSI = (float)adcSuma / ADC_CANT_SAMPLE;
adcRSSI = adcRSSI * 3.3 / 4096;
LPC_GPDMA-&amp;gt;DMACIntTCClear |= 0xff;
}

void DMACh0_Ena(){
LPC_GPDMACH0-&amp;gt;DMACCConfig |= 1; //enable ch0
}
void DMACh0_Dis(){
LPC_GPDMACH0-&amp;gt;DMACCConfig = 0; // stop ch0 dma
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;As you can see I configure 3 transfer. The first is on DMA Chanel 0 config regiter, the other 2 are on LLI. Take a look at destination address: &amp;amp;arrRSSI[0], &amp;amp;arrRSSI[2] and &amp;amp;arrRSSI[4]. That is to test Scater and gather. So my result is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
arrRSSI[0]uint32_t2147516784
arrRSSI[1]uint32_t0
arrRSSI[2]uint32_t33136
arrRSSI[3]uint32_t0
arrRSSI[4]uint32_t33136
arrRSSI[5]uint32_t0
arrRSSI[6]uint32_t0
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So scater and gather is working ok. But it seems that DMA fires BEFORE ADC conversion finish.... maybe I have to clear Interrupt request from ADC after each transfer... but if it is ok, then I can't transfer several conversion without intervention... I don't like this...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any idea?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 17:34:45 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T17:34:45Z</dc:date>
    <item>
      <title>20 ADC Chanel0 vakues to Memory, DMA driven?</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/20-ADC-Chanel0-vakues-to-Memory-DMA-driven/m-p/518526#M2725</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by elgarbe on Sun Apr 13 08:20:39 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi, I need to continuosly read ADC chanel 0 and transfer the result to an array. I need to make 20 readings befor DMA make an interrupt. So I write this code:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;adc.c&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
void ADCInit(void){
LPC_SC-&amp;gt;PCONP |= (1 &amp;lt;&amp;lt; 12);// Enable CLOCK into ADC controller */

LPC_PINCON-&amp;gt;PINSEL1 &amp;amp;= ~(2&amp;lt;&amp;lt;14);// P0.23 -&amp;gt; AD0.0, function 01
LPC_PINCON-&amp;gt;PINSEL1 |= 1&amp;lt;&amp;lt;14;

LPC_ADC-&amp;gt;ADCR = ( 1 &amp;lt;&amp;lt; 0 ) | // SEL=1,select channel 0 on ADC0
( 4 &amp;lt;&amp;lt; 8 ) |&amp;nbsp; // 100MHz/4 (PCKL_ADC default) = 25MHz / 5 = 5MHz
( 1 &amp;lt;&amp;lt; 16 ) | // BURST = 1, BURST mode, continuos covertion
( 1 &amp;lt;&amp;lt; 21 ) |&amp;nbsp; // PDN = 1, normal operation
( 0 &amp;lt;&amp;lt; 24 ) |&amp;nbsp; // START = 0 A/D conversion stops
( 0 &amp;lt;&amp;lt; 27 );// EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion)
LPC_ADC-&amp;gt;ADINTEN |= 1&amp;lt;&amp;lt;0;// Enable Chanel 0 interrupt request
NVIC_DisableIRQ(ADC_IRQn);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Register ADC Interrupt Handler
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;dma.c&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
void DMAInit(){
LPC_SC-&amp;gt;PCONP |= 1 &amp;lt;&amp;lt; 29; // Power up DMA

LPC_GPDMACH0-&amp;gt;DMACCConfig = 0; // stop ch0 dma

LPC_GPDMACH0-&amp;gt;DMACCSrcAddr = (uint32_t) &amp;amp;(LPC_ADC-&amp;gt;ADDR0); // ADC Chanel 0
LPC_GPDMACH0-&amp;gt;DMACCDestAddr = (uint32_t) &amp;amp;arrRSSI; // Array
LPC_GPDMACH0-&amp;gt;DMACCLLI = 0;
LPC_GPDMACH0-&amp;gt;DMACCControl = ADC_CANT_SAMPLE // Transferencia de 20 word
| (0 &amp;lt;&amp;lt; 12) // 1 burst
| (0 &amp;lt;&amp;lt; 15) // 1 burst
| (2 &amp;lt;&amp;lt; 18) // Word width
| (2&amp;lt;&amp;lt; 21) // Word width
| (0 &amp;lt;&amp;lt; 26 ) // Source no increment.
| (1 &amp;lt;&amp;lt; 27 ) // Destination increment.
| (1 &amp;lt;&amp;lt; 31 );// Enable Terminal Count Interrupt

LPC_GPDMACH0-&amp;gt;DMACCConfig = ( 4 &amp;lt;&amp;lt; 1 )// Set ADC as source DMA request
| ( 2 &amp;lt;&amp;lt; 11 ) // Peripheral to Memory
| ( 1 &amp;lt;&amp;lt; 15 ); // Terminal count interrupt mask. 1 = unmasked

LPC_GPDMA-&amp;gt;DMACIntErrClr |= 0xff;//Clear all DMA interrupts
LPC_GPDMA-&amp;gt;DMACIntTCClear |= 0xff;
NVIC_EnableIRQ(DMA_IRQn);// Register DMA Interrupt Handler

//LPC_GPDMACH0-&amp;gt;DMACCConfig |= 1; // enable ch0
LPC_GPDMA-&amp;gt;DMACConfig |= 1; // enable DMA
}

void DMA_IRQHandler (void){
uint8_t i;
int adcSuma=0;
for (i=0;i&amp;lt;=ADC_CANT_SAMPLE;i++){
adcSuma += (arrRSSI[0] &amp;gt;&amp;gt; 4) &amp;amp; 0xFFF;
}
adcRSSI = (float)adcSuma / ADC_CANT_SAMPLE;
adcRSSI = adcRSSI * 3.3 / 4096;
LPC_GPDMA-&amp;gt;DMACIntTCClear |= 0xff;
}

void DMACh0_Ena(){
LPC_GPDMACH0-&amp;gt;DMACCConfig |= 1; //enable ch0
}
void DMACh0_Dis(){
LPC_GPDMACH0-&amp;gt;DMACCConfig = 0; // stop ch0 dma
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;and main.c&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
#include &amp;lt;cr_section_macros.h&amp;gt;
#include "adc.h"
#include "dma.h"

volatile float adcRSSI;

int main(void) {

DMAInit();
ADCInit();

DMACh0_Ena();

&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;With this code I pause on DMA_IRQ and see what arrRSSI have. I see this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
arrRSSI[0]uint32_t2147516752
arrRSSI[1]uint32_t33104
arrRSSI[2]uint32_t33104
arrRSSI[3]uint32_t33104
arrRSSI[4]uint32_t33104
arrRSSI[5]uint32_t33104
arrRSSI[6]uint32_t33104
arrRSSI[7]uint32_t33104
arrRSSI[8]uint32_t33104
arrRSSI[9]uint32_t33104
arrRSSI[10]uint32_t33104
arrRSSI[11]uint32_t33104
arrRSSI[12]uint32_t33104
arrRSSI[13]uint32_t33104
arrRSSI[14]uint32_t33104
arrRSSI[15]uint32_t33104
arrRSSI[16]uint32_t33104
arrRSSI[17]uint32_t33104
arrRSSI[18]uint32_t33104
arrRSSI[19]uint32_t33104
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;as you can see only first convertion as an 1 on DONE bit so I think the other values are not correct.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So how do I configure DMA chanel to read 20 adc chanel 0 readings after a TC interrupt fire?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 17:34:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/20-ADC-Chanel0-vakues-to-Memory-DMA-driven/m-p/518526#M2725</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T17:34:44Z</dc:date>
    </item>
    <item>
      <title>Re: 20 ADC Chanel0 vakues to Memory, DMA driven?</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/20-ADC-Chanel0-vakues-to-Memory-DMA-driven/m-p/518527#M2726</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by elgarbe on Sun Apr 13 17:50:51 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I think that maybe the previouse value from ADC where correct, so i configure the DMA transfer size to 1000 and I obtain this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
arrRSSI[0]uint32_t3221258592
arrRSSI[1]uint32_t33120
arrRSSI[2]uint32_t33120
arrRSSI[3]uint32_t33120
arrRSSI[4]uint32_t33120
arrRSSI[5]uint32_t33120
arrRSSI[6]uint32_t33120
arrRSSI[7]uint32_t33120
arrRSSI[8]uint32_t33120
arrRSSI[9]uint32_t33120
arrRSSI[10]uint32_t33120
arrRSSI[11]uint32_t33120
arrRSSI[12]uint32_t33120
arrRSSI[13]uint32_t33120
arrRSSI[14]uint32_t33120
arrRSSI[15]uint32_t33120
arrRSSI[16]uint32_t33120
arrRSSI[17]uint32_t33120
arrRSSI[18]uint32_t33120
arrRSSI[19]uint32_t33120
arrRSSI[20]uint32_t33120
arrRSSI[21]uint32_t33120
arrRSSI[22]uint32_t33120
arrRSSI[23]uint32_t33120
arrRSSI[24]uint32_t33120
arrRSSI[25]uint32_t33120
arrRSSI[26]uint32_t33120
arrRSSI[27]uint32_t33120
arrRSSI[28]uint32_t2147516768
arrRSSI[29]uint32_t33120
arrRSSI[30]uint32_t33120
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So, only position 0 and 28 of the array is valid ADC value. Another valid value is on position 63 and 99 and so on.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I think that maybe the way to make it work is with Linked List and scatter and gather, so I change my code to this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;dma.c&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
typedef struct LLI{
uint32_t SourAddr;
uint32_t DestAddr;
struct LLI *nextLLI;
uint32_t&amp;nbsp; Control;
}dmaLLI;

struct LLI adcLLI[4];

extern volatile float adcRSSI;
uint32_t arrRSSI[1000];

void DMAInit(){
adcLLI[0].SourAddr = (uint32_t) &amp;amp;(LPC_ADC-&amp;gt;ADDR0); // ADC Chanel 0
adcLLI[0].DestAddr = (uint32_t) &amp;amp;arrRSSI[2]; // ADC Chanel 0
adcLLI[0].nextLLI = &amp;amp;adcLLI[1];
adcLLI[0].Control =1 // Transferencia de 20 half word
| (0 &amp;lt;&amp;lt; 12) // 1 burst
| (0 &amp;lt;&amp;lt; 15) // 1 burst
| (2 &amp;lt;&amp;lt; 18) // Word width
| (2 &amp;lt;&amp;lt; 21) // Word width
| (0 &amp;lt;&amp;lt; 26 ) // Source no increment.
| (0 &amp;lt;&amp;lt; 27 ) // Destination increment.
| (0 &amp;lt;&amp;lt; 31 );// Enable Terminal Count Interrupt

adcLLI[1].SourAddr = (uint32_t) &amp;amp;(LPC_ADC-&amp;gt;ADDR0); // ADC Chanel 0
adcLLI[1].DestAddr = (uint32_t) &amp;amp;arrRSSI[4]; // ADC Chanel 0
adcLLI[1].nextLLI = 0;
adcLLI[1].Control =1 // Transferencia de 20 half word
| (0 &amp;lt;&amp;lt; 12) // 1 burst
| (0 &amp;lt;&amp;lt; 15) // 1 burst
| (2 &amp;lt;&amp;lt; 18) // Word width
| (2 &amp;lt;&amp;lt; 21) // Word width
| (0 &amp;lt;&amp;lt; 26 ) // Source no increment.
| (0 &amp;lt;&amp;lt; 27 ) // Destination increment.
| (1 &amp;lt;&amp;lt; 31 );// Enable Terminal Count Interrupt

LPC_SC-&amp;gt;PCONP |= 1 &amp;lt;&amp;lt; 29; // Power up DMA

LPC_GPDMACH0-&amp;gt;DMACCConfig = 0; // stop ch0 dma

LPC_GPDMACH0-&amp;gt;DMACCSrcAddr = (uint32_t) &amp;amp;(LPC_ADC-&amp;gt;ADDR0); // ADC Chanel 0
LPC_GPDMACH0-&amp;gt;DMACCDestAddr = (uint32_t) &amp;amp;arrRSSI[0]; // Array
LPC_GPDMACH0-&amp;gt;DMACCControl = 1 // Transferencia de 20 half word
| (0 &amp;lt;&amp;lt; 12) // 1 burst
| (0 &amp;lt;&amp;lt; 15) // 1 burst
| (2 &amp;lt;&amp;lt; 18) // Word width
| (2 &amp;lt;&amp;lt; 21) // Word width
| (0 &amp;lt;&amp;lt; 26 ) // Source no increment.
| (1 &amp;lt;&amp;lt; 27 ) // Destination increment.
| (0 &amp;lt;&amp;lt; 31 );// Enable Terminal Count Interrupt
LPC_GPDMACH0-&amp;gt;DMACCConfig = ( 4 &amp;lt;&amp;lt; 1 )// Set ADC as source DMA request
| ( 2 &amp;lt;&amp;lt; 11 ) // Peripheral to Memory
| ( 1 &amp;lt;&amp;lt; 15 ); // Terminal count interrupt mask. 1 = unmasked
//LPC_GPDMACH0-&amp;gt;DMACCLLI = 0;
LPC_GPDMACH0-&amp;gt;DMACCLLI = (uint32_t)&amp;amp;adcLLI[0];

LPC_GPDMA-&amp;gt;DMACIntErrClr |= 0xff;//Clear all DMA interrupts
LPC_GPDMA-&amp;gt;DMACIntTCClear |= 0xff;
NVIC_EnableIRQ(DMA_IRQn);// Register DMA Interrupt Handler

//LPC_GPDMACH0-&amp;gt;DMACCConfig |= 1; // enable ch0
LPC_GPDMA-&amp;gt;DMACConfig |= 1; // enable DMA
}

void DMA_IRQHandler (void){
uint8_t i;
int adcSuma=0;
for (i=0;i&amp;lt;=ADC_CANT_SAMPLE;i++){
adcSuma += (arrRSSI[0] &amp;gt;&amp;gt; 4) &amp;amp; 0xFFF;
}
adcRSSI = (float)adcSuma / ADC_CANT_SAMPLE;
adcRSSI = adcRSSI * 3.3 / 4096;
LPC_GPDMA-&amp;gt;DMACIntTCClear |= 0xff;
}

void DMACh0_Ena(){
LPC_GPDMACH0-&amp;gt;DMACCConfig |= 1; //enable ch0
}
void DMACh0_Dis(){
LPC_GPDMACH0-&amp;gt;DMACCConfig = 0; // stop ch0 dma
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;As you can see I configure 3 transfer. The first is on DMA Chanel 0 config regiter, the other 2 are on LLI. Take a look at destination address: &amp;amp;arrRSSI[0], &amp;amp;arrRSSI[2] and &amp;amp;arrRSSI[4]. That is to test Scater and gather. So my result is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
arrRSSI[0]uint32_t2147516784
arrRSSI[1]uint32_t0
arrRSSI[2]uint32_t33136
arrRSSI[3]uint32_t0
arrRSSI[4]uint32_t33136
arrRSSI[5]uint32_t0
arrRSSI[6]uint32_t0
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So scater and gather is working ok. But it seems that DMA fires BEFORE ADC conversion finish.... maybe I have to clear Interrupt request from ADC after each transfer... but if it is ok, then I can't transfer several conversion without intervention... I don't like this...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any idea?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 17:34:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/20-ADC-Chanel0-vakues-to-Memory-DMA-driven/m-p/518527#M2726</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T17:34:45Z</dc:date>
    </item>
  </channel>
</rss>

