<?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: SPI and DMA in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744655#M45352</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thank you Mark.&lt;/P&gt;&lt;P&gt;Something I failed to understand&lt;/P&gt;&lt;P&gt;1. Why should I add to the data all these flags &lt;SPAN style="font-family: courier new, courier, monospace;"&gt;SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0? (actually this one I understood)&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;2. So I should write TCD_BITER_ELINK0 = 4096 / 4; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCD_CITER_ELINK0 = 4096 / 4 ?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;3. I still failed to find the sources table in reference manual.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;One more question. In my project (unfortunately generated with ProjectExpert) there is no core_cm4.h included and I don't have&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)&lt;BR /&gt;{&lt;BR /&gt;/*&amp;nbsp; NVIC-&amp;gt;ISER[((uint32_t)(IRQn) &amp;gt;&amp;gt; 5)] = (1 &amp;lt;&amp;lt; ((uint32_t)(IRQn) &amp;amp; 0x1F));&amp;nbsp; enable interrupt */&lt;BR /&gt;&amp;nbsp; NVIC-&amp;gt;ISER[(uint32_t)((int32_t)IRQn) &amp;gt;&amp;gt; 5] = (uint32_t)(1 &amp;lt;&amp;lt; ((uint32_t)((int32_t)IRQn) &amp;amp; (uint32_t)0x1F)); /* enable interrupt */&lt;BR /&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;So I try to enable DMA interrupt manually - is it correct NVICISER0 |= (1&amp;lt;&amp;lt;0);?&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sun, 03 Jun 2018 11:51:57 GMT</pubDate>
    <dc:creator>john71</dc:creator>
    <dc:date>2018-06-03T11:51:57Z</dc:date>
    <item>
      <title>SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744653#M45350</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I need to transfer a big block of data (4096 bytes) on SPI using DMA.&lt;/P&gt;&lt;P&gt;I found an example. The example is for K20 and I use K10 but I think the DMA registers are the same.&lt;/P&gt;&lt;P&gt;I have several questions&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void vfnInitDMA_SPITxMstr(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; SIM-&amp;gt;SCGC6 |= SIM_SCGC6_DMAMUX_MASK;&lt;BR /&gt;&amp;nbsp; SIM-&amp;gt;SCGC7 |= SIM_SCGC7_DMA_MASK;&lt;BR /&gt;&amp;nbsp; /**********************************************************************************************************************************/&lt;BR /&gt;&amp;nbsp; /**********************************************************************************************************************************/&lt;BR /&gt;&amp;nbsp; /* Look for the DMA request sources table on your RM for a complete list of available sources */&lt;BR /&gt;&amp;nbsp; DMAMUX-&amp;gt;CHCFG[0] |= DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(17); //SPI0 TX&lt;BR /&gt;&amp;nbsp;&amp;nbsp; /*start the sequence*/&lt;BR /&gt;&amp;nbsp; //DMA_ERQ |= DMA_ERQ_ERQ0_MASK;&lt;BR /&gt;&amp;nbsp; /* This example has no table of data to&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* transfer, making only a single minor loop necessary to complete a major loop&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].SADDR =&amp;nbsp; (uint32_t)&amp;amp;MstrDataSend_Buff;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Source address&lt;BR /&gt;&amp;nbsp; /* Destination address */&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].DADDR = (unsigned long)(&amp;amp;SPI0-&amp;gt;PUSHR); //&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* Source offset disabled */&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].SOFF = 0x04;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* Source and Destination Modulo off, source and destination size 2 = 32 bits */&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* Transfer 4 bytes per transaction */&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].NBYTES_MLNO = 0x04;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* No adjust needed */&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].SLAST = -32;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* Destination offset disabled */&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].DOFF = 0x00;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* No link channel to channel, 1 transaction */&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(8);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* No adjustment to&amp;nbsp;&amp;nbsp; &amp;nbsp;destination address */&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].DLAST_SGA = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(8);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA0-&amp;gt;TCD[0].CSR = DMA_CSR_INTMAJOR_MASK | DMA_CSR_DREQ_MASK;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I didn't find the DMA request sources table - what source corresponds to what module.&lt;BR /&gt;The destination data transfer size - is it total size to transfer? how do I set total size to transfer?&lt;BR /&gt;In the example no CS pin handling. Hwo operates the CS pin?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 03 Jun 2018 06:22:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744653#M45350</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-06-03T06:22:08Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744654#M45351</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Evgeny&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is a reference from the uTasker project:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static const unsigned long ulSPI_TX[8] = {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // fixed SPI transmission (0x01, 0x02,.. 0x08) with CS0 asserted throughout the frame&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x01 | SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x02 | SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x03 | SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x04 | SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x05 | SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x06 | SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x07 | SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x08 | SPI_PUSHR_EOQ&amp;nbsp; | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0), // final byte negates CS after transmission&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;fnConfigDMA_buffer(3, DMAMUX_CHCFG_SOURCE_SPI0_TX, sizeof(ulSPI_TX), ulSPI_TX, (void *)SPI0_PUSHR_ADDR, (DMA_LONG_WORDS | DMA_DIRECTION_OUTPUT | DMA_SINGLE_CYCLE), _spi_tx_dma_Interrupt, SPI_DMA_TX_INT_PRIORITY);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It sends 8 data bytes of 1,2,3,4,5,6,7,8 and asserts the CS0 during the transmission (as controlled by the SPI_PUSHR_CONT and SPI_PUSHR_EOQ flags in each command/data.&lt;BR /&gt;DMA channel is 3 and the SPI Tx trigger is selected by DMAMUX_CHCFG_SOURCE_SPI0_TX, which is 17 (0x11) for K20/K10 (see the DMAMUX section in the user's manual for a list of trigger channel numbers).&lt;BR /&gt;_spi_tx_dma_Interrupt is an optional end of transfer interrupt call-back (otherwise set to 0).&lt;BR /&gt;To your questions:&lt;BR /&gt;- The TCD_NBYTES_ML value matches the number of physical bytes to be transferred, as does TCD_DLASTSGA, but TCD_BITER_ELINK and TCD_CITER_ELINK need to be set to the number of "service requests" (number of physical bytes/4 for long word transfers).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The CS line control is automated in the reference but you could also just set the CS line low (as GPIO) before starting a transmission and set it high again once the transfer has completed [DMA complete interrupt] (assuming it needs to stay low throughout the frame) - the automated method ensures accurate timing since you will need to otherwise wait for the final transfer to physically complete (poll the Tx busy flag) to ensure to not negate it too early.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If in doubt just use the uTasker Open Source project as reference where DMA interfaces are compatible with all processors and types (eg. KL with different DMA controller) and don't need the numbers to be looked up and plugged in. It simulates the DMA operation for simple verification in Visual Studio and then you can copy the values over to complete or improve the reference code that you are using.&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;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;EM style="color: #0000ff;"&gt;uTasker developer and supporter (+5'000 hours experience on +60 Kinetis derivatives in +80 product developments)&lt;/EM&gt;&lt;BR /&gt;&lt;EM style="color: #0000ff;"&gt;&lt;SPAN&gt;Kinetis: &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%2Fkinetis.html" rel="nofollow" target="_blank"&gt;http://www.utasker.com/kinetis.html&lt;/A&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 03 Jun 2018 11:14:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744654#M45351</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2018-06-03T11:14:50Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744655#M45352</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thank you Mark.&lt;/P&gt;&lt;P&gt;Something I failed to understand&lt;/P&gt;&lt;P&gt;1. Why should I add to the data all these flags &lt;SPAN style="font-family: courier new, courier, monospace;"&gt;SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0? (actually this one I understood)&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;2. So I should write TCD_BITER_ELINK0 = 4096 / 4; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCD_CITER_ELINK0 = 4096 / 4 ?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;3. I still failed to find the sources table in reference manual.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;One more question. In my project (unfortunately generated with ProjectExpert) there is no core_cm4.h included and I don't have&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)&lt;BR /&gt;{&lt;BR /&gt;/*&amp;nbsp; NVIC-&amp;gt;ISER[((uint32_t)(IRQn) &amp;gt;&amp;gt; 5)] = (1 &amp;lt;&amp;lt; ((uint32_t)(IRQn) &amp;amp; 0x1F));&amp;nbsp; enable interrupt */&lt;BR /&gt;&amp;nbsp; NVIC-&amp;gt;ISER[(uint32_t)((int32_t)IRQn) &amp;gt;&amp;gt; 5] = (uint32_t)(1 &amp;lt;&amp;lt; ((uint32_t)((int32_t)IRQn) &amp;amp; (uint32_t)0x1F)); /* enable interrupt */&lt;BR /&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new, courier, monospace;"&gt;So I try to enable DMA interrupt manually - is it correct NVICISER0 |= (1&amp;lt;&amp;lt;0);?&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 03 Jun 2018 11:51:57 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744655#M45352</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-06-03T11:51:57Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744656#M45353</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Dear Evgeny,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I just wanted to tell you where to exactly find the DMA MUX sources table, because I also spent a lot of time looking for it everywhere and it was a bit frustrating :smileygrin:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In the reference manual, go to section &lt;STRONG&gt;3.3.9.1 DMA MUX request sources &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;There you will find all 64 DMA MUX sources. The SPI sources are from 16 to 19 for example.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Cheers&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 03 Jun 2018 13:02:33 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744656#M45353</guid>
      <dc:creator>mahmoudsherrah</dc:creator>
      <dc:date>2018-06-03T13:02:33Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744657#M45354</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Dear Mahmoud thank you very much. Finally! :smileyhappy:&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 03 Jun 2018 13:37:43 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744657#M45354</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-06-03T13:37:43Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744658#M45355</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;You're welcome :smileygrin:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It's funny coz somehow I opened up the KL25z reference manual instead of the K10. The section name is the same but number is different. I guess you searched for the name "DMA MUX Request Sources" after you found out it was the wrong section number! Haha&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Anyway,&amp;nbsp;I updated my reply. Cheers!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 03 Jun 2018 13:53:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744658#M45355</guid>
      <dc:creator>mahmoudsherrah</dc:creator>
      <dc:date>2018-06-03T13:53:15Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744659#M45356</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Evgeny&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The interrupt enable will work for for DMA channel 0, but for other channels you need to set &lt;STRONG&gt;(1 &amp;lt;&amp;lt; DMA channel number)&lt;/STRONG&gt;.&lt;BR /&gt;&lt;STRONG&gt;|=&lt;/STRONG&gt; is not entirely correct since it is a set register, where only writing '1' has an effect so you can just do &lt;STRONG&gt;= (1 &amp;lt;&amp;lt; DMA channel number)&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;You &lt;EM&gt;should&lt;/EM&gt; also add a priority to the interrupt too.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;See&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;extern void fnEnterInterrupt(int iInterruptID, unsigned char ucPriority, void (*InterruptFunc)(void));&lt;/STRONG&gt;&lt;BR /&gt;in the uTasker open source project for a reference of how to do it efficiently and simply. It also simulates interrupt operation and peripherals so that you can then test/develop efficiently - you can quickly get everything working and tested and then copy the parts back to improve the more basic library that you are using.&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>Sun, 03 Jun 2018 17:03:43 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744659#M45356</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2018-06-03T17:03:43Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744660#M45357</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thank you Mark.&lt;/P&gt;&lt;P&gt;Couple of issues remaining&lt;/P&gt;&lt;P&gt;I don't have void fnEnterInterrup - so how should I set interrupt priority for DMA channel 0 - NVICIP0 = (1&amp;lt;&amp;lt;0) ?&lt;/P&gt;&lt;P&gt;I don't understand - what register should I set for the data size (4096 bytes)?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 04 Jun 2018 05:14:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744660#M45357</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-06-04T05:14:40Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744661#M45358</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Evgeny&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;NVIC: &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Finfocenter.arm.com%2Fhelp%2Findex.jsp%3Ftopic%3D%2Fcom.arm.doc.ddi0439b%2FCihfihfe.html" rel="nofollow noopener noreferrer" target="_blank"&gt;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/Cihfihfe.html&lt;/A&gt;&lt;BR /&gt;&lt;SPAN&gt;Code from &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=https%3A%2F%2Fgithub.com%2FuTasker%2FuTasker-Kinetis" rel="nofollow noopener noreferrer" target="_blank"&gt;https://github.com/uTasker/uTasker-Kinetis&lt;/A&gt;&lt;BR /&gt;Routine (stripped down to Cortex-M4 only):&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="comment token"&gt;// Function used to enter processor interrupts&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;//&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;extern&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;fnEnterInterrupt&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;int&lt;/SPAN&gt; iInterruptID&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;char&lt;/SPAN&gt; ucPriority&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;InterruptFunc&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;volatile&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;long&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptrIntSet &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; IRQ0_31_SER_ADD&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;volatile&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;char&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptrPriority &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; IRQ0_3_PRIORITY_REGISTER_ADD&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="property macro token"&gt;#if !defined INTERRUPT_VECTORS_IN_FLASH&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; VECTOR_TABLE &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptrVect &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;VECTOR_TABLE &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;VECTOR_TABLE_OFFSET_REG&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;processor_ints&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; processor_ints &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;&amp;amp;&lt;/SPAN&gt;ptrVect&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;processor_interrupts&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// first processor interrupt location in the vector table&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; processor_ints &lt;SPAN class="operator token"&gt;+&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; iInterruptID&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// move the pointer to the location used by this interrupt number&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;processor_ints &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; InterruptFunc&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// enter the interrupt handler into the vector table&lt;/SPAN&gt;
