<?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>topic Re: Memory to DAC using eDMA  (Kinetis K28) in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730766#M44697</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Eldar&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I use the DAC in non-buffered, software triggered mode.&lt;/P&gt;&lt;P&gt;DAC0_C0 = 0xe0;&lt;BR /&gt;DAC0_C1 = 0;&lt;/P&gt;&lt;P&gt;//DAC0_C2 =is default 0x0f;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Each PDB trigger causes a write to the first DAC output as if it were a SW write.&lt;/P&gt;&lt;P&gt;I don't think there are any advantages of buffered modes.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Also I don't think that you want to trigger DMA from the DAC since it will then just copy as fast as it can, and if you choose PDB as DMA channel trigger source it probably is not doing anything anyway.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;I don't use the PDB to trigger the DAC, but instead PDB-&amp;gt;DMA-&amp;gt;DATA0 write in SW mode.&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My full configuration uses the uTasker HAL (where I haven't shown any ADC trigger settings, although they are used also in some configurations - see document for some diagrams) [the interface is also Kineti parts independent so will run also on KL parts with DMA and PDB. Since it is not triggering the DAC by PDB it is also compatible with Kinetis parts that have no PDB if a PIT is used to trigger the DMA channel instead. Most KL parts do however need their RAM buffer modulo 2 aligned to be fully compatible due to a less powerful DMA controller type]:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DAC_SETUP dac_setup;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.int_type = DAC_INTERRUPT;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.int_handler = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // no interrupt used&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.int_priority = 15;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // lowest priority (not used in this case)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.dac_mode = (DAC_CONFIGURE | DAC_REF_VDDA | DAC_NON_BUFFERED_MODE | DAC_FULL_BUFFER_DMA | DAC_ENABLE | DAC_BUFFER_DMA_START); // configure the DAC to use VDDA as reference voltage in non-buffered mode (using DMA)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.int_dac_controller = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // DAC 0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.ucDmaChannel = 7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // use DMA channel 7&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.usDmaTriggerSource = DMAMUX0_CHCFG_SOURCE_PDB;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.ptrDAC_Buffer = (unsigned short *)sADC_buffer;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // DAC transmit buffer to be used&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.ulDAC_buffer_length = sizeof(sADC_buffer);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // physical length of the buffer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;fnConfigureInterrupt((void *)&amp;amp;dac_setup);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // configure DAC&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;PDB_SETUP pdb_setup;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // interrupt configuration parameters&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.int_type = PDB_INTERRUPT;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.int_handler = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // no interrupt&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.int_priority = PRIORITY_PDB;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.pdb_mode = PDB_PERIODIC_DMA;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // use DMA to trigger DAC data writes&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.prescaler = (PDB_PRESCALER_4 | PDB_MUL_1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // pre-scaler values of 1, 2, 4, 8, 16, 32, 64 and 128 are possible (with multipliers of 1, 10, 20 or 40)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.period = PDB_FREQUENCY(4, 1, 8000);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // frequency of PDB cycle is 8kHz&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.int_match = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // PDB interrupt/DMA at the start of the period&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.dac0_delay_0 = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.pdb_trigger = PDB_TRIGGER_SW;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // triggered by software (started immediately)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;fnConfigureInterrupt((void *)&amp;amp;pdb_setup);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // configure PDB interrupt&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 21 Dec 2017 00:53:09 GMT</pubDate>
    <dc:creator>mjbcswitzerland</dc:creator>
    <dc:date>2017-12-21T00:53:09Z</dc:date>
    <item>
      <title>Memory to DAC using eDMA  (Kinetis K28)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730763#M44694</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;I'm using Kinetis K28-FRDM and SDK 2.3. I have a test application where I want to feed the DAC at 500kHz sampling rate using eDMA and PDB modules.&amp;nbsp; The data to be converted is a large pre-stored buffer in RAM. So far, I am able to do so only if&amp;nbsp; I transfer 16 words (size of DAC data registers) at at time, and manually increase the source pointer and setup a new DMA TCD for every 16 words in the eDMA callback (interrupt). But what I would like to achieve is to&amp;nbsp;setup the eDMA, PDB and DAC to convert the entire source buffer without the need handle the eDMA IRQ every 2 x 16 us. It leaves very little time to do anything else. That should be possible or what ?&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If I change this that works :&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;/* DAC_DATL_COUNT&lt;SPAN&gt;&amp;nbsp; = 16 */&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt; EDMA_PrepareTransfer(&amp;amp;m_transferConfig, (void *) (s_dmaBuffer), sizeof(uint16_t), (void *) DAC_DATA_REG_ADDR, sizeof(uint16_t), DAC_DATL_COUNT * sizeof(uint16_t), DAC_DATL_COUNT * sizeof(uint16_t), EDMA_MemoryToMemory );&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;to&lt;/STRONG&gt; :&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;#define &lt;EM&gt;SOURCE_BUFF_SIZE&lt;SPAN&gt;&amp;nbsp;1024*16&lt;/SPAN&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;EDMA_PrepareTransfer(&amp;amp;m_transferConfig, (void *) (s_dmaBuffer),&lt;/EM&gt;&lt;EM&gt;sizeof(uint16_t), (void *) DAC_DATA_REG_ADDR, sizeof(uint16_t),&lt;/EM&gt;&lt;EM&gt;DAC_DATL_COUNT * sizeof(uint16_t),&amp;nbsp;&lt;/EM&gt;&lt;EM&gt;&lt;STRONG&gt;SOURCE_BUFF_SIZE&lt;/STRONG&gt; * sizeof(uint16_t), EDMA_MemoryToMemory );&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;...there is no eDMA interrupt and DAC output is 0 v all the time (major loop &amp;gt; 1)&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;If I change&amp;nbsp;&lt;STRONG&gt;EDMA_MemoryToMemory&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp; to &lt;STRONG&gt;kEDMA_MemoryToPeripheral, &lt;/STRONG&gt;&amp;nbsp;the eDMA interrupts come as expected when the entire source buffer is completed.&amp;nbsp; The source pointer is automatically increased in-between by eDMA,&amp;nbsp; but it seems that only the first DAC data register is converted, the rest (15) are all 0v.&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;SPAN&gt;What did I miss ?&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;Initialization&lt;/EM&gt;&lt;EM&gt;&lt;SPAN&gt;&amp;nbsp;Code :&amp;nbsp;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;&lt;PRE&gt;
