<?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: Continious DMA with SPI1 TX k22 in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Continious-DMA-with-SPI1-TX-k22/m-p/991248#M55697</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&amp;nbsp; Hi Alexis Andalon,&lt;/P&gt;&lt;P&gt;thanks a lot for your response. I have no processor time to make a 1Mhz interrupt in scatter-gather mode. So I involved channel linking in a way of self-linking.&lt;/P&gt;&lt;P&gt;&amp;nbsp;But the problem for now is(OMG) that SPI _SR TFFF(FIFO is ready to accept data) flag only sets while TCF flag is cleared, so to start transaction i have to write to TCF of SPI 1 after each transaction to clear TCF manually. If&amp;nbsp;SPI _SR TFFF is not setten up there is no DMA hardware request. I have tried to solve that problem by another channel linking(2DMA channel to send data to 1 SPI) but SPI_SR has fields that protected from writing so I got a bus error. If you know how to solve that i will appreciate it a lot.&lt;/P&gt;&lt;P&gt;&amp;nbsp;From my point of view SPI in kinetis is not made to work with DMA gluelessly.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Alexey&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 27 Feb 2020 13:22:28 GMT</pubDate>
    <dc:creator>alexeyusoltsev</dc:creator>
    <dc:date>2020-02-27T13:22:28Z</dc:date>
    <item>
      <title>Continious DMA with SPI1 TX k22</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Continious-DMA-with-SPI1-TX-k22/m-p/991245#M55694</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&amp;nbsp; Hello ,&lt;/P&gt;&lt;P&gt;In my project I send data to DAC through SPI. Also in the project i am using USB. Max samplrate of DAC is 1MHz, so if i use interrupt to load PUSHR of SPI i got stacked with USB.&lt;/P&gt;&lt;P&gt;&amp;nbsp;But there is a good news for me - i need only linear scan, so I can use timer that scans 16bit and DMA to load it to PUSHR. So i set up DMA_CH0 to load PIT_1 value to pushr and triggers on PIT0 each 1us. But the problem is that DMA works only 1 time even if i set up self-linking of the channel.&lt;/P&gt;&lt;P&gt;I can see if i start PUSHR load in the code, after the transmission ends DMA worked once to load PIT1_CVAL. And stops untill i call PUSHR write once again.&lt;/P&gt;&lt;P&gt;My basic pices of code is below:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void ini_dma()&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;const edma_config_t dma_conf={&lt;BR /&gt;//&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.enableContinuousLinkMode=1,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.enableDebugMode=1,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;};&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//DMAMUX SET_Up&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;CLOCK_EnableClock(kCLOCK_Dmamux0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMAMUX_SetSource(DMAMUX0,dma_ch_0,kDmaRequestMux0SPI1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMAMUX_EnableChannel(DMAMUX0,dma_ch_0); //dmamux =1 (PIT_CH0)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMAMUX_EnablePeriodTrigger(DMAMUX0,dma_ch_0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;CLOCK_EnableClock(kCLOCK_Dma0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;EDMA_Init(DMA0, &amp;amp;dma_conf);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;uint16_t abc=32000;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;CR&amp;amp;=~DMA_CR_EMLM(1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].SADDR = (int)&amp;amp;(PIT-&amp;gt;CHANNEL[1].CVAL);&lt;BR /&gt;//&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].SADDR = (int)&amp;amp;(abc);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].SOFF= 0; /* no address shift after each transfer */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].SLAST = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].DADDR = (int)&amp;amp;(SPI1-&amp;gt;PUSHR);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].DOFF= 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].DLAST_SGA= 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].NBYTES_MLNO=2; //2bytes for 16bit PUSHR load&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].CITER_ELINKYES=DMA_CITER_ELINKYES_ELINK(1)|DMA_CITER_ELINKYES_LINKCH(0)|DMA_CITER_ELINKYES_CITER(1);&lt;BR /&gt;//&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].CITER_ELINKNO=1; //single request&lt;BR /&gt;//&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].BITER_ELINKNO=1; //single request&lt;BR /&gt;&amp;nbsp;DMA0-&amp;gt;TCD[0].BITER_ELINKYES=DMA_BITER_ELINKYES_ELINK(1)|DMA_BITER_ELINKYES_LINKCH(0)|DMA_BITER_ELINKYES_BITER(1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].CSR|=DMA_CSR_ESG(0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].ATTR = DMA_ATTR_SSIZE(1)|DMA_ATTR_DSIZE(1)|DMA_ATTR_DMOD(0)|DMA_ATTR_SMOD(0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;ERQ=DMA_ERQ_ERQ0(1); //enable hardware request&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* disable auto close request */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].CSR &amp;amp;=~DMA_CSR_DREQ(1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;EEI=DMA_EEI_EEI0(1);//enable interrupt&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DMA0-&amp;gt;TCD[0].CSR|=DMA_CSR_START(1)|DMA_CSR_INTMAJOR(1);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void ini_pit(){&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;pit_config_t pit_conf;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;uint32_t freq = CLOCK_GetBusClkFreq();&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;pit_conf.enableRunInDebug=0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;CLOCK_EnableClock(kCLOCK_Pit0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PIT_SetTimerPeriod(PIT, kPIT_Chnl_0,freq/1000000 ); //1M freq&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PIT_Init(PIT, &amp;amp;pit_conf);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PIT_StartTimer(PIT, kPIT_Chnl_0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PIT-&amp;gt;CHANNEL[1].LDVAL=PIT_LDVAL_TSV(0xffff);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PIT-&amp;gt;CHANNEL[1].TCTRL|=PIT_TCTRL_CHN(1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PIT-&amp;gt;CHANNEL[1].TCTRL|=PIT_TCTRL_TEN(1)|PIT_TCTRL_TIE(1);&lt;BR /&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Feb 2020 07:56:12 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Continious-DMA-with-SPI1-TX-k22/m-p/991245#M55694</guid>
      <dc:creator>alexeyusoltsev</dc:creator>
      <dc:date>2020-02-20T07:56:12Z</dc:date>
    </item>
    <item>
      <title>Re: Continious DMA with SPI1 TX k22</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Continious-DMA-with-SPI1-TX-k22/m-p/991246#M55695</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I've figured out what causes the problem - TFFF flag after DMA transfers not set up again or wrong time.&lt;/P&gt;&lt;P&gt;So if I set it through debug session - immediately I see next value in the PUSHR(and DAC respectively). But after single transaction TFFF flag goes zero.&lt;/P&gt;&lt;P&gt;&amp;nbsp;My SPI inicialization code is the following:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void spi1_ini(){&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dspi_master_config_t config;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dspi_master_config_t*&amp;nbsp;&amp;nbsp; &amp;nbsp;spi1_config = &amp;amp;config;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dspi_master_ctar_config_t ctar;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctar.baudRate=24000000;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctar.bitsPerFrame=16;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctar.cpha=kDSPI_ClockPhaseFirstEdge;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctar.cpol=kDSPI_ClockPolarityActiveHigh;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctar.direction=kDSPI_MsbFirst;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctar.lastSckToPcsDelayInNanoSec=30;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctar.pcsToSckDelayInNanoSec=10;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;spi1_config-&amp;gt;whichCtar=kDSPI_Ctar0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;spi1_config-&amp;gt;ctarConfig=ctar;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;spi1_config-&amp;gt;whichPcs=kDSPI_Pcs0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;spi1_config-&amp;gt;enableContinuousSCK=0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;spi1_config-&amp;gt;pcsActiveHighOrLow=kDSPI_PcsActiveLow;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//&amp;nbsp;&amp;nbsp; &amp;nbsp;GPIO_PinWrite(GPIOE, DAC_EN, 0); //disables DAC&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;GPIO_PinWrite(GPIOE, DAC_EN, 1); //enables DAC&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;CLOCK_EnableClock(kCLOCK_Spi1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;SIM-&amp;gt;SCGC6|= SIM_SCGC6_SPI1(1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DSPI_MasterInit(SPI1_BASE, spi1_config, 48000000);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;SPI1-&amp;gt;MCR|= SPI_MCR_FRZ(1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;SPI1-&amp;gt;RSER|=SPI_RSER_TFFF_DIRS(1)|SPI_RSER_TFFF_RE(1);//dma request enable&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DSPI_Enable(SPI1, true);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DSPI_MasterWriteData(SPI1, &amp;amp;transfer_cmd, DSPI_DUMMY_DATA);&lt;BR /&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 21 Feb 2020 10:41:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Continious-DMA-with-SPI1-TX-k22/m-p/991246#M55695</guid>
      <dc:creator>alexeyusoltsev</dc:creator>
      <dc:date>2020-02-21T10:41:39Z</dc:date>
    </item>
    <item>
      <title>Re: Continious DMA with SPI1 TX k22</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Continious-DMA-with-SPI1-TX-k22/m-p/991247#M55696</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello &lt;A class="jx-jive-macro-user" href="https://community.nxp.com/people/alexeyusoltsev"&gt;alexeyusoltsev&lt;/A&gt;‌,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Looking at your code I think this is due to you're only setting for 1 cycle&amp;nbsp;so after each transmission you need to start again the transmission. I will suggest checking the example dspi_half_duplex_edma_master and the edma_scatter_gather from the SDK (check the link &lt;A href="https://mcuxpresso.nxp.com/en/select"&gt;here&lt;/A&gt;).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Let me know if this helps you.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Alexis Andalon&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 25 Feb 2020 23:13:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Continious-DMA-with-SPI1-TX-k22/m-p/991247#M55696</guid>
      <dc:creator>Alexis_A</dc:creator>
      <dc:date>2020-02-25T23:13:21Z</dc:date>
    </item>
    <item>
      <title>Re: Continious DMA with SPI1 TX k22</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Continious-DMA-with-SPI1-TX-k22/m-p/991248#M55697</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&amp;nbsp; Hi Alexis Andalon,&lt;/P&gt;&lt;P&gt;thanks a lot for your response. I have no processor time to make a 1Mhz interrupt in scatter-gather mode. So I involved channel linking in a way of self-linking.&lt;/P&gt;&lt;P&gt;&amp;nbsp;But the problem for now is(OMG) that SPI _SR TFFF(FIFO is ready to accept data) flag only sets while TCF flag is cleared, so to start transaction i have to write to TCF of SPI 1 after each transaction to clear TCF manually. If&amp;nbsp;SPI _SR TFFF is not setten up there is no DMA hardware request. I have tried to solve that problem by another channel linking(2DMA channel to send data to 1 SPI) but SPI_SR has fields that protected from writing so I got a bus error. If you know how to solve that i will appreciate it a lot.&lt;/P&gt;&lt;P&gt;&amp;nbsp;From my point of view SPI in kinetis is not made to work with DMA gluelessly.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Alexey&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 27 Feb 2020 13:22:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Continious-DMA-with-SPI1-TX-k22/m-p/991248#M55697</guid>
      <dc:creator>alexeyusoltsev</dc:creator>
      <dc:date>2020-02-27T13:22:28Z</dc:date>
    </item>
  </channel>
</rss>

