<?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 More on K22 and SPI with DMA in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/More-on-K22-and-SPI-with-DMA/m-p/1265372#M60299</link>
    <description>&lt;P&gt;A week or so ago, I posted a simple project with SPI using DMA for a K22FN512VMP12 MCU. &amp;nbsp;I'm trying to get data out of a sensor using the the sensor's WHOAMI register. &amp;nbsp;The transmit was only working once. &amp;nbsp; Here's that&amp;nbsp;&lt;A href="https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA-only-transfers-once/m-p/1260760" target="_self"&gt;thread&lt;/A&gt;. &amp;nbsp;Now I am trying to enable the receive side and again, no interrupts. &amp;nbsp;&lt;/P&gt;&lt;P&gt;This is on custom hardware and it works if I bit-bang the SPI. &amp;nbsp;I'm trying to move to DMA so I can have a faster interrupt driven implementation.&lt;/P&gt;&lt;P&gt;I configured the receive side with another DMA channel, configured it pretty much the same (same number of bytes, etc). &amp;nbsp;The only difference I can see is that the source and destination addresses are different for TX and RX which makes sense. &amp;nbsp;When remove the INTMAJOR bit from the TX and set it on the RX, no interrupts. &amp;nbsp;If I move it back, I get interrupts. &amp;nbsp;Is there something weird/different with RX?&lt;/P&gt;&lt;P&gt;When I set INTMAJOR on the receive side, the SPI module is transmitting. &amp;nbsp;I see clock, data (MISO and MOSI) and chip select with my scope and they look correct to me.&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;P&gt;Here's the code - one file for simplicity.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;/*
 */

#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;

#include "MK22F51212.h"

/*
 * Macros
 */
#define SPI_PUSHR_CTAS_CTAR0		(0x0)

/*
 *
 */
#define EnableInterrupts __asm(" CPSIE i");
#define DisableInterrupts __asm(" CPSID i");

/*
 * Data array - WHOAMI register from sensor
 */
#define SENSOR_FRAME_READ_WHOAMI							(0x40000091)

#define SENSOR_TRANSMIT_READ_WHOAMI_COUNT	(8)

static uint32_t SENSOR_TRANSMIT_READ_WHOAMI[SENSOR_TRANSMIT_READ_WHOAMI_COUNT] =
{
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt; 24) &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt; 16) &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt;   &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI      ) &amp;amp; 0xFF),

	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt; 24) &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt; 16) &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt;   &amp;amp; 0xFF),
	SPI_PUSHR_EOQ_MASK  | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI      ) &amp;amp; 0xFF),
};

uint32_t receive_buffer[128];

/*
 * Transmit
 */
static void spi_transmit_receive(uint32_t* buffer, int count)
{
  SPI0-&amp;gt;MCR = SPI_MCR_PCSIS(0x01) | SPI_MCR_MSTR_MASK | SPI_MCR_HALT_MASK;
  SPI0-&amp;gt;SR  = SPI_SR_EOQF_MASK;

	DMA0-&amp;gt;CR = 0x0;

	// Transmit
	DMAMUX-&amp;gt;CHCFG[0] = DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(15);

	/* Set the Source and destination addresses */
	DMA0-&amp;gt;TCD[0].SADDR = (uint32_t)buffer;
	DMA0-&amp;gt;TCD[0].DADDR = (uint32_t)&amp;amp;SPI0-&amp;gt;PUSHR;

	/* Source source and destination offsets */
	DMA0-&amp;gt;TCD[0].SOFF = sizeof(uint32_t);
	DMA0-&amp;gt;TCD[0].DOFF = 0;

	/* Modulo off and port sizes */
	DMA0-&amp;gt;TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);  // 2 = 32 bits

	/* Transfer size */
	DMA0-&amp;gt;TCD[0].NBYTES_MLNO = 4;

	/* No link channel, transactions */
	DMA0-&amp;gt;TCD[0].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(count);
	DMA0-&amp;gt;TCD[0].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(count);

	/* Adjustment to source and destination addresses */
	DMA0-&amp;gt;TCD[0].SLAST = 0x0;
	DMA0-&amp;gt;TCD[0].DLAST_SGA = 0x0;