void MyGenerator::initDMAMux()
{
 /* Configure DMAMUX */
 DMAMUX_Init(DMAMUX_BASEADDR);
 DMAMUX_SetSource(DMAMUX_BASEADDR, DMA_CHANNEL, DMA_DAC_SOURCE); /* Map ADC source to channel 0 */
 DMAMUX_EnableChannel(DMAMUX_BASEADDR, DMA_CHANNEL);
}

void MyGenerator::initProgrammableDelayBlock()
{

pdb_config_t pdbConfigStruct;
 pdb_dac_trigger_config_t pdbDacTriggerConfigStruct;
 const uint16_t PDB_DAC_INTERVAL_VALUE = 150U; /* delay count (hold time) for each DAC level */

 PDB_GetDefaultConfig (&amp;amp;pdbConfigStruct);
 pdbConfigStruct.prescalerDivider = kPDB_PrescalerDivider1;
 pdbConfigStruct.dividerMultiplicationFactor = kPDB_DividerMultiplicationFactor1;
 pdbConfigStruct.enableContinuousMode = true;
 pdbConfigStruct.triggerInputSource = kPDB_TriggerInput4; /* PIT0 */

PDB_Init(PDB_BASEADDR, &amp;amp;pdbConfigStruct);
#if 0
 PDB_EnableInterrupts(PDB_BASEADDR, kPDB_DelayInterruptEnable);
#endif
 PDB_EnableDMA(PDB_BASEADDR, true);
 PDB_SetModulusValue(PDB_BASEADDR, PDB_MODULUS_VALUE );
 PDB_SetCounterDelayValue(PDB_BASEADDR, PDB_DELAY_VALUE);

/* Set DAC trigger. */
 pdbDacTriggerConfigStruct.enableExternalTriggerInput = false;
 pdbDacTriggerConfigStruct.enableIntervalTrigger = true;
 PDB_SetDACTriggerConfig(PDB_BASEADDR, PDB_DAC_CHANNEL, &amp;amp;pdbDacTriggerConfigStruct);
 PDB_SetDACTriggerIntervalValue(PDB_BASEADDR, PDB_DAC_CHANNEL, PDB_DAC_INTERVAL_VALUE);

/* Load PDB values. */
 PDB_DoLoadValues(PDB_BASEADDR);

}

