<?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: K64 - I2S + DMA in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-I2S-DMA/m-p/559894#M33813</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Found my issue -- solved.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 02 Aug 2016 14:51:34 GMT</pubDate>
    <dc:creator>JHinkle</dc:creator>
    <dc:date>2016-08-02T14:51:34Z</dc:date>
    <item>
      <title>K64 - I2S + DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-I2S-DMA/m-p/559892#M33811</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I need some help.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My I2S appears to be partly working and I can't figure out what wrong.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have a custom K64 board that I2S is driving a TI audio chip.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have read and studied AN4369, AN4520, AN4800, and the code associated with AN4369.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My K64 is running at 120 mhz.&amp;nbsp; I have 2 audio buffers that hold 1024 (L and R) 16 bit audio values.&amp;nbsp; I have DMA set to load 4 bytes every load sequence and request an interrupt every 1024 events.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For the test, I am using a sample rate of 8000 hz and a MCLK of 12.288 Mhz.&amp;nbsp; Given I want a frame size of 2 words (4 bytes) - my bit rate is 256000 hz.&amp;nbsp; I have verified the bit freq and the MCLK freq with the logic probe capture shown below.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I instrumented my DMA IRQ to toggle an output to show when my DMA interrupts are occurring ... last logic line on image below.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="I2S.png"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/939iA6ADD60348983B48/image-size/large?v=v2&amp;amp;px=999" role="button" title="I2S.png" alt="I2S.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is my code ..&amp;nbsp; I hate posting code ... but I can't see my problem&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;code&amp;gt;&lt;/P&gt;&lt;P&gt;void Set_Dma_Mux( void )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK ;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; DMAMUX_CHCFG0 = 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; // disable the channel to configure it&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="line-height: 1.73;"&gt;&amp;nbsp; DMAMUX_CHCFG0 = DMAMUX_CHCFG_SOURCE(13) ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //I2S0 Transmit&amp;nbsp; .. page 95&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMAMUX_CHCFG0 |= DMAMUX_CHCFG_ENBL_MASK ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // enable the mux&lt;/P&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;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void Init_Audio_DMA(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;SPAN style="line-height: 1.73;"&gt;&amp;nbsp; // setup the DMA channels ( CH0 = playback&amp;nbsp; )&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_CR = 0 | DMA_CR_EDBG_MASK; // Stall DMA transfers when debugger is halted (avoid noise)&amp;nbsp; // no minor loop mapping&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_DCHPRI15 = 0;&amp;nbsp;&amp;nbsp; // DMA Errors as reset makes priority value equal to chan# -- so make chan 15 priority 0 --- now all unique&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_DCHPRI0 = 15;&amp;nbsp; // cannot be pre-empeted, can pre-empt, highest priority&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // fill the TCD area&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_SADDR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (dword)Audio1 ; // alternated with Audio_Source_Blk_B&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_SOFF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 4;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 2 words offset&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_ATTR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = DMA_ATTR_SMOD(0) | DMA_ATTR_SSIZE(1) | DMA_ATTR_DMOD(0) | DMA_ATTR_DSIZE(1);&amp;nbsp;&amp;nbsp; // no circular addressing S&amp;amp;D, 16 bit S&amp;amp;D&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_NBYTES_MLNO&amp;nbsp;&amp;nbsp;&amp;nbsp; = 4;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 2&amp;nbsp; 16bit sample every minor loop&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_SLAST&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; // not needed -- IRQ will set new start&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_DADDR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (dword) &amp;amp;I2S0_TDR0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the FTM Channel 0 duty value&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_DOFF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_CITER_ELINKNO&amp;nbsp; = AUDIO_SIZE;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // total samples&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_DLASTSGA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 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; // no final last adjustment ( does not move )&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_CSR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = DMA_CSR_INTMAJOR_MASK ;&amp;nbsp; // interrupt when done &lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_BITER_ELINKNO&amp;nbsp; = AUDIO_SIZE;&amp;nbsp;&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 chan links, total samples&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; // configure DMA_MUX to trigger DMA channel 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; Set_Dma_Mux();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // moved to start Audio&lt;/P&gt;&lt;P&gt;&amp;nbsp; // DMA_ERQ = DMA_ERQ_ERQ0_MASK ; // now enable chan0 for triggers&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Install DMA0 Major loop complete IRQ &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; NVIC_SetPriority(DMA0_IRQn, AudioDMA_Priority);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; NVIC_EnableIRQ(DMA0_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;&lt;/P&gt;&lt;P&gt;void Init_I2S_Clock(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// note ... for 11.2896 clock&lt;/P&gt;&lt;P&gt;// use system clock ... 120 mhz ... Delta FQ = 17.623 with FS = 205 and DS = 2179&lt;/P&gt;&lt;P&gt;// use Xtal ... 25 mhz --- Delta 40.591 with FS = 89 and DS = 473&lt;/P&gt;&lt;P&gt;// ???? Xtal is more stable than System Clock????&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// I2S_MCR_MICS == 0 --- System Clock -- 120mhz&lt;/P&gt;&lt;P&gt;// I2S_MCR_MICS == 1 --- Xtal --- 25 mhz&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Select input clock 0 and output enable&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2S0_MCR = I2S_MCR_MICS(0) | I2S_MCR_MOE_MASK; // page 167 .. MICS selection&amp;nbsp; ... 0 == SYSTEM CLK!!!! -- 120mhz ... clk divider enabled&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;// reference only ... based on 96 mhz clock&lt;/P&gt;&lt;P&gt;// Divide to get the 11.2896 MHz from 96MHz (96* (2/17))&lt;/P&gt;&lt;P&gt;&amp;nbsp; // I2S0_MDR = I2S_MDR_FRACT(1) | I2S_MDR_DIVIDE(16);&lt;/P&gt;&lt;P&gt;// Divide to get the 12.2880 MHz from 96MHz (96* (16/125))&lt;/P&gt;&lt;P&gt;&amp;nbsp; // I2S0_MDR = I2S_MDR_FRACT(15) | I2S_MDR_DIVIDE(124);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //I2S0_MDR = I2S_MDR_FRACT(205-1) | I2S_MDR_DIVIDE(2179-1); // see above&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S0_MDR = I2S_MDR_FRACT(64-1) | I2S_MDR_DIVIDE(625-1); // gives 12.288(48 KHz * 256) .. multiple of 8khz&lt;/P&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;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void Init_I2S(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; // NOTE ... MUTE pin init earlier and set to 0 (mute)&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // enable system clock to the I2S module&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM_SCGC6 |= SIM_SCGC6_I2S_MASK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Init_I2S_Clock(); // sets up I2S_MCLK&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE_PCR6 |= PORT_PCR_MUX(0x04);&amp;nbsp; // SCLK&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE_PCR12 |= PORT_PCR_MUX(0x04);&amp;nbsp; // BCLK&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE_PCR11 |= PORT_PCR_MUX(0x04);&amp;nbsp; // LR_CLK&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE_PCR10 |= PORT_PCR_MUX(0x04);&amp;nbsp; // Data OUT to codex&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; // turn xmit OFF - return to reset conditions&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S0_TCSR = I2S_TCSR_FR_MASK | I2S_TCSR_SR_MASK; // software reset, fifo reset and Xmit disabled&lt;/P&gt;&lt;P&gt;&amp;nbsp; // wait until off .. if current frame active&lt;/P&gt;&lt;P&gt;&amp;nbsp; while(I2S0_TCSR &amp;amp; I2S_TCSR_TE_MASK)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __asm__ __volatile__ ("nop");&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; // wait until reset is done&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2S0_TCR1&amp;nbsp; = I2S_TCR1_TFW(I2S_FRAME_SIZE*2);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set FIFO watermark .. so frame can load&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// note MSEL = 0 for BUS Clk&lt;/P&gt;&lt;P&gt;// = 1 for MCLK&lt;/P&gt;&lt;P&gt;// MCLK == 11.2896&lt;/P&gt;&lt;P&gt;// BLK divide to get to 44100 ...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// BLK for sample rate of 8khz ...&amp;nbsp; bitclk = 8000 * 16 * 2 = 256000 .. so must divide mclk 12.288mhz / 256000 ... by 48&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2S0_TCR2&amp;nbsp; = I2S_TCR2_SYNC(0) | // use asynchronous mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR2_MSEL(1) |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // use MCLK&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR2_BCP_MASK&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp; // BCLK polarity: Bit clock is active low with drive outputs on falling edge and sample inputs on rising edge.&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR2_BCD_MASK | // BCLK Master out&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR2_DIV(24-1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // divide internal master clock to generate bit clock divide buy (DIV+1)*2&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2S0_TCR3&amp;nbsp; = I2S_TCR3_TCE_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // transmit data channel is enabled&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S0_TCR4&amp;nbsp; = I2S_TCR4_FRSZ(I2S_FRAME_SIZE-1) |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // frame size in words less 1&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR4_SYWD((I2S_FRAME_SIZE*16)-1) |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of bits in frame sync&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR4_MF_MASK | // MSB first&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR4_FSE_MASK |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Frame sync one bit before the frame&lt;/P&gt;&lt;P&gt;&amp;nbsp; // sync polarity HI&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR4_FSD_MASK; // WCLK is generated internally (master mode)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S0_TCR5&amp;nbsp; = I2S_TCR5_W0W(16-1) | // bits per word, first frame&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR5_WNW(16-1) |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // bits per word, nth frame&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCR5_FBT(0x0f);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // index of MSB bit&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S0_TMR = 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; // No word mask&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;} /* end init() */&lt;/P&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;&lt;P&gt;void Start_I2S_Audio(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; AudioMutePIN = 1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_SERQ = DMA_SERQ_SERQ(0) ; // now enable chan0 for triggers&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S0_TCSR = I2S_TCSR_TE_MASK | // enable xmit&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCSR_FR_MASK | // fifo reset&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCSR_DBGE_MASK | // debug enabled&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCSR_BCE_MASK | // bit clock enabled&lt;/P&gt;&lt;P&gt;&amp;nbsp; I2S_TCSR_FRDE_MASK; // fifo watermark - DMA&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;lt;/code&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I any one is knowledgeable in K64 I2S setup, please have a look and tell me where I've gone wrong.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks in advance for any help or comments.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Joe&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Aug 2016 01:00:41 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-I2S-DMA/m-p/559892#M33811</guid>
      <dc:creator>JHinkle</dc:creator>
      <dc:date>2016-08-02T01:00:41Z</dc:date>
    </item>
    <item>
      <title>Re: K64 - I2S + DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-I2S-DMA/m-p/559893#M33812</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm not grasping something about this I2S device.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Why are there 2 TDR registers? (TRD0 and TDR1)&lt;/P&gt;&lt;P&gt;Why are there 2&amp;nbsp; I2S0_TXD pins on the device?&amp;nbsp; (I2S0_TXD0 and I2S0_TXD1)&lt;SPAN style="font-family: HelveticaLTStd-Roman; font-size: 9pt; color: #000000;"&gt;&lt;BR style="text-align: -webkit-auto;" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;I'm only using the TRD0 register and the I2S0_TXD0 pin -- I'm expecting a 2 channel (stereo) output.&amp;nbsp; Is this assumption incorrect?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I tried an experiment to help isolate my issue.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I removed DMA from the picture altogether.&amp;nbsp;&amp;nbsp; I set a loop where the cpu looks at the I2S_TCSR_FRF flag (fifo watermark says load data) and loads a left channel 16 bit value followed by a right channel 16 bit value.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;while(1)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R1 = I2S0_TCSR;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R2 = I2S0_TFR0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(R1 &amp;amp; I2S_TCSR_FRF_MASK)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&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; I2S0_TDR0 = 0xff00;&lt;/P&gt;&lt;P&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; I2S0_TDR0 = 0x8001;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My understanding of how I programmed the I2S was I wanted a frame of 32 bits where the first 16 bits where L channel and the last 16 bits was the R channel.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I captured the I2S0_TFR0 to see what the FIFO pointers are.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm puzzled -- since the I2S_TCSR_FRF_MASK is set (watermark level reached) but the I2S0_TFR0 register shows WFP (write fifo pointer) is 9 and RFP (read fifo pointer) is 1.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="I2S1.png"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/943i10C8904EE4DD978D/image-size/large?v=v2&amp;amp;px=999" role="button" title="I2S1.png" alt="I2S1.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;As you can see by the capture of the I2S0_TXD0 pin -- the I2S device outputs two of the L channel data (0xff00) and none of the R channel data (0x8001).&amp;nbsp; The L/R Frame line is not indicating the frame properly (L/R) .. it shows a continuous L -- which is what is being sent.&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Only 2 samples are xmitted (both L channel value) and then nothing else -- why??&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Can anyone with Kinetis I2S experience please comment?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Joe&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Aug 2016 13:03:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-I2S-DMA/m-p/559893#M33812</guid>
      <dc:creator>JHinkle</dc:creator>
      <dc:date>2016-08-02T13:03:10Z</dc:date>
    </item>
    <item>
      <title>Re: K64 - I2S + DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-I2S-DMA/m-p/559894#M33813</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Found my issue -- solved.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Aug 2016 14:51:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-I2S-DMA/m-p/559894#M33813</guid>
      <dc:creator>JHinkle</dc:creator>
      <dc:date>2016-08-02T14:51:34Z</dc:date>
    </item>
    <item>
      <title>Re: K64 - I2S + DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-I2S-DMA/m-p/559895#M33814</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Well what was the fix?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 May 2018 12:59:57 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-I2S-DMA/m-p/559895#M33814</guid>
      <dc:creator>takmingmarcopan</dc:creator>
      <dc:date>2018-05-29T12:59:57Z</dc:date>
    </item>
  </channel>
</rss>