#if 0
	DMA0-&amp;gt;TCD[0].CSR = DMA_CSR_DREQ_MASK | DMA_CSR_INTMAJOR_MASK;
#else
	DMA0-&amp;gt;TCD[0].CSR = DMA_CSR_DREQ_MASK;
#endif

	// Receive
	DMAMUX-&amp;gt;CHCFG[1]  = DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(14);

	/* Set the Source and destination addresses */
	DMA0-&amp;gt;TCD[1].SADDR = (uint32_t)&amp;amp;SPI0-&amp;gt;POPR;
	DMA0-&amp;gt;TCD[1].DADDR = (uint32_t)receive_buffer;

	/* Source source and destination offsets */
	DMA0-&amp;gt;TCD[1].SOFF = 0;
	DMA0-&amp;gt;TCD[1].DOFF = sizeof(uint32_t);

	/* Modulo off and port sizes */
	DMA0-&amp;gt;TCD[1].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);  //source and destination size 0 = 8 bits, 2 = 32 bits

	/* Transfer size */
	DMA0-&amp;gt;TCD[1].NBYTES_MLNO = 4;

	/* No link channel, transactions */
	DMA0-&amp;gt;TCD[1].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(count);
	DMA0-&amp;gt;TCD[1].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(count);

	/* Adjustment to source and destination addresses */
	DMA0-&amp;gt;TCD[1].SLAST = 0x0;
	DMA0-&amp;gt;TCD[1].DLAST_SGA = 0x0;

#if 1
	DMA0-&amp;gt;TCD[1].CSR = DMA_CSR_DREQ_MASK | DMA_CSR_INTMAJOR_MASK;
#else
	DMA0-&amp;gt;TCD[1].CSR = DMA_CSR_DREQ_MASK;
#endif

  DMA0-&amp;gt;ERQ = DMA_ERQ_ERQ0_MASK | DMA_ERQ_ERQ1_MASK;

  /*
   * Start the SPI -- now configured for DMA
   */
	SPI0-&amp;gt;RSER |= SPI_RSER_TFFF_RE_MASK | SPI_RSER_TFFF_DIRS_MASK | SPI_RSER_RFDF_RE_MASK | SPI_RSER_RFDF_DIRS_MASK;
	SPI0-&amp;gt;RSER |= SPI_RSER_EOQF_RE_MASK;
	SPI0-&amp;gt;MCR  &amp;amp;= ~SPI_MCR_HALT_MASK;
}

/*
 *
 */
void PIT1_IRQHandler(void)
{
	if (PIT-&amp;gt;CHANNEL[1].TFLG &amp;amp; PIT_TFLG_TIF_MASK)
	{
		spi_transmit_receive(SENSOR_TRANSMIT_READ_WHOAMI, SENSOR_TRANSMIT_READ_WHOAMI_COUNT);

		/* Clear interrupt flag */
		PIT-&amp;gt;CHANNEL[1].TFLG = PIT_TFLG_TIF_MASK;
	}
}

void DMA0_IRQHandler(void)
{
	SPI0_SR   = SPI_SR_EOQF_MASK | SPI_SR_TCF_MASK | SPI_SR_RFDF_MASK | SPI_SR_TFFF_MASK;
	DMA_CINT |= DMA_CINT_CAIR_MASK;
}

void DMA_Error_IRQHandler(void)
{
	__asm("nop");
}


/*
 * 		None
 */
static void pit_init(void)
{
	/* Start PIT module clock */
	SIM-&amp;gt;SCGC6 |= SIM_SCGC6_PIT_MASK;

  // Initialize timer
  PIT-&amp;gt;MCR     				 	= PIT_MCR_FRZ_MASK;
  PIT-&amp;gt;CHANNEL[1].LDVAL = 48000000UL/(2000UL);
  PIT-&amp;gt;CHANNEL[1].TFLG  = PIT_TFLG_TIF_MASK;
  PIT-&amp;gt;CHANNEL[1].TCTRL = PIT_TCTRL_TIE_MASK;

  /* Enable IRQ */
  NVIC_EnableIRQ(PIT1_IRQn);

  PIT-&amp;gt;CHANNEL[1].TCTRL |= PIT_TCTRL_TEN_MASK;
}