void MyGenerator::initEDMA()
{
 edma_config_t userConfig;

EDMA_GetDefaultConfig(&amp;amp;userConfig);
 EDMA_Init(DMA0, &amp;amp;userConfig);
 EDMA_CreateHandle(&amp;amp;m_EDMA_Handle, DMA0, DMA_CHANNEL);

EDMA_SetCallback(&amp;amp;m_EDMA_Handle, Edma_Callback, this);

EDMA_PrepareTransfer(&amp;amp;m_transferConfig, (void *) (s_dmaBuffer),
 sizeof(uint16_t), (void *) DAC_DATA_REG_ADDR, sizeof(uint16_t),
 DAC_DATL_COUNT * sizeof(uint16_t),
 SINE_BUFF_SIZE * sizeof(uint16_t), kEDMA_MemoryToPeripheral );


 EDMA_SubmitTransfer(&amp;amp;m_EDMA_Handle, &amp;amp;m_transferConfig);
 /* Enable interrupt when transfer is done. */
 EDMA_EnableChannelInterrupts(DMA0, DMA_CHANNEL,kEDMA_MajorInterruptEnable);

#if defined(FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT) &amp;amp;&amp;amp; FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT
 /* Enable async DMA request. */
 EDMA_EnableAsyncRequest(DMA0, DMA_CHANNEL, true);

#endif /* FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT */

/* Enable transfer. */
 EDMA_StartTransfer(&amp;amp;m_EDMA_Handle);
}

void MyGenerator::initDAC()
{
 dac_config_t dacConfigStruct;
 dac_buffer_config_t dacBufferConfigStruct;

DAC_GetDefaultConfig(&amp;amp;dacConfigStruct);
 DAC_Init(DAC_BASEADDR, &amp;amp;dacConfigStruct);
 DAC_Enable(DAC_BASEADDR, true); /* Enable output. */

/* Configure the DAC buffer. */
 DAC_EnableBuffer(DAC_BASEADDR, true);
 DAC_GetDefaultBufferConfig(&amp;amp;dacBufferConfigStruct);
 dacBufferConfigStruct.triggerMode = kDAC_BufferTriggerByHardwareMode;


 DAC_SetBufferConfig(DAC_BASEADDR, &amp;amp;dacBufferConfigStruct);
 DAC_SetBufferReadPointer(DAC_BASEADDR, 0U); /* Make sure the read pointer to the start. */

/* Enable DMA. */

 DAC_EnableBufferInterrupts(DAC_BASEADDR,kDAC_BufferReadPointerBottomInterruptEnable);
 DAC_EnableBufferDMA(DAC_BASEADDR, true);
}


void MyGenerator::eDMAcallback(edma_handle_t *handle, bool transferDone, uint32_t tcds)
{

/* Clear Edma interrupt flag. */
 EDMA_ClearChannelStatusFlags(DMA0, DMA_CHANNEL, kEDMA_InterruptFlag);

EDMA_PrepareTransfer(&amp;amp;m_transferConfig, (void *) (s_dmaBuffer),
 sizeof(uint16_t), (void *) DAC_DATA_REG_ADDR, sizeof(uint16_t),
 DAC_DATL_COUNT * sizeof(uint16_t),
 SINE_BUFF_SIZE * sizeof(uint16_t), kEDMA_MemoryToPeripheral );

EDMA_SetTransferConfig(DMA0, DMA_CHANNEL, &amp;amp;m_transferConfig, NULL);
 /* Enable transfer. */
 EDMA_StartTransfer(&amp;amp;m_EDMA_Handle);
}