&lt;SPAN class="property macro token"&gt;#endif&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ptrPriority &lt;SPAN class="operator token"&gt;+&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; iInterruptID&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// move to the priority location used by this interrupt&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptrPriority &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;ucPriority &lt;SPAN class="operator token"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt; __NVIC_PRIORITY_SHIFT&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// define the interrupt's priority (16 levels for Cortex-m4 and 4 levels for Cortex-m0+)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ptrIntSet &lt;SPAN class="operator token"&gt;+&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;iInterruptID&lt;SPAN class="operator token"&gt;/&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;32&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// move to the interrupt enable register in which this interrupt is controlled&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptrIntSet &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0x01&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;iInterruptID &lt;SPAN class="operator token"&gt;%&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;32&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// enable the interrupt&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;where __NVIC_PRIORITY_SHIFT is 4 for Cortex-M4.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;TCD_BITER_ELINK and TCD_CITER_ELINK are used for the transfer length.&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>Mon, 04 Jun 2018 09:48:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744661#M45358</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2018-06-04T09:48:28Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744662#M45359</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I still can not get it running.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I configure DMA&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;DMA_SPI_TxMstr();&lt;/P&gt;&lt;P&gt;EnableInterrupts;&lt;/P&gt;&lt;P&gt;NVICISER0 |= (1&amp;lt;&amp;lt;DMA0_IRQn);&lt;/P&gt;&lt;P&gt;set_irq_priority (DMA0_IRQn, 1);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;And I set an interrupt routine&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;void DMA0_isr(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;GPIOB_PCOR = (1&amp;lt;&amp;lt;18);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_active_flag = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA_CINT |= DMA_CINT_CINT(0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(DMA_TCD0_CSR &amp;amp; DMA_CSR_DONE_MASK)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_active_flag = 2;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;SPI2_CS0_ON;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA_CDNE |= DMA_CDNE_CDNE(0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;SPI2_SR&amp;nbsp; |= SPI_SR_EOQF_MASK; //clear EOQF flag&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//SPI0_RSER &amp;amp;= ~SPI_RSER_TFFF_RE_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Stop the request to the DMA&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then I put it in a vectortable&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;(tIsrFunc)&amp;amp; DMA0_isr,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 0x10&amp;nbsp; 0x00000040&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp; ivINT_DMA0_DMA16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unused by PE */&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;And in the code when I want to write a block of data&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;void SPI2_MasterSend_DMA (void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA_ERQ |= DMA_ERQ_ERQ0_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Enable the requests of the channel 0&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;while(!(SPI2_SR &amp;amp; SPI_SR_EOQF_MASK)) {} //wait till the last entry has been transmitted&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;SPI2_SR&amp;nbsp; |= SPI_SR_EOQF_MASK; //clear EOQF flag&lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;I wonder why I should wait in &amp;nbsp;while(!(SPI2_SR &amp;amp; SPI_SR_EOQF_MASK)) {} - what's the point of DMA then? But this is another question.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I set a break point in DMA0_isrt, and I'm not getting there.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 Jun 2018 10:26:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744662#M45359</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-06-11T10:26:21Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744663#M45360</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Evgeny,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The basic idea is to enable interrupt only on DONE signal. The interrupt just clears the DONE bit and disables the DMA channel.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Your send function just needs to setup the source address, the number of bytes to send and then enable the DMA channel.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The DMA will communicate independantly with SPI in the background (no need for polling/while loops) and fire the DONE interrupt once the number of bytes are sent.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Don't forget to enable cycle steal mode since you need a single transfer per trigger, since you&amp;nbsp;are limited by the SPI baudrate (unlike super fast memory to memory transfers for example)&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Could you please refer to my post here? It is discussing DMA UART but I guess it is also applicable to SPI.&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/thread/473418"&gt;FRDM-KL25Z: Bare Metal DMA Basics?&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here I am using DMAMUX to&amp;nbsp;start/stop the transfers. You can use this as a working starting point and then explore your options without DMAMUX.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hope this helps.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 Jun 2018 10:55:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744663#M45360</guid>
      <dc:creator>mahmoudsherrah</dc:creator>
      <dc:date>2018-06-11T10:55:15Z</dc:date>
    </item>
    <item>
      <title>Re: SPI and DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744664#M45361</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thank you.&lt;/P&gt;&lt;P&gt;I have different registers.&lt;/P&gt;&lt;P&gt;The code I represented is official example.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 Jun 2018 14:57:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA/m-p/744664#M45361</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-06-11T14:57:26Z</dc:date>
    </item>
  </channel>
</rss>