/*
 *
 */
static void ports_init(void)
{
	/* Clocking */
	SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK;

	/* Power for sensor */
	PORTC-&amp;gt;PCR[5]	= PORT_PCR_MUX(1);
	PTC-&amp;gt;PDDR = (1 &amp;lt;&amp;lt; 5);
	PTC-&amp;gt;PSOR = (1 &amp;lt;&amp;lt; 5);

	/* Configure SPI ports */
	PORTD-&amp;gt;PCR[0] = PORT_PCR_MUX(2);
	PORTD-&amp;gt;PCR[1] = PORT_PCR_MUX(2);
	PORTD-&amp;gt;PCR[2] = PORT_PCR_MUX(2);
	PORTD-&amp;gt;PCR[3] = PORT_PCR_MUX(2);
}

/*
 *
 */
static void spi_dma_init(void)
{
	/* Clocking */
	SIM-&amp;gt;SCGC6 |= SIM_SCGC6_SPI0_MASK;
	SIM-&amp;gt;SCGC6 |= SIM_SCGC6_DMAMUX_MASK;
	SIM-&amp;gt;SCGC7 |= SIM_SCGC7_DMA_MASK;

	/* Configure SPI */
	SPI0-&amp;gt;MCR = SPI_MCR_HALT_MASK;
	SPI0-&amp;gt;CTAR[0] = SPI_CTAR_FMSZ(7);
	SPI0-&amp;gt;CTAR[1] = SPI_CTAR_FMSZ(7);

	NVIC_EnableIRQ(DMA0_IRQn);
}


/*
 *
 */
int main(void)
{
	EnableInterrupts;

	ports_init();
	spi_dma_init();
	pit_init();

	while (true)
	{
	}
	return 0;
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 20 Apr 2021 20:13:07 GMT</pubDate>
    <dc:creator>JBM</dc:creator>
    <dc:date>2021-04-20T20:13:07Z</dc:date>
    <item>
      <title>More on K22 and SPI with DMA</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/More-on-K22-and-SPI-with-DMA/m-p/1265372#M60299</link>
      <description>&lt;P&gt;A week or so ago, I posted a simple project with SPI using DMA for a K22FN512VMP12 MCU. &amp;nbsp;I'm trying to get data out of a sensor using the the sensor's WHOAMI register. &amp;nbsp;The transmit was only working once. &amp;nbsp; Here's that&amp;nbsp;&lt;A href="https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-and-DMA-only-transfers-once/m-p/1260760" target="_self"&gt;thread&lt;/A&gt;. &amp;nbsp;Now I am trying to enable the receive side and again, no interrupts. &amp;nbsp;&lt;/P&gt;&lt;P&gt;This is on custom hardware and it works if I bit-bang the SPI. &amp;nbsp;I'm trying to move to DMA so I can have a faster interrupt driven implementation.&lt;/P&gt;&lt;P&gt;I configured the receive side with another DMA channel, configured it pretty much the same (same number of bytes, etc). &amp;nbsp;The only difference I can see is that the source and destination addresses are different for TX and RX which makes sense. &amp;nbsp;When remove the INTMAJOR bit from the TX and set it on the RX, no interrupts. &amp;nbsp;If I move it back, I get interrupts. &amp;nbsp;Is there something weird/different with RX?&lt;/P&gt;&lt;P&gt;When I set INTMAJOR on the receive side, the SPI module is transmitting. &amp;nbsp;I see clock, data (MISO and MOSI) and chip select with my scope and they look correct to me.&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;P&gt;Here's the code - one file for simplicity.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;/*
 */

#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;

#include "MK22F51212.h"

/*
 * Macros
 */
#define SPI_PUSHR_CTAS_CTAR0		(0x0)

/*
 *
 */
#define EnableInterrupts __asm(" CPSIE i");
#define DisableInterrupts __asm(" CPSID i");

/*
 * Data array - WHOAMI register from sensor
 */
#define SENSOR_FRAME_READ_WHOAMI							(0x40000091)

#define SENSOR_TRANSMIT_READ_WHOAMI_COUNT	(8)

static uint32_t SENSOR_TRANSMIT_READ_WHOAMI[SENSOR_TRANSMIT_READ_WHOAMI_COUNT] =
{
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt; 24) &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt; 16) &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt;   &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI      ) &amp;amp; 0xFF),

	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt; 24) &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt; 16) &amp;amp; 0xFF),
	SPI_PUSHR_CONT_MASK | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI &amp;gt;&amp;gt;   &amp;amp; 0xFF),
	SPI_PUSHR_EOQ_MASK  | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_PCS(1) | SPI_PUSHR_TXDATA((SENSOR_FRAME_READ_WHOAMI      ) &amp;amp; 0xFF),
};