static void Edma_Callback(edma_handle_t *handle, void *userData, bool transferDone, uint32_t tcds)
{
 GPIO_WritePinOutput(BOARD_INITPINS_SIGCodeTime_GPIO, BOARD_INITPINS_SIGCodeTime_GPIO_PIN, 1U);
 (static_cast&amp;lt;MyGenerator*&amp;gt;(userData))-&amp;gt;eDMAcallback(handle, transferDone,tcds);
 GPIO_WritePinOutput(BOARD_INITPINS_SIGCodeTime_GPIO, BOARD_INITPINS_SIGCodeTime_GPIO_PIN, 0U);
}&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 19 Dec 2017 10:35:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730763#M44694</guid>
      <dc:creator>eldarfiring</dc:creator>
      <dc:date>2017-12-19T10:35:37Z</dc:date>
    </item>
    <item>
      <title>Re: Memory to DAC using eDMA  (Kinetis K28)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730764#M44695</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Eldar&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Below I have copied working code from the uTasker project which does PDB triggered DMA transfer from a buffer to the DAC (according to references in &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.utasker.com%2Fdocs%2FuTasker%2FuTaskerADC.pdf%29%3A" rel="nofollow" target="_blank"&gt;http://www.utasker.com/docs/uTasker/uTaskerADC.pdf):&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;x&lt;/STRONG&gt; is DMA channel to be used&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;unsigned short usADC_buffer[y];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // buffer with the samples to be sent&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_SOFF = 2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // source increment (buffer - short words)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_DOFF = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // destination not incremented&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_DLASTSGA = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // no destination displacement on transmit buffer completion&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_SLAST = (-(signed long)(sizeof(usADC_buffer))); // when the buffer has been transmitted set the destination back to the start of it&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_ATTR = (DMA_TCD_ATTR_DSIZE_16 | DMA_TCD_ATTR_SSIZE_16); // transfer sizes words&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_SADDR = (unsigned long)usADC_buffer;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // source buffer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_NBYTES_ML = 2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // each request starts a single transfer of this size&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_CSR = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // free-running mode without any interrupt&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_DADDR = (unsigned long)DAC0_BASE_ADD;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // destination is the DAC data register&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMAx_TCD_BITER_ELINK = DMAx_TCD_CITER_ELINK = (signed short)(sizeof(usADC_buffer)/2); // the number of service requests to be performed each cycle&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;*(unsigned char *)(DMAMUX0_BLOCK + x) = (DMAMUX0_CHCFG_SOURCE_PDB + DMAMUX_CHCFG_ENBL); // DMA trigger source is the PDB&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DMA_ERQ |= (1 &amp;lt;&amp;lt; x);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // enable DMA channel operation&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You should be able to use this to work out where the problem is in the code that you presently have.&lt;BR /&gt;It will continuously send the buffer content (as circular buffer) at the speed set up in the PDB without any CPU intervention. It also continues if the debugger pauses the processor.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 19 Dec 2017 18:21:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730764#M44695</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2017-12-19T18:21:45Z</dc:date>
    </item>
    <item>
      <title>Re: Memory to DAC using eDMA  (Kinetis K28)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730765#M44696</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks a lot your reply Mark !&lt;/P&gt;&lt;P&gt;I did the same setup as you suggested, but with same result as before. So I now think the DMA/TCD part is OK.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If I understand your setup correctly, you are not using DAC data register buffer (DACBFEN=0) and the converted data is always the first word?&amp;nbsp; If I do that, I get no DAC output what so ever.&amp;nbsp; &lt;STRONG&gt;Can I ask you what setup you used for DAC / PDB ?&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If I enable DAC buffers (which I believe is wrong with current TCD setup) I have output like the picture (it's suppose to be a continuous line, but it raises for DAC data register 0, and drops down for DAC data registers 1-15 I guess). That makes sense.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="with_dac_buffer.PNG"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/30301i61F3496C6322030D/image-size/large?v=v2&amp;amp;px=999" role="button" title="with_dac_buffer.PNG" alt="with_dac_buffer.PNG" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For the PDB I am using DAC interval trigger enabled (external disabled).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DAC setup :&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt; DAC0-&amp;gt;C0 = 0xc1; /* enable DAC , vref_2 + buttom flag interrupt enabled. &lt;STRONG&gt;With disabled bottom flag (0xc0) -&amp;gt; No DAC output&lt;/STRONG&gt; */&lt;BR /&gt; DAC0-&amp;gt;C1 = 0x81; /* DNA and DAC buffer enabled.&amp;nbsp;&lt;STRONG&gt; With disabled DAC buffer (0x80)&amp;nbsp; -&amp;gt; No DAC output&lt;/STRONG&gt; */&lt;BR /&gt; DAC0-&amp;gt;C2 = 0x0f;&lt;BR /&gt; DAC0-&amp;gt;SR = 0x0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;DMA TCD setup :&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;/* Clear Edma interrupt flag. */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; DMA0-&amp;gt;CINT = DMA_CHANNEL;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; /* Setup transfer */&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;edma_tcd_t *tcd = (edma_tcd_t *) &amp;amp;DMA0-&amp;gt;TCD[DMA_CHANNEL];&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;tcd-&amp;gt;SOFF = sizeof(uint16_t); // source increment (buffer - short words)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;DOFF = 0U; // destination not incremented&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;DLAST_SGA = 0; // no destination displacement on transmit buffer completion&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;SLAST = (-(signed long)(sizeof(s_dmaBuffer))); // when the buffer has been transmitted set the destination back to the start of it&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;ATTR = DMA_ATTR_SSIZE(kEDMA_TransferSize2Bytes) | DMA_ATTR_DSIZE(kEDMA_TransferSize2Bytes); // transfer sizes words&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;SADDR = (uint32_t)(s_dmaBuffer); // source buffer&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;NBYTES = sizeof(uint16_t); // number of bytes minor loop;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;CSR = 0; // free-running mode without any interrupt&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;DADDR = DAC_DATA_REG_ADDR; // destination is the DAC data register&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;BITER = (signed short)(sizeof(s_dmaBuffer)/2); // the number of service requests to be performed each cycle&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; tcd-&amp;gt;CITER = (signed short)(sizeof(s_dmaBuffer)/2); // the number of service requests to be performed each cycle&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;/* Enable transfer. */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; DMA0-&amp;gt;SERQ = DMA_SERQ_SERQ(DMA_CHANNEL);&lt;/EM&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 20 Dec 2017 12:25:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730765#M44696</guid>
      <dc:creator>eldarfiring</dc:creator>
      <dc:date>2017-12-20T12:25:08Z</dc:date>
    </item>
    <item>
      <title>Re: Memory to DAC using eDMA  (Kinetis K28)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730766#M44697</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Eldar&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I use the DAC in non-buffered, software triggered mode.&lt;/P&gt;&lt;P&gt;DAC0_C0 = 0xe0;&lt;BR /&gt;DAC0_C1 = 0;&lt;/P&gt;&lt;P&gt;//DAC0_C2 =is default 0x0f;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Each PDB trigger causes a write to the first DAC output as if it were a SW write.&lt;/P&gt;&lt;P&gt;I don't think there are any advantages of buffered modes.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Also I don't think that you want to trigger DMA from the DAC since it will then just copy as fast as it can, and if you choose PDB as DMA channel trigger source it probably is not doing anything anyway.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;I don't use the PDB to trigger the DAC, but instead PDB-&amp;gt;DMA-&amp;gt;DATA0 write in SW mode.&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My full configuration uses the uTasker HAL (where I haven't shown any ADC trigger settings, although they are used also in some configurations - see document for some diagrams) [the interface is also Kineti parts independent so will run also on KL parts with DMA and PDB. Since it is not triggering the DAC by PDB it is also compatible with Kinetis parts that have no PDB if a PIT is used to trigger the DMA channel instead. Most KL parts do however need their RAM buffer modulo 2 aligned to be fully compatible due to a less powerful DMA controller type]:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;DAC_SETUP dac_setup;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.int_type = DAC_INTERRUPT;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.int_handler = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // no interrupt used&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.int_priority = 15;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // lowest priority (not used in this case)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.dac_mode = (DAC_CONFIGURE | DAC_REF_VDDA | DAC_NON_BUFFERED_MODE | DAC_FULL_BUFFER_DMA | DAC_ENABLE | DAC_BUFFER_DMA_START); // configure the DAC to use VDDA as reference voltage in non-buffered mode (using DMA)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.int_dac_controller = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // DAC 0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.ucDmaChannel = 7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // use DMA channel 7&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.usDmaTriggerSource = DMAMUX0_CHCFG_SOURCE_PDB;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.ptrDAC_Buffer = (unsigned short *)sADC_buffer;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // DAC transmit buffer to be used&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;dac_setup.ulDAC_buffer_length = sizeof(sADC_buffer);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // physical length of the buffer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;fnConfigureInterrupt((void *)&amp;amp;dac_setup);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // configure DAC&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;PDB_SETUP pdb_setup;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // interrupt configuration parameters&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.int_type = PDB_INTERRUPT;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.int_handler = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // no interrupt&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.int_priority = PRIORITY_PDB;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.pdb_mode = PDB_PERIODIC_DMA;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // use DMA to trigger DAC data writes&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.prescaler = (PDB_PRESCALER_4 | PDB_MUL_1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // pre-scaler values of 1, 2, 4, 8, 16, 32, 64 and 128 are possible (with multipliers of 1, 10, 20 or 40)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.period = PDB_FREQUENCY(4, 1, 8000);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // frequency of PDB cycle is 8kHz&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.int_match = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // PDB interrupt/DMA at the start of the period&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.dac0_delay_0 = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;pdb_setup.pdb_trigger = PDB_TRIGGER_SW;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // triggered by software (started immediately)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace; font-size: 12px;"&gt;fnConfigureInterrupt((void *)&amp;amp;pdb_setup);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // configure PDB interrupt&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 21 Dec 2017 00:53:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730766#M44697</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2017-12-21T00:53:09Z</dc:date>
    </item>
    <item>
      <title>Re: Memory to DAC using eDMA  (Kinetis K28)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730767#M44698</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Mark,&lt;/P&gt;&lt;P&gt;Thank you for your reply! I have now figured it out. As you indicated, I could not use DAC to trigger the DMA (also since DAC buffer mode is disabled).&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Instead I use PIT0 :&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;#define DMA_CHANNEL 0U&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;/* Configure DMAMUX */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; DMAMUX_Init(DMAMUX_BASEADDR);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; DMAMUX_SetSource(DMAMUX_BASEADDR, DMA_CHANNEL, 60 ); /* Map to always enabled source */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; DMAMUX_EnablePeriodTrigger(DMAMUX_BASEADDR,DMA_CHANNEL); /* use periodic trigger mode - DMA Channel 0 - PIT 0 */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; DMAMUX_EnableChannel(DMAMUX_BASEADDR, DMA_CHANNEL);&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm now transferring the memory buffer to DAC at high speed (~1MHz), and it works fine. The CPU has plenty of time to do other stuff.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks again!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Eldar&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 21 Dec 2017 10:35:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730767#M44698</guid>
      <dc:creator>eldarfiring</dc:creator>
      <dc:date>2017-12-21T10:35:31Z</dc:date>
    </item>
    <item>
      <title>Re: Memory to DAC using eDMA  (Kinetis K28)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730768#M44699</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Eldar&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Yes, doing this doesn't require the PDB in particular since it can be done with any timer with DMA trigger capability. The PITs are a bit limited to which DMA channels they can actually trigger on but otherwise a straight-forward method.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 21 Dec 2017 13:25:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Memory-to-DAC-using-eDMA-Kinetis-K28/m-p/730768#M44699</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2017-12-21T13:25:48Z</dc:date>
    </item>
  </channel>
</rss>

