<?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>S32KのトピックRe: S32K144 DMA modulo</title>
    <link>https://community.nxp.com/t5/S32K/S32K144-DMA-modulo/m-p/975361#M5571</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Daniel,&lt;/P&gt;&lt;P&gt;Thanks for your response. Today I found some race condition in my firmware which cause problem. I resolved this and everything works fine, theres no problem with DMA.&lt;/P&gt;&lt;P&gt;I want to have 1 minor loop(8 bytes) for&amp;nbsp;each edge that is detected and trigger DMA interrupt after major loop. Source and destination addresses are offset and source address is change after each major loop(-8 bytes) but destination address is limited by modulo. This solution give me circular buffer for values from CnSC and CnVal registers. I achieved this with configuration from my first message.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BR, Arkadyosh&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 21 Nov 2019 10:09:28 GMT</pubDate>
    <dc:creator>arkadyosh</dc:creator>
    <dc:date>2019-11-21T10:09:28Z</dc:date>
    <item>
      <title>S32K144 DMA modulo</title>
      <link>https://community.nxp.com/t5/S32K/S32K144-DMA-modulo/m-p/975359#M5569</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;BR /&gt;I have problem with DMA and FTM. I used this combination to catch data from FTM registers to struct when signal on input pin changed(falling and rising edge). From time to time, very rarely, I have situation when I get interrupt from DMA but no data inside struct which is destination of DMA transfer. I cant't find scenario to reproduce it in release, but in debug mode with connected JLink when I pause the code,&amp;nbsp;when signal on input pin is still changing, and resume it, problem arrives. DMA destination configured with modulo option. When I used configuration without circular buffer(modulo for destination) I can stop and pause code as many times as I want and this never happened.&lt;/P&gt;&lt;P&gt;Below some sample code. Any solution where is the problem?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define CHANNELS_NO (8)&lt;/P&gt;&lt;P&gt;#define DMA_EDGE_MAX_COUNT (4)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;typedef struct&lt;BR /&gt;{&lt;/P&gt;&lt;P&gt;struct&lt;BR /&gt; {&lt;BR /&gt; uint32_t cnsc;&lt;BR /&gt; uint32_t cnv;&lt;BR /&gt; }values[DMA_EDGE_MAX_COUNT ];&lt;BR /&gt;}str_data_ctrl;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;volatile str_data_ctrl data_ctrl[CHANNELS_NO] __attribute__((aligned(32)));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void test_Init(void)&lt;BR /&gt;{&lt;/P&gt;&lt;P&gt;PORTC-&amp;gt;PCR[15] &amp;amp;= ~PORT_PCR_MUX_MASK;&lt;BR /&gt;PORTC-&amp;gt;PCR[15] |= PORT_PCR_MUX(2); // FTM1 CH3&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// DMA configuration&lt;/P&gt;&lt;P&gt;DMAMUX-&amp;gt;CHCFG[2] = 0;&lt;BR /&gt;DMAMUX-&amp;gt;CHCFG[2] |= DMAMUX_CHCFG_SOURCE(EDMA_REQ_FTM1_CHANNEL_3);&lt;/P&gt;&lt;P&gt;DMAMUX-&amp;gt;CHCFG[2] |= DMAMUX_CHCFG_ENBL_MASK;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;DMA-&amp;gt;TCD[2].SADDR = DMA_TCD_SADDR_SADDR(&amp;amp;(FTM1-&amp;gt;CONTROLS[3].CnSC));&lt;BR /&gt;DMA-&amp;gt;TCD[2].SOFF = DMA_TCD_SOFF_SOFF(1); // Src addr add x byte after transfer&lt;BR /&gt;DMA-&amp;gt;TCD[2].ATTR = DMA_TCD_ATTR_SMOD(0) | // Src modulo feature not used&lt;BR /&gt; DMA_TCD_ATTR_SSIZE(0) | // Src read 8bit&lt;BR /&gt; DMA_TCD_ATTR_DMOD(5) | // Dest modulo feature not used&lt;BR /&gt; DMA_TCD_ATTR_DSIZE(0); // Dest 8bit&lt;BR /&gt;DMA-&amp;gt;TCD[2].NBYTES.MLNO = DMA_TCD_NBYTES_MLNO_NBYTES(8); // Transfer N byte /minor loop&lt;BR /&gt;DMA-&amp;gt;TCD[2].SLAST = DMA_TCD_SLAST_SLAST(-8); // Src addr change after major loop&lt;BR /&gt;DMA-&amp;gt;TCD[2].DADDR = DMA_TCD_DADDR_DADDR(&amp;amp;data_ctrl[2].values[0].cnsc);// Dest.&lt;BR /&gt;DMA-&amp;gt;TCD[2].DOFF = DMA_TCD_DOFF_DOFF(1); // dest adr offset after transfer&lt;BR /&gt;DMA-&amp;gt;TCD[2].CITER.ELINKNO = DMA_TCD_CITER_ELINKNO_CITER(1) | // n minor loop iterations&lt;BR /&gt; DMA_TCD_CITER_ELINKNO_ELINK(0); // No minor loop chan link&lt;BR /&gt;DMA-&amp;gt;TCD[2].DLASTSGA = DMA_TCD_DLASTSGA_DLASTSGA(0); // dest chg after major loop&lt;BR /&gt;DMA-&amp;gt;TCD[2].CSR = DMA_TCD_CSR_START(0) | // Clear START status flag&lt;BR /&gt; DMA_TCD_CSR_INTMAJOR(1) | // IRQ after major loop&lt;BR /&gt; DMA_TCD_CSR_INTHALF(0) | // No IRQ after 1/2 major loop&lt;BR /&gt; DMA_TCD_CSR_DREQ(0) | // Disable chan after major loop&lt;BR /&gt; DMA_TCD_CSR_ESG(0) | // Disable Scatter Gather&lt;BR /&gt; DMA_TCD_CSR_MAJORELINK(0) | // No major loop chan link&lt;BR /&gt; DMA_TCD_CSR_ACTIVE(0) | // Clear ACTIVE status flag&lt;BR /&gt; DMA_TCD_CSR_DONE(0) | // Clear DONE status flag&lt;BR /&gt; DMA_TCD_CSR_MAJORLINKCH(0) | // Chan # if major loop ch link&lt;BR /&gt; DMA_TCD_CSR_BWC(0); // No eDMA stalls after R/W&lt;BR /&gt; &lt;BR /&gt;DMA-&amp;gt;TCD[2].BITER.ELINKNO = DMA_TCD_BITER_ELINKNO_BITER(1) | // Initial iteration count&lt;BR /&gt; DMA_TCD_BITER_ELINKNO_ELINK(0); // No minor loop chan link&lt;/P&gt;&lt;P&gt;DMA-&amp;gt;SERQ = DMA_SERQ_SERQ(2); // start dma&lt;BR /&gt;DMA-&amp;gt;SEEI = DMA_SEEI_SEEI(2); // enable error interrupt for channel&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;INT_SYS_ClearPending(DMA0_IRQn + 2);&lt;BR /&gt;INT_SYS_EnableIRQ(DMA0_IRQn + 2);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// TIMER configuration&lt;/P&gt;&lt;P&gt;FTM1-&amp;gt;MODE |= FTM_MODE_WPDIS_MASK; // disable wr protect&lt;/P&gt;&lt;P&gt;FTM1-&amp;gt;MODE &amp;amp;= ~FTM_MODE_FTMEN_MASK; // disable FTM&lt;/P&gt;&lt;P&gt;FTM1-&amp;gt;SYNC |= FTM_SYNC_SYNCHOM_MASK; // mask channels outputs&lt;/P&gt;&lt;P&gt;FTM1-&amp;gt;MOD = 0xFFFF;&lt;/P&gt;&lt;P&gt;FTM1-&amp;gt;CNTIN = 0;&lt;/P&gt;&lt;P&gt;FTM1-&amp;gt;CONTROLS[3].CnSC = FTM_CnSC_CHIE(1) | // channel interrupt enable FTM_CnSC_DMA_MASK | // DMA FTM_CnSC_MSB(0) | // mode select&lt;/P&gt;&lt;P&gt;FTM_CnSC_MSA(0) | // mode select&lt;/P&gt;&lt;P&gt;FTM_CnSC_ELSB(1) | // edge/level select&lt;/P&gt;&lt;P&gt;FTM_CnSC_ELSA(1);// edge/level select&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;FTM1-&amp;gt;CONTROLS[3].CnV = 0;&lt;/P&gt;&lt;P&gt;FTM1-&amp;gt;CNT = 0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;FTM1-&amp;gt;SYNC &amp;amp;= ~FTM_SYNC_SYNCHOM_MASK; // mask channels outputs&lt;BR /&gt;FTM1-&amp;gt;MODE |= FTM_MODE_FTMEN_MASK | FTM_MODE_FAULTM(2) | FTM_MODE_FAULTIE_MASK;&lt;BR /&gt;FTM1-&amp;gt;SC = FTM_SC_TOIE(1) | // overflow interrupt enable&lt;BR /&gt; FTM_SC_PS(3); // prescaler = 8&lt;BR /&gt;FTM1-&amp;gt;SC |= FTM_SC_CLKS(3);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;INT_SYS_ClearPending(FTM1_Fault_IRQn);&lt;BR /&gt;INT_SYS_EnableIRQ(FTM1_Fault_IRQn);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;INT_SYS_ClearPending(FTM1_Ch2_Ch3_IRQn);&lt;/P&gt;&lt;P&gt;INT_SYS_EnableIRQ(FTM1_Ch2_Ch3_IRQn);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void DMA2_IRQHandler(void)&lt;BR /&gt;{&lt;BR /&gt; DMA-&amp;gt;CINT = DMA_CINT_CINT(2); // clear int.&lt;BR /&gt; &lt;BR /&gt; int cnsc_cnt = 0;&lt;BR /&gt; int cnt = 0;&lt;BR /&gt; while(cnt &amp;lt; DMA_EDGE_MAX_COUNT )&lt;BR /&gt; {&lt;BR /&gt; if( data_ctrl[2].values[cnt].cnsc &amp;gt; 0)&lt;BR /&gt; {&lt;BR /&gt; cnsc_cnt++;&lt;BR /&gt; if( (data_ctrl[2].values[cnt].cnsc &amp;amp; FTM_CnSC_CHIS_MASK) != FTM_CnSC_CHIS_MASK) // falling edge&lt;BR /&gt; {&lt;BR /&gt; // do something&lt;BR /&gt; }&lt;BR /&gt; else // rising edge&lt;BR /&gt; {&lt;BR /&gt; // do something&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; data_ctrl[2].values[cnt].cnsc = 0;&lt;BR /&gt; data_ctrl[2].values[cnt].cnv = 0;&lt;BR /&gt; cnt++;&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt; if(cnsc_cnt == 0)&lt;BR /&gt; PIN_TOGGLE; // this should never happen&lt;BR /&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 12 Nov 2019 09:52:19 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/S32K144-DMA-modulo/m-p/975359#M5569</guid>
      <dc:creator>arkadyosh</dc:creator>
      <dc:date>2019-11-12T09:52:19Z</dc:date>
    </item>
    <item>
      <title>Re: S32K144 DMA modulo</title>
      <link>https://community.nxp.com/t5/S32K/S32K144-DMA-modulo/m-p/975360#M5570</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello&amp;nbsp;&lt;A class="jx-jive-macro-user" href="https://community.nxp.com/people/arkadyosh"&gt;arkadyosh&lt;/A&gt;,&lt;/P&gt;&lt;P&gt;Sorry for the delayed response.&lt;/P&gt;&lt;P&gt;If I understand, you want to have 4 minor loops (8bytes) for each edge that is detected and trigger DMA interrupt on the major loop complete only. The destination address would be offset after each minor loop whereas the source address would stay the same.&lt;/P&gt;&lt;P&gt;But I don't understand how you want to achieve that with the DMA configuration you posted.&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You have:&amp;nbsp;CITER(1) one minor cycle,&amp;nbsp;SMOD(0) without source modulo,&amp;nbsp;DMOD(5) destination modulo,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It could be possible with this configuration:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DMA_TCD_ATTR_SMOD(3)&lt;/P&gt;&lt;P&gt;DMA_TCD_ATTR_SSIZE(2)&amp;nbsp;&lt;BR /&gt; DMA_TCD_ATTR_DMOD(0)&amp;nbsp;&lt;BR /&gt; DMA_TCD_ATTR_DSIZE(2)&amp;nbsp;&lt;/P&gt;&lt;P&gt;DMA_TCD_SOFF_SOFF(4);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;BR /&gt;DMA_TCD_SLAST_SLAST(0);&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;DMA_TCD_DOFF_DOFF(4);&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;DMA_TCD_DLASTSGA_DLASTSGA(-32);&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;DMA_TCD_NBYTES_MLNO_NBYTES(8);&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;BR /&gt;DMA_TCD_CITER_ELINKNO_CITER(4);&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;BR /&gt;DMA_TCD_BITER_ELINKNO_BITER(4);&amp;nbsp;&lt;/P&gt;&lt;P&gt;DMA_TCD_CSR_INTMAJOR(1);&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Where the modulo (8 bytes) is used on the source address.&lt;/P&gt;&lt;P&gt;The problem is that FTM1-&amp;gt;CONTROLS[3].CnSC address is not aligned (0x40039024).&lt;/P&gt;&lt;P&gt;So, SMOD(3) = 8 bytes is not possible.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I think you could aligned the source address to&amp;nbsp;0x40039020 and read 16bytes per a minor loop with SMOD(4) 16bytes modulo.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BR, Daniel&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 20 Nov 2019 14:51:19 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/S32K144-DMA-modulo/m-p/975360#M5570</guid>
      <dc:creator>danielmartynek</dc:creator>
      <dc:date>2019-11-20T14:51:19Z</dc:date>
    </item>
    <item>
      <title>Re: S32K144 DMA modulo</title>
      <link>https://community.nxp.com/t5/S32K/S32K144-DMA-modulo/m-p/975361#M5571</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Daniel,&lt;/P&gt;&lt;P&gt;Thanks for your response. Today I found some race condition in my firmware which cause problem. I resolved this and everything works fine, theres no problem with DMA.&lt;/P&gt;&lt;P&gt;I want to have 1 minor loop(8 bytes) for&amp;nbsp;each edge that is detected and trigger DMA interrupt after major loop. Source and destination addresses are offset and source address is change after each major loop(-8 bytes) but destination address is limited by modulo. This solution give me circular buffer for values from CnSC and CnVal registers. I achieved this with configuration from my first message.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BR, Arkadyosh&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 21 Nov 2019 10:09:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/S32K144-DMA-modulo/m-p/975361#M5571</guid>
      <dc:creator>arkadyosh</dc:creator>
      <dc:date>2019-11-21T10:09:28Z</dc:date>
    </item>
  </channel>
</rss>