uint32_t receive_buffer[128];

/*
 * Transmit
 */
static void spi_transmit_receive(uint32_t* buffer, int count)
{
  SPI0-&amp;gt;MCR = SPI_MCR_PCSIS(0x01) | SPI_MCR_MSTR_MASK | SPI_MCR_HALT_MASK;
  SPI0-&amp;gt;SR  = SPI_SR_EOQF_MASK;

	DMA0-&amp;gt;CR = 0x0;

	// Transmit
	DMAMUX-&amp;gt;CHCFG[0] = DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(15);

	/* Set the Source and destination addresses */
	DMA0-&amp;gt;TCD[0].SADDR = (uint32_t)buffer;
	DMA0-&amp;gt;TCD[0].DADDR = (uint32_t)&amp;amp;SPI0-&amp;gt;PUSHR;

	/* Source source and destination offsets */
	DMA0-&amp;gt;TCD[0].SOFF = sizeof(uint32_t);
	DMA0-&amp;gt;TCD[0].DOFF = 0;

	/* Modulo off and port sizes */
	DMA0-&amp;gt;TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);  // 2 = 32 bits

	/* Transfer size */
	DMA0-&amp;gt;TCD[0].NBYTES_MLNO = 4;

	/* No link channel, transactions */
	DMA0-&amp;gt;TCD[0].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(count);
	DMA0-&amp;gt;TCD[0].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(count);

	/* Adjustment to source and destination addresses */
	DMA0-&amp;gt;TCD[0].SLAST = 0x0;
	DMA0-&amp;gt;TCD[0].DLAST_SGA = 0x0;

#if 0
	DMA0-&amp;gt;TCD[0].CSR = DMA_CSR_DREQ_MASK | DMA_CSR_INTMAJOR_MASK;
#else
	DMA0-&amp;gt;TCD[0].CSR = DMA_CSR_DREQ_MASK;
#endif

	// Receive
	DMAMUX-&amp;gt;CHCFG[1]  = DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(14);

	/* Set the Source and destination addresses */
	DMA0-&amp;gt;TCD[1].SADDR = (uint32_t)&amp;amp;SPI0-&amp;gt;POPR;
	DMA0-&amp;gt;TCD[1].DADDR = (uint32_t)receive_buffer;

	/* Source source and destination offsets */
	DMA0-&amp;gt;TCD[1].SOFF = 0;
	DMA0-&amp;gt;TCD[1].DOFF = sizeof(uint32_t);

	/* Modulo off and port sizes */
	DMA0-&amp;gt;TCD[1].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);  //source and destination size 0 = 8 bits, 2 = 32 bits

	/* Transfer size */
	DMA0-&amp;gt;TCD[1].NBYTES_MLNO = 4;

	/* No link channel, transactions */
	DMA0-&amp;gt;TCD[1].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(count);
	DMA0-&amp;gt;TCD[1].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(count);

	/* Adjustment to source and destination addresses */
	DMA0-&amp;gt;TCD[1].SLAST = 0x0;
	DMA0-&amp;gt;TCD[1].DLAST_SGA = 0x0;

#if 1
	DMA0-&amp;gt;TCD[1].CSR = DMA_CSR_DREQ_MASK | DMA_CSR_INTMAJOR_MASK;
#else
	DMA0-&amp;gt;TCD[1].CSR = DMA_CSR_DREQ_MASK;
#endif

  DMA0-&amp;gt;ERQ = DMA_ERQ_ERQ0_MASK | DMA_ERQ_ERQ1_MASK;

  /*
   * Start the SPI -- now configured for DMA
   */
	SPI0-&amp;gt;RSER |= SPI_RSER_TFFF_RE_MASK | SPI_RSER_TFFF_DIRS_MASK | SPI_RSER_RFDF_RE_MASK | SPI_RSER_RFDF_DIRS_MASK;
	SPI0-&amp;gt;RSER |= SPI_RSER_EOQF_RE_MASK;
	SPI0-&amp;gt;MCR  &amp;amp;= ~SPI_MCR_HALT_MASK;
}

/*
 *
 */
void PIT1_IRQHandler(void)
{
	if (PIT-&amp;gt;CHANNEL[1].TFLG &amp;amp; PIT_TFLG_TIF_MASK)
	{
		spi_transmit_receive(SENSOR_TRANSMIT_READ_WHOAMI, SENSOR_TRANSMIT_READ_WHOAMI_COUNT);

		/* Clear interrupt flag */
		PIT-&amp;gt;CHANNEL[1].TFLG = PIT_TFLG_TIF_MASK;
	}
}

void DMA0_IRQHandler(void)
{
	SPI0_SR   = SPI_SR_EOQF_MASK | SPI_SR_TCF_MASK | SPI_SR_RFDF_MASK | SPI_SR_TFFF_MASK;
	DMA_CINT |= DMA_CINT_CAIR_MASK;
}

void DMA_Error_IRQHandler(void)
{
	__asm("nop");
}


/*
 * 		None
 */
static void pit_init(void)
{
	/* Start PIT module clock */
	SIM-&amp;gt;SCGC6 |= SIM_SCGC6_PIT_MASK;

  // Initialize timer
  PIT-&amp;gt;MCR     				 	= PIT_MCR_FRZ_MASK;
  PIT-&amp;gt;CHANNEL[1].LDVAL = 48000000UL/(2000UL);
  PIT-&amp;gt;CHANNEL[1].TFLG  = PIT_TFLG_TIF_MASK;
  PIT-&amp;gt;CHANNEL[1].TCTRL = PIT_TCTRL_TIE_MASK;

  /* Enable IRQ */
  NVIC_EnableIRQ(PIT1_IRQn);

  PIT-&amp;gt;CHANNEL[1].TCTRL |= PIT_TCTRL_TEN_MASK;
}

/*
 *
 */
static void ports_init(void)
{
	/* Clocking */
	SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK;

	/* Power for sensor */
	PORTC-&amp;gt;PCR[5]	= PORT_PCR_MUX(1);
	PTC-&amp;gt;PDDR = (1 &amp;lt;&amp;lt; 5);
	PTC-&amp;gt;PSOR = (1 &amp;lt;&amp;lt; 5);

	/* Configure SPI ports */
	PORTD-&amp;gt;PCR[0] = PORT_PCR_MUX(2);
	PORTD-&amp;gt;PCR[1] = PORT_PCR_MUX(2);
	PORTD-&amp;gt;PCR[2] = PORT_PCR_MUX(2);
	PORTD-&amp;gt;PCR[3] = PORT_PCR_MUX(2);
}

/*
 *
 */
static void spi_dma_init(void)
{
	/* Clocking */
	SIM-&amp;gt;SCGC6 |= SIM_SCGC6_SPI0_MASK;
	SIM-&amp;gt;SCGC6 |= SIM_SCGC6_DMAMUX_MASK;
	SIM-&amp;gt;SCGC7 |= SIM_SCGC7_DMA_MASK;

	/* Configure SPI */
	SPI0-&amp;gt;MCR = SPI_MCR_HALT_MASK;
	SPI0-&amp;gt;CTAR[0] = SPI_CTAR_FMSZ(7);
	SPI0-&amp;gt;CTAR[1] = SPI_CTAR_FMSZ(7);

	NVIC_EnableIRQ(DMA0_IRQn);
}


/*
 *
 */
int main(void)
{
	EnableInterrupts;

	ports_init();
	spi_dma_init();
	pit_init();

	while (true)
	{
	}
	return 0;
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 20 Apr 2021 20:13:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/More-on-K22-and-SPI-with-DMA/m-p/1265372#M60299</guid>
      <dc:creator>JBM</dc:creator>
      <dc:date>2021-04-20T20:13:07Z</dc:date>
    </item>
  </channel>
</rss>

